【vc++精品源码栏目提醒】:本文主要为网学会员提供“【精品】数字图像处理源码5 - 其它资料”,希望对需要【精品】数字图像处理源码5 - 其它资料网友有所帮助,学习一下!
第五章 直方图修正和彩色变换 这一章,我们主要和调色板打交道。
先从最简单的反色讲起。
1. 反色invert 反色就是形成底片效果。
如下图所示,图 2 为图 1 反色后的结果 图 1. 原图 图 2. 图 1 反色后的结果 反色有时是很有用的,比如说,图 1 中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理再打印。
反色的实际含义是将 R,G,B 值反转。
若颜色的量化级别是 256,则新图的 R,G,B值为 255 减去原图的 R,G,B 值。
这里针对的是所有图,包括真彩图,带调色板的彩色图 ,和灰度图。
针对不同种类有不同的处理。
(又称为伪彩色图) 先看看真彩图。
我们知道真彩图不带调色板,每个像素用 3 个字节,表示 R,G,B 三个分量。
所以处理很简单,把反转后的 R,G,B 值写入新图即可。
再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中 的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。
灰度图是一种特殊的伪彩色图,只不过调色板中的 R,G,B 值 都是一样的而已。
所以反转的处理和上面讲的一样。
这里,我想澄清一个概念。
过去我们讲二值图时,一直都说成黑白图。
二值位图一定是黑白的吗?答案是不一定。
我们安装 Windows95 时看到的那幅 setup.bmp 是由蓝色和黑色组成的,但它实际上是二值图。
原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。
所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。
下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。
BOOL InvertHWND hWnd DWORD BufSize LPBITMAPINFOHEADER lpImgData LPSTR lpPtr HLOCAL hTempImgData LPBITMAPINFOHEADER lpTempImgData LPSTR lpTempPtr HDC hDc HFILE hf LONG xy LOGPALETTE pPal HPALETTE hPrevPaletteNULL HLOCAL hPal DWORD i unsigned char RedGreenBlueBufSizebf.bfSize-sizeofBITMAPFILEHEADER //新开缓冲区的大小ifhTempImgDataLocalAllocLHNDBufSizeNULL MessageBoxhWndquotError alloc memoryquotquotError MessagequotMB_OK MB_ICONEXCLAMATION return FALSElpImgDataLPBITMAPINFOHEADERGlobalLockhImgDatalpTempImgDataLPBITMAPINFOHEADERLocalLockhTempImgData//拷贝头信息memcpylpTempImgDatalpImgDataBufSizehDcGetDChWndifNumColors0 //NumColors 不为 0 说明是带调色板的 lpPtrchar lpImgDatasizeofBITMAPINFOHEADER //指向原图数据 lpTempPtrchar lpTempImgDatasizeofBITMAPINFOHEADER //指向新图数据 //为新调色板分配内存 hPalLocalAllocLHNDsizeofLOGPALETTE NumColors sizeofPALETTEENTRY pPal LOGPALETTE LocalLockhPal pPal-gtpalNumEntries WORD NumColors pPal-gtpalVersion 0x300 for i 0 i lt NumColors i Blueunsigned char lpPtr Greenunsigned char lpPtr Redunsigned char lpPtr lpPtr //反转调色板中的颜色,存入新的调色板 pPal-gtpalPalEntryi.peRedBYTE255-Red pPal-gtpalPalEntryi.peGreenBYTE255-Green pPal-gtpalPalEntryi.peBlueBYTE255-Blue pPal-gtpalPalEntryi.peFlags0 lpTempPtrunsigned char255-Blue lpTempPtrunsigned char255-Green lpTempPtrunsigned char255-Red lpTempPtr0 ifhPaletteNULL DeleteObjecthPalette hPaletteCreatePalettepPal //产生新的调色板 LocalUnlockhPal LocalFreehPal ifhPalette hPrevPaletteSelectPalettehDchPaletteFALSE RealizePalettehDc else //不带调色板,说明是真彩色图 fory0yltbi.biHeighty lpPtrchar lpImgDataBufSize-LineBytes-yLineBytes lpTempPtrchar lpTempImgDataBufSize-LineBytes-yLineBytes forx0xltbi.biWidthx Blueunsigned char lpPtr Greenunsigned char lpPtr Redunsigned char lpPtr //反转位图数据中的颜色,存入新的位图数据中 lpTempPtrunsigned char255-Blue