如何将真彩色转换为256色彩色图片?
不好意思,上午问过这个问题,wangmuzi小哥给我提供的是转换为256色灰度图像的代码,小生需要的是256色彩色图片,或许二者有相通之处,可是小生天生愚笨,不知道该如何修改,还望高人指点:(附代码)
BOOL WINAPI TruecolorTo256(LPSTR lpDIB, LONG lWidth, LONG lHeight)
{
LONG i;
LONG j;
LPSTR lpDIBBits;
LPSTR lpTemplateDIBBits;
BYTE * lpSrc;
BYTE * lpDst;
//ͼÏñÿÐеÄ×Ö½ÚÊý
LONG lSrcLineBytes;
LONG lDstLineBytes;
//Ö¸ÏòDIBµÄÖ¸Õë
LPSTR lpTemplateDIB;
HLOCAL hTemplateDIB;
//Ö¸ÏòBITMAPINFOHEADERµÄÖ¸Õë
LPBITMAPINFOHEADER lpBIH;
//Ö¸ÏòBITMAPINFOµÄÖ¸Õë
LPBITMAPINFO lpBI;
//¼ÆËãת»»Ç°DIB³¤¶È
DWORD dwSrcDIBSize = sizeof(BITMAPINFOHEADER) + lWidth * lHeight * 3;
//¼ÆËãת»»ºóDIB³¤¶È
DWORD dwDesDIBSize = sizeof(BITMAPINFOHEADER) + 4 * 256
+ lWidth * lHeight;
//ΪDIB·ÖÅäÄÚ´æ
hTemplateDIB = GlobalAlloc(GHND, dwDesDIBSize * 8);
if( hTemplateDIB == NULL)
{
//ÄÚ´æ·ÖÅäʧ°Ü£¬·µ»ØFALSE
return FALSE;
}
//Ëø¶¨ÄÚ´æ
lpTemplateDIB = (LPSTR) ::GlobalLock((HGLOBAL) hTemplateDIB);
//¼ÆËãͼÏñÿÐеÄ×Ö½ÚÊý
lSrcLineBytes = WIDTHBYTES(lWidth * 8 * 3);
lDstLineBytes = WIDTHBYTES(lWidth * 8);
//¸³³õÖµ
memcpy(lpTemplateDIB, lpDIB, sizeof(BITMAPINFOHEADER));
lpBIH = (LPBITMAPINFOHEADER) lpTemplateDIB;
lpBI = (LPBITMAPINFO) lpTemplateDIB;
lpBIH->biBitCount = 8;
//ÕÒµ½DIBͼÏñµÄÏñËØÆðʼλÖÃ
lpDIBBits = ::FindDIBBits(lpDIB);
lpTemplateDIBBits = ::FindDIBBits(lpTemplateDIB);
for(i = 0; i < 256; i++)
{
lpBI->bmiColors[i].rgbRed = (BYTE)i;
lpBI->bmiColors[i].rgbGreen = (BYTE)i;
lpBI->bmiColors[i].rgbBlue = (BYTE)i;
lpBI->bmiColors[i].rgbReserved = 0x00;
}
for(i = 0; i < lHeight; i++)
{
for(j = 0; j < lWidth; j++)
{
//Ö¸ÏòÔͼÏñºÍÄ¿µÄͼÏñµÄµÚiÐУ¬µÚj¸öÏñËصÄÖ¸Õë
lpSrc = (unsigned char *)lpDIBBits + lSrcLineBytes * i + j * 3;
lpDst = (unsigned char *)lpTemplateDIBBits + lDstLineBytes * i + j;
//¸øת»»ºóµÄͼÏñÏñËظ³Öµ
*lpDst = (BYTE)(0.299 * (*lpSrc) + 0.587 * (*(lpSrc+1))
+ 0.114 * (*(lpSrc+2)));
}
}
memset(lpDIB, 0, dwSrcDIBSize);
memcpy(lpDIB, lpTemplateDIB, dwDesDIBSize);
//ÊÍ·ÅÄÚ´æ
GlobalUnlock(hTemplateDIB);
GlobalFree(hTemplateDIB);
return TRUE;
}