📄 f_decode.cpp
字号:
#include "stdafx.h"
#include "fileapi.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include <time.h>
//#include "io.h"
//#include "bitio.h"
#include "errhand.h"
#include "afispath.h"
#include "huffman.h"
#define DIB_HEADER_MARKER ((WORD) ('M' << 8) | 'B')
extern BOOL ErrorSet;
/* DD1 is the wavelet filter length */
short int DD1;
//#define DD1 11 // 7
/* h1[]g1[] are the wavelet transform filter */
/* hi[]gi[] are the inverse wavelet transform
filter */
extern void I_Q(float *WaveletCoefficient,short int *p,
float QQ[64],float ZZ[64],float C,long wide,long deep);
/*--------------------------------------
PURPOSE : TO PROCESS THE EDGE PIXELS.
FUNCTION: int a(int x,int xs)
--------------------------------------*/
//extern void I_CHANGE_DATA(float *bu,float *img1,float *img2,
// float *img3,float *img4,long wide2,long deep2);
extern int a(int x,int xsize);
void CreateBitmapFile(CString FileName,unsigned char *pc,short int wide,short int deep)
{
CFile cFile;
BOOL bOpen;
char msg[60];
DWORD dw;
RGBQUAD bmiColors[256];
BITMAPINFOHEADER bi;
BITMAPFILEHEADER bf;
short int i,NumColors=256;
BYTE nVal,nInc=0x01;
//填写信息标题
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = wide;
bi.biHeight = deep;
bi.biPlanes = 1;
bi.biBitCount = 8;
bi.biCompression = 0;
bi.biSizeImage = (DWORD)(bi.biWidth+3)/4*4 * bi.biBitCount* bi.biHeight;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dw = bi.biSize + 256 * sizeof(RGBQUAD) + bi.biSizeImage;
//填写文件标题
bf.bfType=DIB_HEADER_MARKER; // "BM"
bf.bfSize=sizeof(BITMAPFILEHEADER)+dw;
bf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);//sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO);
bf.bfReserved1 = 0;
bf.bfReserved2 = 0;
// Generate RGB combinations to fill the palette entries.彩表在此!!!!! 2000.11.2
for (i=NumColors-1, nVal=0; i>=0; --i, nVal+=nInc)
{
bmiColors[i].rgbRed = 255-nVal;
bmiColors[i].rgbGreen = 255-nVal;
bmiColors[i].rgbBlue = 255-nVal;
bmiColors[i].rgbReserved = (BYTE)0;
}
bOpen=cFile.Open(FileName,CFile::modeCreate |CFile::modeWrite);
if(bOpen==0)
{
sprintf(msg,"Can not create file %s!",FileName);
AfxMessageBox(msg);
return ;
}
cFile.Write(&bf, sizeof(BITMAPFILEHEADER));
cFile.Write(&bi, sizeof(BITMAPINFOHEADER));
cFile.Write(&bmiColors, NumColors*sizeof(RGBQUAD));
if(wide%4==0)
cFile.WriteHuge(pc,wide*deep);
else
{
long temp=(wide+3)/4*4-wide;
unsigned char *data;
data=new unsigned char [temp];
for(int i=0;i<temp;i++)
data[i]=0;
for(i=0;i<deep;i++)
{
cFile.WriteHuge(pc,wide);
cFile.WriteHuge(data,temp);
pc=pc+wide;
}
delete data;
}
cFile.Close();
}
static inline int extend_11(int idx, unsigned int len)
{ //(1,1)
// if (idx < 0) idx = -idx;
// idx %= 2*(len-1);
// if ((unsigned int)idx >= len) idx = 2*len-idx-2;
// return(idx);
if(idx<0) idx=-idx;
else if(idx>=len) idx=len*2-idx-4;
return(idx);
}
static inline int extend_12(int idx, unsigned int len)
{
// if (idx < 0) idx = -idx;
// idx %= 2*len-1;
// if ((unsigned int)idx >= len) idx = 2*len-idx-1;
// return(idx);
if(idx<0) idx=-idx;
else if(idx>=len) idx=len*2-idx-2;
return(idx);
}
static inline int extend_21(int idx, unsigned int len)
{
// if (idx < 0) idx = -idx-1;
// idx %= 2*len-1;
// if ((unsigned int )idx >= len) idx = 2*len-idx-2;
// return(idx);
if(idx==-1) idx=1;
else if(idx<=-2) idx=-idx-2;
else if(idx>=len) idx=len*2-idx-4;
return(idx);
}
static inline int extend_22(int idx, unsigned int len)
{
// if (idx < 0) idx = -idx-1;
// idx %= 2*len;
// if ((unsigned int)idx >= len) idx = 2*len-idx-1;
// return(idx);
if(idx==-1) idx=1;
else if(idx<=-2) idx=-idx-2;
else if(idx>=len) idx=len*2-idx-2;
return(idx);
}
void I_CHANGE_DATA(float *bu, float *img1,float *img2,
float *img3,float *img4,long wide2,long deep2)
{
long i,n;
long xLow,yLow,xHigh,yHigh;
xLow=(wide2+1)>>1;
yLow=(deep2+1)>>1;
xHigh=wide2-xLow;
yHigh=deep2-yLow;
for(n=0;n<yLow;n++)
{
for(i=0;i<xLow;i++)
*(bu+n*wide2+i)=*(img1+n*xLow+i);
for(i=xLow;i<wide2;i++)
*(bu+n*wide2+i)= *(img2+n*xHigh+i-xLow);
}
for(n=yLow;n<deep2;n++)
{
for(i=0;i<xLow;i++)
*(bu+n*wide2+i)=*(img3+(n-yLow)*xLow+i);
for(i=xLow;i<wide2;i++)
*(bu+n*wide2+i)=*(img4+(n-yLow)*xHigh+i-xLow);
}
}
void CalculateSubbandLength_8(long xlength,long ylength,long *xSubbandLength,long *ySubbandLength)
{
long xLow,xHigh,yLow,yHigh;
long xxLow,xxHigh,yyLow,yyHigh;
xLow=(xlength+1)>>1;
xHigh=xlength-xLow;
yLow=(ylength+1)>>1;
yHigh=ylength-yLow;
///1-4
xxLow=(xLow+1)>>1;
xxHigh=xLow-xxLow;
yyLow=(yLow+1)>>1;
yyHigh=yLow-yyLow;
xSubbandLength[1]=xxLow;
xSubbandLength[2]=xxHigh;
xSubbandLength[3]=xxLow;
xSubbandLength[4]=xxHigh;
ySubbandLength[1]=yyLow;
ySubbandLength[2]=yyLow;
ySubbandLength[3]=yyHigh;
ySubbandLength[4]=yyHigh;
///5-8
xxLow=(xHigh+1)>>1;
xxHigh=xHigh-xxLow;
yyLow=(yLow+1)>>1;
yyHigh=yLow-yyLow;
xSubbandLength[5]=xxLow;
xSubbandLength[6]=xxHigh;
xSubbandLength[7]=xxLow;
xSubbandLength[8]=xxHigh;
ySubbandLength[5]=yyLow;
ySubbandLength[6]=yyLow;
ySubbandLength[7]=yyHigh;
ySubbandLength[8]=yyHigh;
///9-12
xxLow=(xLow+1)>>1;
xxHigh=xLow-xxLow;
yyLow=(yHigh+1)>>1;
yyHigh=yHigh-yyLow;
xSubbandLength[9]=xxLow;
xSubbandLength[10]=xxHigh;
xSubbandLength[11]=xxLow;
xSubbandLength[12]=xxHigh;
ySubbandLength[9]=yyLow;
ySubbandLength[10]=yyLow;
ySubbandLength[11]=yyHigh;
ySubbandLength[12]=yyHigh;
////13-16
xxLow=(xHigh+1)>>1;
xxHigh=xHigh-xxLow;
yyLow=(yHigh+1)>>1;
yyHigh=yHigh-yyLow;
xSubbandLength[13]=xxLow;
xSubbandLength[14]=xxHigh;
xSubbandLength[15]=xxLow;
xSubbandLength[16]=xxHigh;
ySubbandLength[13]=yyLow;
ySubbandLength[14]=yyLow;
ySubbandLength[15]=yyHigh;
ySubbandLength[16]=yyHigh;
}
/*-----------------------------------------------------------------
PURPOSE :THE INVERSE WAVELET TRANSFORM
------------------------------------------------------------------ */
void iwt(int wide1,int deep1,float *buffert,float h1[],float g1[])
{
long i,j,k,n;
float temp1,temp2;
float *buffer1;
float *buffer2;
int (*extend_h)(int idx,unsigned int len);
int (*extend_g)(int idx,unsigned int len);
long length;
long low,high,lowhalf,highhalf;
length=(wide1>deep1)?(wide1+1):(deep1+1);
if((buffer1=new float [length])==NULL)
{
AfxMessageBox("Allocate memory error");
ErrorSet = TRUE;
return;
}
if((buffer2=new float [length])==NULL)
{
AfxMessageBox("Allocate memory error");
ErrorSet = TRUE;
return;
}
// to filter in the vertical direction
if(deep1%2==0)
{
extend_h=extend_12;
extend_g=extend_21;
}
else
{
extend_h=extend_11;
extend_g=extend_22;
}
lowhalf=(deep1+1)/2;
highhalf=deep1-lowhalf;
low=lowhalf*2;
high=highhalf*2;
for(n=0;n<wide1;n++)
{
for(k=0;k<lowhalf;k++)
{
buffer1[k*2]=*(buffert+(long)(k*wide1+n));
buffer1[k*2+1]=0;
}
for(i=0;i<deep1;i++)
{
temp1=h1[(DD1-1)/2]*buffer1[i];
for(j=1;j<=(DD1-1)/2;j++)
temp1+=h1[j+(DD1-1)/2]*(buffer1[extend_h(i+j,low)]+buffer1[extend_h(i-j,low)]);
buffer2[i]=temp1;
}
for(k=0;k<highhalf;k++)
{
buffer1[k*2]=*(buffert+(long)((k+lowhalf)*wide1+n));
buffer1[k*2+1]=0;
}
for(i=0;i<deep1;i++)
{
temp1=g1[-1+(DD1-1)/2]*buffer1[extend_g(i-1,high)];
for(j=0;j<=(DD1-1)/2-2;j++)
temp1+=g1[j+(DD1-1)/2]*(buffer1[extend_g(i+j,high)]+buffer1[extend_g(i-j-2,high)]);
temp2=temp1+buffer2[i];
buffer2[i]=temp2;
}
for(k=0;k<deep1;k++)
*(buffert+(long)(k*wide1+n))=buffer2[k];
}
// to filter in the horizonal direction
if(wide1%2==0)
{
extend_h=extend_12;
extend_g=extend_21;
}
else
{
extend_h=extend_11;
extend_g=extend_22;
}
lowhalf=(wide1+1)/2;
highhalf=wide1-lowhalf;
low=lowhalf*2;
high=highhalf*2;
for (n=0;n<deep1;n++)
{
for(k=0;k<lowhalf;k++)
{
buffer1[k*2]=*(buffert+(long)(n*wide1+k));
buffer1[k*2+1]=0;
}
for(i=0;i<wide1;i++)
{
temp1=0;
temp1+=h1[(DD1-1)/2]*buffer1[i];
for(j=1;j<=(DD1-1)/2;j++)
temp1+=h1[j+(DD1-1)/2]*(buffer1[extend_h(i+j,low)]+buffer1[extend_h(i-j,low)]);
buffer2[i]=temp1;
}
for(k=0;k<highhalf;k++)
{
buffer1[k*2]=*(buffert+(long)(n*wide1+k+lowhalf));
buffer1[k*2+1]=0;
}
for(i=0;i<wide1;i++)
{
temp1=0;
temp1+=g1[-1+(DD1-1)/2]*buffer1[extend_g(i-1,high)];
for(j=0;j<=(DD1-1)/2;j++)
temp1+=g1[j+(DD1-1)/2]*(buffer1[extend_g(i+j,high)]+buffer1[extend_g(i-j-2,high)]);
temp2=temp1+buffer2[i];
buffer2[i]=temp2;
}
for(k=0;k<wide1;k++)
{
*(buffert+(long)(n*wide1+k))=buffer2[k];
}
}
// free the work buffers
delete buffer1,buffer2;
}
void IW8(float * buffer,long wide1,long deep1,float *im1,float *im2,
float *im3,float *im4,float *im5,float *im6,float *im7,
float *im8,float *im9,float *im10,
float *im11,float *im12,float *im13,float *im14,float *im15,
float *im16,float h1[],float g1[])
{
float *imag1;
float *imag2;
float *imag3;
float *imag4;
HANDLE hpc1;
char * pc1;
long xLow,xHigh,yLow,yHigh;
xLow=(wide1+1)/2;
yLow=(deep1+1)/2;
xHigh=wide1-xLow;
yHigh=deep1-yLow;
if((imag1=new float [xLow*yLow]) == NULL)
{
AfxMessageBox("memory error!");
ErrorSet = TRUE;
return ;
}
if((imag2=new float [xLow*yLow]) == NULL)
{
AfxMessageBox("memory error!");
ErrorSet = TRUE;
return ;
}
if((imag3=new float [xLow*yLow]) == NULL)
{
AfxMessageBox("memory error!");
ErrorSet = TRUE;
return ;
}
if((imag4=new float [xLow*yLow]) == NULL)
{
AfxMessageBox("memory error!");
ErrorSet = TRUE;
return ;
}
I_CHANGE_DATA(imag1,im1,im2,im3,im4,xLow,yLow);
I_CHANGE_DATA(imag2,im5,im6,im7,im8,xHigh,yLow);
I_CHANGE_DATA(imag3,im9,im10,im11,im12,xLow,yHigh);
I_CHANGE_DATA(imag4,im13,im14,im15,im16,xHigh,yHigh);
iwt(xLow,yLow,imag1,h1,g1);
iwt(xHigh,yLow,imag2,h1,g1);
iwt(xLow,yHigh,imag3,h1,g1);
iwt(xHigh,yHigh,imag4,h1,g1);
I_CHANGE_DATA(buffer,imag1,imag2,imag3,imag4,wide1,deep1);
iwt(wide1,deep1,buffer,h1,g1);
delete imag1,imag2,imag3,imag4;
}
/*-----------------------------------------------------------------
DISCRIPTION:Here image is a pointer to image file processed;inname is
the image file name to be processed;wide and deep is the wideth and
the deepth of image;v0 is wavelet transform times;
------------------------------------------------------------------*/
void _GA_Decompress(CString InputFileName, CString OutputFileName)
//void DeCompressFP(DWORD BarCode,BYTE FingerNumber)
{
long wide,deep;
float *im1;float *im2;float *im3;float *im4;float *im5;
float *im6;float *im7;
float *im8;float *im9;float *im10;float *im11;
float *im12;float *im13;float *im14;float *im15;
float *im16;
float h1[21]={0,0,
-0.064538882628938,
-0.040689417609558,
0.41809227322221,
0.78848561640566,
0.41809227322221,
-0.040689417609558,
-0.064538882628938,
0.0,
0
},
g1[21]={
0.037828455506995,
0.023849465019380,
-0.11062440441842,
-0.37740285561265,
0.85269867900940,
-0.37740285561265,
-0.11062440441842,
0.023849465019380,
0.037828455506995,
0,0
};
/*
float g1[DD1]={0.037828,0.023849,-0.110624,-0.377403,0.852699,-0.377403,-0.110624,0.023849,0.037828,0,0},
h1[DD1]={-0.064539,-0.040689,0.418092,0.788486,0.418092,-0.040689,-0.064539,0,0};
*/
long v2;
float M,R;
float C ;
long i;
unsigned char *pc;
float *buf1;
float *buf2;
float *buf3;
float *buffer;
DHuffman *p1=new DHuffman;
short int *Image;
float Q[64],Z[64];
Image=p1->ImageDecoding(InputFileName);
wide=p1->X;
deep=p1->Y;
M=p1->M;
R=p1->R;
C=p1->C;
for(i=0;i<64;i++)
{
Q[i]=p1->Q[i];
Z[i]=p1->Z[i];
}
DD1=((p1->L0>p1->L1)?p1->L0:p1->L1)+2;
for(i=0;i<DD1;i++)
h1[i]=g1[i]=0;
short int n1=(DD1-p1->L1)/2;
for(i=n1;i<=DD1/2;i++)
h1[i]=h1[DD1-i-1]=p1->g[p1->L1/2-(i-n1)];
for(i=0;i<(p1->L0+1)/2;i++)
g1[i]=g1[p1->L0-1-i]=p1->h[p1->L0/2-i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -