📄 行程编码.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 + -