📄 chap05.htm
字号:
"Times New Roman"'>拷贝头信息和位图数据</span></p>
<p style='line-height:18.0pt'><span> </span>memcpy(lpTempImgData,lpImgData,DstBufSize);</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>memcpy(lpTempImgData,(char
*)&DstBi,sizeof(BITMAPINFOHEADER));</p>
<p style='line-height:18.0pt'><span> </span>//lpPtr<span
style='font-family:宋体;"Times New Roman"'>指向原图的数据</span></p>
<p style='line-height:18.0pt'><span> </span>lpPtr=(char
*)lpImgData+sizeof(BITMAPINFOHEADER);</p>
<p style='line-height:18.0pt'><span> </span>//lpTempPtr<span
style='font-family:宋体;"Times New Roman"'>指向新图的数据</span></p>
<p style='line-height:18.0pt'><span> </span>lpTempPtr=(char
*)lpTempImgData+sizeof(BITMAPINFOHEADER);</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>为新的调色板分配内存</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>* 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
lang=EN-US>pPal->palNumEntries =(WORD) NewNumColors;</span></p>
<p style='line-height:18.0pt'><span> </span>pPal->palVersion
= 0x300;</p>
<p style='line-height:18.0pt'><span> </span>if(NumColors==0)
//<span style='font-family:宋体;
"Times New Roman"'>真彩色</span></p>
<p style='line-height:18.0pt'><span>
</span>for (i = 0; i < 256; i++) { //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>灰度从</span><span
lang=EN-US>(0,0,0)</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>到</span><span
lang=EN-US>(255,255,255)</span></p>
<p style='line-height:18.0pt'><span> </span>
pPal->palPalEntry[i].peRed=(BYTE)i;</p>
<p style='line-height:18.0pt'><span>
</span> pPal->palPalEntry[i].peGreen=(BYTE)i;</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peBlue=(BYTE)i;</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peFlags=(BYTE)0;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)i;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)i;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)i;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=0;</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span> </span>else
</p>
<p style='line-height:18.0pt'><span>
</span>for (i = 0; i < NewNumColors; i++) { //<span style='font-family:宋体;
"Times New Roman"'>带调色板的彩色图</span></p>
<p style='line-height:18.0pt'><span>
</span>Blue=(unsigned char )(*lpPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>Green=(unsigned char )(*lpPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>Red=(unsigned char )(*lpPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>Y=(float)(Red*0.299+Green*0.587+Blue*0.114);</p>
<p style='line-height:18.0pt'><span>
</span>Gray=(BYTE)Y;</p>
<p style='line-height:18.0pt'><span>
</span>lpPtr++;</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>从原来的调色板中的颜色计算得到</span><span lang=EN-US>Y</span><span
style='font-family:宋体;"Times New Roman"'>值,写入新的调色板</span></p>
<p style='line-height:18.0pt'><span> </span>
pPal->palPalEntry[i].peRed=Gray;</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peGreen=Gray;</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peBlue=Gray;</p>
<p style='line-height:18.0pt'><span>
</span>pPal->palPalEntry[i].peFlags=0;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)Gray;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)Gray;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)Gray;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=0;</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span> </span>if(hPalette!=NULL)
</p>
<p style='line-height:18.0pt'><span>
</span>DeleteObject(hPalette);</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</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> </span>
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);</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>if(NumColors==0)
//<span style='font-family:宋体;
"Times New Roman"'>真彩色图才需要处理位图数据</span></p>
<p style='line-height:18.0pt'><span>
</span>for(y=0;y<bi.biHeight;y++){</p>
<p style='line-height:18.0pt'><span>
</span>lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);</p>
<p style='line-height:18.0pt'><span>
</span>lpTempPtr=(char*)lpTempImgData+</p>
<p style='line-height:
18.0pt'><span lang=EN-US>(DstBufSize-DstLineBytes-y*DstLineBytes);</span></p>
<p style='line-height:18.0pt'><span>
</span>for(x=0;x<bi.biWidth;x++){</p>
<p style='line-height:18.0pt'><span>
</span>Blue=(unsigned char )(*lpPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>Green=(unsigned char )(*lpPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>Red=(unsigned char )(*lpPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>Y=(float)(Red*0.299+Green*0.587+Blue*0.114);</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>从位图数据计算得到</span><span lang=EN-US>Y</span><span
style='font-family:宋体;"Times New Roman"'>值,写入新图中</span></p>
<p style='line-height:18.0pt'><span>
</span>Gray=(BYTE)Y; </p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)Gray;</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span
lang=EN-US>if(hBitmap!=NULL)</span></p>
<p style='line-height:18.0pt'><span> </span>
DeleteObject(hBitmap);</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
lang=EN-US>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>(LONG)CBM_INIT,</span></p>
<p style='line-height:18.0pt'><span>
</span> (LPSTR)lpTempImgData+</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>NewNumColors*sizeof(RGBQUAD),</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -