1、彩色变为灰色彩色变为灰色:1:建立菜单,消息映射2:编写映射函数void CBianhuanView:OnHuise() /彩色图变为灰度图 /k=1; /k=1用于标记执行过该函数 CBianhuanDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); LPSTR lpDIB; / 指向DIB的指针 LPSTR lpDIBBits; / 指向DIB象素指针 DWORD Wide; / DIB中图像的宽度 DWORD Height; / DIB中图像的高度 lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-GetHObj
2、ect(); Wide=pDoc-GetDibImage()-GetWidth(lpDIB); Height=pDoc-GetDibImage()-GetHeight(lpDIB); lpDIBBits = pDoc-GetDibImage()-GetBits(lpDIB); pDoc-GetDibImage()-Huise( lpDIBBits, Wide, Height); :GlobalUnlock(HGLOBAL) pDoc-GetHObject(); pDoc-UpdateAllViews(NULL); /更新视图 EndWaitCursor();实现以上函数,需要以下准备:(1)
3、BianhuanDoc.h中增加成员变量: protected: HGLOBAL m_hDIB; CDib* m_pDibImage;/新增加的!(2) BianhuanDoc.h中增加成员函数AHGLOBAL GetHObject() const /获取Dib对象的句柄 return m_hDIB; B CDib* GetDibImage() const/新增加的! return m_pDibImage; (3) Dib.h中增加成员函数: A.LPSTR GetBits(LPSTR); /取得位图数据的入口地址 B.WORD GetPalSize(LPSTR); /取得调色板的大小 C.
4、WORD GetColorNum(LPSTR); /取得位图包含的颜色数目(4) Dib.cpp中 A.LPSTR CDib:GetBits(LPSTR lpdib) return (lpdib + (LPBITMAPINFOHEADER)lpdib)-biSize+GetPalSize(lpdib);/ return (lpdib + *(LPDWORD)lpdib+GetPalSize(lpdib); B.WORD CDib:GetPalSize(LPSTR lpdib) return (WORD)(GetColorNum(lpdib) * sizeof(RGBQUAD);/ 计算DIB中
5、调色板的大小CWORD CDib:GetColorNum(LPSTR lpdib) long dwClrUsed = (LPBITMAPINFOHEADER)lpdib)-biClrUsed; / 读取dwClrUsed值 if (dwClrUsed != 0) return (WORD)dwClrUsed;/ 如果dwClrUsed不为0,直接返回该值 WORD wBitCount = (LPBITMAPINFOHEADER)lpdib)-biBitCount;/ 读取biBitCount值 switch (wBitCount)/ 按照像素的位数计算颜色数目 case 1: return 2
6、; case 4: return 16; case 8: return 256; default: return 0;(5) 编写灰色函数void CDib:Huise(LPSTR lpDIBBits,LONG lWidth, LONG lHeight) int i,j; LONG lLineBytes; / unsigned char* lpSrc; lLineBytes = WIDTHBYTES(lWidth * 8); for(i = 0; i lHeight; i+) /逐列扫描 for(j = 0; j 1000#pragma once#endif / _MSC_VER 1000 #
7、define PalVersion 0x300 / 调色板版本/ DIB常量#define WIDTHBYTES(bits) (bits) + 31) / 32 * 4) /自己新增加的!class CDib : public CObject public: CDib(); virtual CDib();/operationspublic: / 用于操作DIB的函数声明 BOOL DrawDib(HDC, LPRECT,HGLOBAL, LPRECT,CPalette*);/显示位图 BOOL ConstructPalette(HGLOBAL,CPalette* ); /构造逻辑调色板 LPS
8、TR GetBits(LPSTR); /取得位图数据的入口地址 DWORD GetWidth(LPSTR); /取得位图的宽度 DWORD GetHeight(LPSTR); /取得位图的高度 WORD GetPalSize(LPSTR); /取得调色板的大小 WORD GetColorNum(LPSTR); /取得位图包含的颜色数目 WORD GetBitCount(LPSTR); /取得位图的颜色深度 HGLOBAL CopyObject(HGLOBAL); /用于复制位图对象 BOOL CreateDIBPalette(HGLOBAL hDib, CPalette* pPal); /增加
9、此函数! void Huise(LPSTR lpDIBBits,LONG lWidth, LONG lHeight); /增加此函数原型 BOOL SaveFile(HGLOBAL , CFile&); /存储位图为文件 HGLOBAL LoadFile(CFile&); /从文件中加载位图/ 在对图象进行处理时,针对位图的字节宽度必须是4的倍数的这一要求,/ 我们设计了函数GetRequireWidth,来处理这种比较特殊的情况 int GetReqByteWidth(int ); /转换后的字节数GetRequireByteWidth long GetRectWidth(LPCRECT )
10、; /取得区域的宽度 long GetRectHeight(LPCRECT); /取得区域的高度public: void ClearMemory(); void InitMembers();public: BOOL Ruihua(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, int iTempH, int iTempW, int iTempMX, int iTempMY,FLOAT * fpArray, FLOAT fCoef); LPBITMAPINFO lpbminfo; / 指向BITMAPINFO结构的指针 LPBITMAPINFOHEADER
11、 lpbmihrd; /指向BITMAPINFOHEADER结构的指针 BITMAPFILEHEADER bmfHeader; /BITMAPFILEHEADER结构 LPSTR lpdib; /指向DIB的指针 LPSTR lpDIBBits; / DIB像素指针 DWORD dwDIBSize; /DIB大小 HGLOBAL m_hDib;/DIB对象的句柄 RGBQUAD* lpRgbQuag;/指向颜色表的指针;#endif / !defined(AFX_DIB_H_AC952C3A_9B6B_4319_8D6E_E7F509348A88_INCLUDED_)!下面是Dib.cpp/
12、MyDib.cpp: implementation of the CDib class.#include stdafx.h#include Dib.h#include #ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/* * Dib文件头标志(字符串BM) */#define DIB_MARKER (WORD) (M m_hObject; hOldPal = :SelectPalette(hDC, hPal, TRUE); :SetStretchBltMode(hDC, C
13、OLORONCOLOR);/ 设置显示模式 bSuccess = :StretchDIBits(hDC, / 设备环境句柄 lpDCRect-left, /目标X坐标 lpDCRect-top, / 目标Y坐标 GetRectWidth(lpDCRect), / 目标宽度 GetRectHeight(lpDCRect), / 目标高度 lpDIBRect-left, / 源X坐标 lpDIBRect-top, / 源Y坐标 GetRectWidth(lpDIBRect), / 源宽度 GetRectHeight(lpDIBRect), / 源高度 lpDIBBits, / 指向dib像素的指针
14、 (LPBITMAPINFO)lpdib, / 指向位图信息结构的指针 DIB_RGB_COLORS, / 使用的颜色数目 SRCCOPY); / 光栅操作类型 :GlobalUnlock(hDIB); / 解除锁定 if (hOldPal != NULL)/ 恢复系统调色板 :SelectPalette(hDC, hOldPal, TRUE); return bSuccess; /*函数名称: 增加此函数! * CreateDIBPalette() * 参数: * HDIB hDIB - 指向DIB对象的指针 * CPalette* pPal - 指向DIB对象调色板的指针 * 返回值: *
15、 BOOL - 创建成功返回TRUE,否则返回FALSE。 * 说明: * 该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中, * 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样 * 可以用最好的颜色来显示DIB图像。 */BOOL CDib:CreateDIBPalette(HGLOBAL hDib, CPalette* pPal) LPLOGPALETTE lpPal; / 指向逻辑调色板的指针 HANDLE hLogPal; / 逻辑调色板的句柄 HPALETTE hPal = NULL; / 调色板的句柄 int i; / 循环变量 WORD
16、wNumColors; / 颜色表中的颜色数目 LPSTR lpbi; / 指向DIB的指针 LPBITMAPINFO lpbmi; / 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPCOREINFO lpbmc; / 指向BITMAPCOREINFO结构的指针 BOOL bWinStyleDIB; / 表明是否是Win3.0 DIB的标记 BOOL bResult = FALSE; / 创建结果 if (hDib = NULL) return FALSE; lpbi = (LPSTR) :GlobalLock(HGLOBAL) hDib); / 锁定DIB lpbmi
17、= (LPBITMAPINFO)lpbi; / 获取指向BITMAPINFO结构的指针(Win3.0) lpbmc = (LPBITMAPCOREINFO)lpbi; / 获取指向BITMAPCOREINFO结构的指针 wNumColors = GetColorNum(lpbi);/ 获取DIB中颜色表中的颜色数目 if (wNumColors != 0) / 分配为逻辑调色板内存 hLogPal = :GlobalAlloc(GHND, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * wNumColors); / 如果内存不足,退出 if (hLogP
18、al = 0) :GlobalUnlock(HGLOBAL) hDib); / 解除锁定 return FALSE; lpPal = (LPLOGPALETTE) :GlobalLock(HGLOBAL) hLogPal); / lpPal-palVersion = PALVERSION; / 设置版本号 lpPal-palNumEntries = (WORD)wNumColors;/ 设置颜色数目 / bWinStyleDIB = IS_WIN30_DIB(lpbi); / 判断是否是WIN3.0的DIB / 读取调色板 for (i = 0; i palPalEntryi.peRed =
19、lpbmi-bmiColorsi.rgbRed; lpPal-palPalEntryi.peGreen = lpbmi-bmiColorsi.rgbGreen; lpPal-palPalEntryi.peBlue = lpbmi-bmiColorsi.rgbBlue; / 保留位 lpPal-palPalEntryi.peFlags = 0; else / 读取红色绿色蓝色分量 lpPal-palPalEntryi.peRed = lpbmc-bmciColorsi.rgbtRed; lpPal-palPalEntryi.peGreen = lpbmc-bmciColorsi.rgbtGree
20、n; lpPal-palPalEntryi.peBlue = lpbmc-bmciColorsi.rgbtBlue; / 保留位 lpPal-palPalEntryi.peFlags = 0; bResult = pPal-CreatePalette(lpPal);/ 按照逻辑调色板创建调色板,并返回指针 :GlobalUnlock(HGLOBAL) hLogPal); / 解除锁定 :GlobalFree(HGLOBAL) hLogPal); / 释放逻辑调色板 :GlobalUnlock(HGLOBAL) hDib); / 解除锁定 return bResult;/* * 函数名称:Con
21、structPalette(HGLOBAL hDIB, CPalette* pPal) * 函数参数: * HGLOBAL hDIB,DIB对象的句柄 * CPalette* pPal,调色板的指针 * 函数类型:BOOL * 函数说明:该函数按照DIB创建一个逻辑调色板 */BOOL CDib:ConstructPalette(HGLOBAL hDIB, CPalette* pPal) HANDLE hLogPal;/ 逻辑调色板的句柄 int iLoop;/ 循环变量 BOOL bSuccess = FALSE;/ 创建结果 if (hDIB = NULL)/判断是否是有效的DIB对象 r
22、eturn FALSE;/ 返回FALSE lpdib = (LPSTR) :GlobalLock(HGLOBAL) hDIB);/ 锁定DIB lpbminfo= (LPBITMAPINFO)lpdib; long wNumColors =GetColorNum(lpdib);/ 获取DIB中颜色表中的颜色数目 if (wNumColors != 0) hLogPal = :GlobalAlloc(GHND, sizeof(LOGPALETTE)/ 分配为逻辑调色板内存 + sizeof(PALETTEENTRY) * wNumColors); if (hLogPal = 0)/ 如果失败则
23、退出 :GlobalUnlock(HGLOBAL) hDIB);/ 解除锁定 return FALSE; LPLOGPALETTE lpPal = (LPLOGPALETTE) :GlobalLock(HGLOBAL) hLogPal); lpPal-palVersion = PalVersion;/ 设置调色板版本号 lpPal-palNumEntries = (WORD)wNumColors;/ 设置颜色数目 for (iLoop=0; iLooppalPalEntryiLoop.peRed =lpbminfo-bmiColorsiLoop.rgbRed;/ 读取三原色分量 lpPal-palPalEntryiLoop.peGreen =lpbminfo-