📄 chap09.htm
字号:
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"File c:\\test.pcx not found!","Error
Message",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE;</span></p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>读出头信息</span></p>
<p style='line-height:18.0pt'><span> </span> fread((char*)&header,1,sizeof(PCXHEAD),PCXfp);</p>
<p style='line-height:18.0pt'><span> </span> if(header.manufacturer!=0x0a){
//<span style='font-family:宋体;
"Times New Roman"'>不是一个合法的</span><span lang=EN-US>PCX</span><span
style='font-family:宋体;"Times New Roman"'>文件</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Not a valid Pcx file!","Error
Message",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>fclose(PCXfp);</span></p>
<p style='line-height:18.0pt'><span> </span>
return FALSE;</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>将文件指针指向调色板开始处</span></p>
<p style='line-height:18.0pt'><span> </span>fseek(PCXfp,-769L,SEEK_END);</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>获取颜色数信息</span></p>
<p style='line-height:18.0pt'><span> </span>PcxTag=fgetc(PCXfp)&0xff;</p>
<p style='line-height:18.0pt'><span> </span>if(PcxTag!=12){
//<span style='font-family:宋体;
"Times New Roman"'>非</span><span lang=EN-US>256</span><span
style='font-family:宋体;"Times New Roman"'>色,返回</span></p>
<p style='line-height:18.0pt'><span> </span>
MessageBox(hWnd,"Not a 256 colors Pcx file!","Error Message",</p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>fclose(PCXfp);</span></p>
<p style='line-height:18.0pt'><span>
</span>return FALSE;</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>创建新的</span><span lang=EN-US>BITMAPFILEHEADER</span><span
style='font-family:宋体;"Times New Roman"'>和</span><span lang=EN-US>BITMAPINFOHEADER</span></p>
<p style='line-height:18.0pt'><span> </span>memset((char
*)&bf,0,sizeof(BITMAPFILEHEADER)); </p>
<p style='line-height:18.0pt'><span> </span>memset((char
*)&bi,0,sizeof(BITMAPINFOHEADER));</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>填写</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>头信息</span></p>
<p style='line-height:18.0pt'><span> </span>bi.biSize=sizeof(BITMAPINFOHEADER);</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>得到图象的宽和高</span></p>
<p style='line-height:18.0pt'><span> </span>bi.biWidth=header.xmax-header.xmin+1;</p>
<p style='line-height:18.0pt'><span> </span>bi.biHeight=header.ymax-header.ymin+1;</p>
<p style='line-height:18.0pt'><span> </span>bi.biPlanes=1;</p>
<p style='line-height:18.0pt'><span> </span>bi.biBitCount=8;</p>
<p style='line-height:18.0pt'><span> </span>bi.biCompression=BI_RGB;</p>
<p style='line-height:18.0pt'><span> </span>ImgWidth=bi.biWidth;</p>
<p style='line-height:18.0pt'><span> </span>ImgHeight=bi.biHeight;</p>
<p style='line-height:18.0pt'><span> </span>NumColors=256;</p>
<p style='line-height:18.0pt'><span> </span>LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);</p>
<p style='line-height:18.0pt'><span> </span>ImgSize=(DWORD)LineBytes*bi.biHeight;</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>填写</span><span lang=EN-US>BITMAPFILEHEADER</span><span
style='font-family:宋体;"Times New Roman"'>头信息</span></p>
<p style='line-height:18.0pt'><span> </span>bf.bfType=0x4d42;</p>
<p style='line-height:18.0pt'><span> </span>bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+</p>
<p style='line-height:
18.0pt'><span lang=EN-US>NumColors*sizeof(RGBQUAD)+ImgSize;</span></p>
<p style='line-height:18.0pt'><span> </span>bf.bfOffBits=(DWORD)(NumColors*sizeof(RGBQUAD)+</p>
<p style='line-height:
18.0pt'><span lang=EN-US>sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));</span></p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>为新图分配缓冲区</span></p>
<p style='line-height:18.0pt'><span> </span>if((hImgData=GlobalAlloc(GHND,(DWORD)</p>
<p style='line-height:18.0pt'><span
lang=EN-US>(sizeof(BITMAPINFOHEADER)+</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)</span></p>
<p style='line-height:18.0pt'><span> </span>{</p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Error alloc memory!","ErrorMessage",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:18.0pt'><span> </span>
fclose(PCXfp);</p>
<p style='line-height:18.0pt'><span>
</span>return FALSE;</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>拷贝头信息</span></p>
<p style='line-height:18.0pt'><span> </span>memcpy(lpImgData,(char
*)&bi,sizeof(BITMAPINFOHEADER));</p>
<p style='line-height:18.0pt'><span> </span>lpPtr=(char
*)lpImgData+sizeof(BITMAPINFOHEADER);</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>为</span><span lang=EN-US>256</span><span style='font-family:
宋体;"Times New Roman"'>色调色板分配内存</span></p>
<p style='line-height:18.0pt'><span> </span> hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+</p>
<p style='line-height:
18.0pt'><span lang=EN-US>NumColors* sizeof(PALETTEENTRY));</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>pPal =(LOGPALETTE *)LocalLock(hPal);</span></p>
<p style='line-height:18.0pt'><span> </span> pPal->palNumEntries
=256;</p>
<p style='line-height:18.0pt'><span> </span>pPal->palVersion
= 0x300;</p>
<p style='line-height:18.0pt'><span> </span>for
(i = 0; i < 256; i++) {</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>读取调色板中的</span><span lang=EN-US>RGB</span><span
style='font-family:宋体;"Times New Roman"'>值</span></p>
<p style='line-height:18.0pt'><span> </span>
pPal->palPalEntry[i].peRed=(BYTE)fgetc(PCXfp);</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peGreen=(BYTE)fgetc(PCXfp);</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peBlue=(BYTE)fgetc(PCXfp);</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peFlags=(BYTE)0;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peBlue;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peGreen;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peRed;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpPtr++)=0;</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>产生新的逻辑调色板</span></p>
<p style='line-height:18.0pt'><span> </span>hPalette=CreatePalette(pPal);</p>
<p style='line-height:18.0pt'><span> </span>LocalUnlock(hPal);</p>
<p style='line-height:18.0pt'><span> </span>LocalFree(hPal);</p>
<p style='line-height:18.0pt'><span> </span>hDc=GetDC(hWnd);</p>
<p style='line-height:18.0pt'><span> </span>if(hPalette){</p>
<p style='line-height:
18.0pt'><span lang=EN-US>hPrevPalette=SelectPalette(hDc,hPalette,FALSE);</span></p>
<p style='line-height:18.0pt'><span>
</span>RealizePalette(hDc);</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>解码行所占的字节数</span></p>
<p style='line-height:18.0pt'><span> </span>PcxBytesPerLine=(unsigned
int)header.bytes_per_line;</p>
<p style='line-height:18.0pt'><span> </span>//<span
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -