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

📄 行程编码.cpp

📁 里面包括: 哈夫曼编码
💻 CPP
字号:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#include <string.h>
typedef char WORD;
typedef char BOOL;
typedef struct{

               char manufacturer;

               char version;

               char encoding;

               char bits_per_pixel;

               WORD xmin,ymin;

               WORD xmax,ymax;

               WORD hres;

               WORD vres;

               char palette[48];

               char reserved;

               char colour_planes;

               WORD bytes_per_line;

               WORD palette_type;

               char filler[58];

      } PCXHEAD;

unsigned int    PcxBytesPerLine;

BOOL LoadPcxFile (HWND hWnd,char *PcxFileName)
{

       FILE   *PCXfp;

       PCXHEAD    header;

     LOGPALETTE   *pPal;

     HPALETTE                         hPrevPalette; 

     HDC                              hDc;

       HLOCAL                          hPal;

       DWORD                              ImgSize;

       DWORD                    OffBits,BufSize;

       LPBITMAPINFOHEADER    lpImgData;     

       DWORD                   i;

       LONG                             x,y;

       int                           PcxTag;

       unsigned char                         LineBuffer[6400];

       LPSTR                            lpPtr;

       HFILE                     hfbmp;

if((PCXfp=fopen(PcxFileName,"rb"))==NULL){ //文件没有找到

MessageBox(hWnd,"File c:\\test.pcx not found!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE;

       }

       //读出头信息

     fread((char*)&header,1,sizeof(PCXHEAD),PCXfp);

     if(header.manufacturer!=0x0a){ //不是一个合法的PCX文件

MessageBox(hWnd,"Not a valid Pcx file!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

fclose(PCXfp);

           return FALSE;

       }

       //将文件指针指向调色板开始处

       fseek(PCXfp,-769L,SEEK_END);

       //获取颜色数信息

       PcxTag=fgetc(PCXfp)&0xff;

       if(PcxTag!=12){ //非256色,返回

           MessageBox(hWnd,"Not a 256 colors Pcx file!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

fclose(PCXfp);

              return FALSE;

       }

//创建新的BITMAPFILEHEADER和BITMAPINFOHEADER

       memset((char *)&bf,0,sizeof(BITMAPFILEHEADER));     

       memset((char *)&bi,0,sizeof(BITMAPINFOHEADER));

       //填写BITMAPINFOHEADER头信息

       bi.biSize=sizeof(BITMAPINFOHEADER);

       //得到图象的宽和高

       bi.biWidth=header.xmax-header.xmin+1;

       bi.biHeight=header.ymax-header.ymin+1;

       bi.biPlanes=1;

       bi.biBitCount=8;

       bi.biCompression=BI_RGB;

       ImgWidth=bi.biWidth;

       ImgHeight=bi.biHeight;

       NumColors=256;

       LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);

       ImgSize=(DWORD)LineBytes*bi.biHeight;

       //填写BITMAPFILEHEADER头信息

       bf.bfType=0x4d42;

       bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD)+ImgSize;

       bf.bfOffBits=(DWORD)(NumColors*sizeof(RGBQUAD)+

sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));

       //为新图分配缓冲区

       if((hImgData=GlobalAlloc(GHND,(DWORD)

(sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)

       {

MessageBox(hWnd,"Error alloc memory!","ErrorMessage",

MB_OK|MB_ICONEXCLAMATION);

           fclose(PCXfp);

              return FALSE;

       }

       lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); 

       //拷贝头信息

       memcpy(lpImgData,(char *)&bi,sizeof(BITMAPINFOHEADER));

       lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);

       //为256色调色板分配内存

     hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+

NumColors* sizeof(PALETTEENTRY));

pPal =(LOGPALETTE *)LocalLock(hPal);

     pPal->palNumEntries =256;

       pPal->palVersion = 0x300;

       for (i = 0; i < 256; i++) {

              //读取调色板中的RGB值

            pPal->palPalEntry[i].peRed=(BYTE)fgetc(PCXfp);

              pPal->palPalEntry[i].peGreen=(BYTE)fgetc(PCXfp);

              pPal->palPalEntry[i].peBlue=(BYTE)fgetc(PCXfp);

              pPal->palPalEntry[i].peFlags=(BYTE)0;

              *(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peBlue;

              *(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peGreen;

              *(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peRed;

              *(lpPtr++)=0;

       }

       //产生新的逻辑调色板

       hPalette=CreatePalette(pPal);

       LocalUnlock(hPal);

       LocalFree(hPal);

       hDc=GetDC(hWnd);

       if(hPalette){

hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

              RealizePalette(hDc);

       }

       //解码行所占的字节数

       PcxBytesPerLine=(unsigned int)header.bytes_per_line;

       //将文件指针指向图象数据的开始处

       fseek(PCXfp,(LONG)sizeof(PCXHEAD),SEEK_SET);

       //缓冲区大小

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//BufSize为缓冲区大小

       BufSize=OffBits+bi.biHeight*LineBytes;

       for(y=0;y<bi.biHeight;y++){

              //指向新图中相应的位置

              lpPtr=(char *)lpImgData+BufSize-LineBytes-y*LineBytes;

              //解码该行,放在数组LineBuffer中

              ReadPcxLine(LineBuffer,PCXfp);

              for(x=0;x<bi.biWidth;x++)

                     *(lpPtr++)=LineBuffer[x]; //将该行存储到位图数据中

       }

       //创建新的位图

       hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,

(LONG)CBM_INIT,

(LPSTR)lpImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpImgData,

DIB_RGB_COLORS);

       if(hPalette && hPrevPalette){

              SelectPalette(hDc,hPrevPalette,FALSE);

              RealizePalette(hDc);

       }

       hfbmp=_lcreat("c:\\pcx2bmp.bmp",0);

       _lwrite(hfbmp,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 

       _lwrite(hfbmp,(LPSTR)lpImgData,BufSize);

       _lclose(hfbmp);

       fclose(PCXfp); 

       //释放内存和资源

       ReleaseDC(hWnd,hDc);

       GlobalUnlock(hImgData);

       return TRUE; 

}

//对每一行进行解码,结果存储到指针p指向的内存中

void ReadPcxLine(unsigned char *p,FILE *fp)

{

       unsigned int   n=0,i;

       char                     c;

       memset(p,0,PcxBytesPerLine);

       do{

              //读出一个字节

              c=fgetc(fp)&0xff;

if((c&0xc0)==0xc0){ //是个形成字节

//i为c的低六位

i=c&0x3f;

                     //下一个字节为实际的图象数据

                     c=fgetc(fp);

                     while(i--) p[n++]=c; //填充连续的i个字节到p中

              }

              else p[n++]=c; //否则是实际的图象数据,直接填入到p中

       }while (n<PcxBytesPerLine); //共读取PcxBytesPerLine个字节

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -