|
void OnFILE256ToGray()
{
// 将256色位图转换成灰度图
CPicturesDoc* pDoc = GetDocument();
LPSTR lpDIB;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
WORD wNumColors;
wNumColors = :: DIBNumColors(lpDIB);
// 判断是否是8-bpp位图
if (wNumColors != 256)
{
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
LPSTR lpDIBBits;
BYTE * lpSrc;
LONG i;
LONG j;
LONG lWidth;
LONG lHeight;
LONG lLineBytes;
LPBITMAPINFO lpbmi;
LPBITMAPCOREINFO lpbmc;
BOOL bWinStyleDIB;
lpbmi = (LPBITMAPINFO)lpDIB;
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 灰度映射表
BYTE bMap[256];
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
// 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
for (i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 计算该颜色对应的灰度值
bMap = (BYTE)(0.299 * lpbmi->bmiColors.rgbRed +
0.587 * lpbmi->bmiColors.rgbGreen +
0.114 * lpbmi->bmiColors.rgbBlue + 0.5);
lpbmi->bmiColors.rgbRed = i;
lpbmi->bmiColors.rgbGreen = i;
lpbmi->bmiColors.rgbBlue = i;
lpbmi->bmiColors.rgbReserved = 0;
}
else
{
// 计算该颜色对应的灰度值
bMap = (BYTE)(0.299 * lpbmc->bmciColors.rgbtRed +
0.587 * lpbmc->bmciColors.rgbtGreen +
0.114 * lpbmc->bmciColors.rgbtBlue + 0.5);
lpbmc->bmciColors.rgbtRed = i;
lpbmc->bmciColors.rgbtGreen = i;
lpbmc->bmciColors.rgbtBlue = i;
}
}
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++)
{
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();
}
[ 本帖最后由 紫龙 于 2007-1-3 11:54 编辑 ]
|