32位bmp转8位设置调色板的问题
LPSTR lpDIB; // 指向DIB的指针
// 由DIB句柄得到DIB指针并锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
LPSTR lpDIBBits;// 指向DIB图像开始处象素指针
unsigned char * ired;
unsigned char * igreen;
unsigned char * iblue;
long lWidth,lHeight;// 图像宽度,图像高度
lWidth = ::DIBWidth(lpDIB); // 获取图像宽度
lHeight = ::DIBHeight(lpDIB);// 获取图像高度
lWidth =WIDTHBYTES(lWidth * 8);
lpDIBBits=::FindDIBBits(lpDIB);// 找到DIB图像象素起始位置
unsigned char * lpdest;
lpdest=(unsigned char *)::malloc(lHeight*lWidth);
int n=0;
for(int j = 0; j <4*lWidth*lHeight;n++,j=j+4)//读取图像数据并转化成灰度
{
ired= (unsigned char*)lpDIBBits+j;
igreen = (unsigned char*)lpDIBBits+j+1;
iblue = (unsigned char*)lpDIBBits +j+2;
lpdest[n] =(unsigned char)(0.299*(*ired)+0.587*(*igreen)+0.114*(*iblue)+0.5);
}
LPBITMAPINFOHEADER lpBI;//位图信息头
// 读取BITMAPINFO结构,初始化指针
lpBI = (LPBITMAPINFOHEADER)lpDIB; //[sizeof(BITMAPFILEHEADER)];
lpBI->biBitCount=8;
RGBQUAD *lpRGBquad;
lpRGBquad =(RGBQUAD *)&lpDIB[sizeof(BITMAPINFOHEADER)];//位图信息头后面为调色板
for (int i = 0; i < 256; i++)
{
lpRGBquad[i].rgbRed =(unsigned char)i;// 读取红色分量
lpRGBquad[i].rgbGreen =(unsigned char)i;// 读取绿色分量
lpRGBquad[i].rgbBlue = (unsigned char)i;// 读取红色分量
lpRGBquad[i].rgbReserved = 0;// 保留位
}
LPSTR lpNewDIBBits;// 指向DIB灰度图图像开始处象素的指针
lpNewDIBBits=::FindDIBBits(lpDIB);// 找到DIB图像象素起始位置
unsigned char * lpSrc;
for (i=0;i<lHeight*lWidth;i++) //写灰度图像数据
{
lpSrc=(unsigned char*)lpNewDIBBits+i;
*lpSrc=lpdest[i];
}
::free((void *)lpdest);
::GlobalUnlock ((HGLOBAL)hDIB);
运行后有问题。转化灰度的时候没有问题,去掉红色代码显示是正常的。但还是32位图。
设置调色板后,图像显示有问题。
请问是哪里的问题?
还有16位转化成灰度又该如何做呢?