⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_decode.cpp

📁 基于块方向的图像无损压缩代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -