大家看看这样读取对吗?
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
/ 指向DIB象素指针
LPSTR lpDIBBits;
// 指向DIB象素的指针
BYTE * lpSrc;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFO lpbmi;
// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREINFO lpbmc;
// 表明是否是Win3.0 DIB的标记
BOOL bWinStyleDIB;
WORD wNumColors;
wNumColors = ::DIBNumColors(lpDIB);
// 判断是否是8-bpp位图
if (wNumColors != 256)
{
// 提示用户
MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 获取指向BITMAPINFO结构的指针(Win3.0)
lpbmi = (LPBITMAPINFO)lpDIB;
// 获取指向BITMAPCOREINFO结构的指针
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 判断是否是WIN3.0的DIB
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
for (int i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 计算该颜色对应的灰度值
r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
}
else
{
r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
}
}
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
/ 指向DIB象素指针
LPSTR lpDIBBits;
// 指向DIB象素的指针
BYTE * lpSrc;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFO lpbmi;
// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREINFO lpbmc;
// 表明是否是Win3.0 DIB的标记
BOOL bWinStyleDIB;
WORD wNumColors;
wNumColors = ::DIBNumColors(lpDIB);
// 判断是否是8-bpp位图
if (wNumColors != 256)
{
// 提示用户
MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 获取指向BITMAPINFO结构的指针(Win3.0)
lpbmi = (LPBITMAPINFO)lpDIB;
// 获取指向BITMAPCOREINFO结构的指针
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 判断是否是WIN3.0的DIB
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
for (int i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 计算该颜色对应的灰度值
r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
}
else
{
r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
}
}
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
}
else
{
r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);这两个有什么区别!如果是读取对应的RGB值,应该是对的!// 计算该颜色对应的灰度值
这个的话就不对了,应该有一个公式得出对应的灰度值的~
{
// 将256色位图转换成灰度图
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 颜色表中的颜色数目
WORD wNumColors;
// 获取DIB中颜色表中的颜色数目
wNumColors = ::DIBNumColors(lpDIB);
// 判断是否是8-bpp位图
if (wNumColors != 256)
{
// 提示用户
MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 指向DIB象素指针
LPSTR lpDIBBits;
// 指向DIB象素的指针
BYTE * lpSrc;
// 循环变量
LONG i;
LONG j;
// 图像宽度
LONG lWidth;
// 图像高度
LONG lHeight;
// 图像每行的字节数
LONG lLineBytes;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFO lpbmi;
// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREINFO lpbmc;
// 表明是否是Win3.0 DIB的标记
BOOL bWinStyleDIB;
// 获取指向BITMAPINFO结构的指针(Win3.0)
lpbmi = (LPBITMAPINFO)lpDIB;
// 获取指向BITMAPCOREINFO结构的指针
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 灰度映射表
BYTE bMap[256];
// 判断是否是WIN3.0的DIB
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
// 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
for (i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 计算该颜色对应的灰度值
bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
0.587 * lpbmi->bmiColors[i].rgbGreen +
0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);
// 更新DIB调色板红色分量
lpbmi->bmiColors[i].rgbRed = i;
// 更新DIB调色板绿色分量
lpbmi->bmiColors[i].rgbGreen = i;
// 更新DIB调色板蓝色分量
lpbmi->bmiColors[i].rgbBlue = i;
// 更新DIB调色板保留位
lpbmi->bmiColors[i].rgbReserved = 0;
}
else
{
// 计算该颜色对应的灰度值
bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed +
0.587 * lpbmc->bmciColors[i].rgbtGreen +
0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);
// 更新DIB调色板红色分量
lpbmc->bmciColors[i].rgbtRed = i;
// 更新DIB调色板绿色分量
lpbmc->bmciColors[i].rgbtGreen = i;
// 更新DIB调色板蓝色分量
lpbmc->bmciColors[i].rgbtBlue = i;
}
} // 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 获取图像宽度
lWidth = ::DIBWidth(lpDIB);
// 获取图像高度
lHeight = ::DIBHeight(lpDIB);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
// 每行
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
// 指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 变换
*lpSrc = bMap[*lpSrc];
}
}
// 替换当前调色板为灰度调色板
pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[0]);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 实现新的调色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标
EndWaitCursor();
}