32位位图转换为8位灰度图像,调色板如何设置?
调色板写入文件以后,如何把像素的索引值对应到调色板?
如果是用LOGPALETTE实现的话,怎么用?以下附源码,生成的8位灰度图像是栅格状的,是什么原因呢?
希望高手能解答下
源码如下:
BITMAPFILEHEADER hdr;
BITMAPINFOHEADER bih;
DWORD dwSize,dwWritten;
LPBITMAPINFOHEADER pdib = (LPBITMAPINFOHEADER)lpCurrImage;//抓取的图像帧,包括位图信息头和位图数据
BYTE* pCurrImage = lpCurrImage + *(LPDWORD)lpCurrImage;//计算位图数据的起始位置
//对齐
DWORD dwBytes = ((DWORD)pdib->biWidth * pdib->biBitCount) / 32;
if (((DWORD) pdib->biWidth * pdib->biBitCount) % 32)
{
dwBytes++;
}
dwBytes *= 4; //创建位图文件
HANDLE hFile = CreateFile(szFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
if (hFile == INVALID_HANDLE_VALUE) {
return FALSE;
} //位图文件头初始化
dwSize = dwBytes * pdib->biHeight / 4 + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);//抓取的图像帧的大小
hdr.bfType = BFT_BITMAP;
hdr.bfSize = dwSize + sizeof(BITMAPFILEHEADER);//位图文件的大小
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
256 * sizeof(RGBQUAD); bih = * pdib;
bih.biBitCount = 8; //灰度转换
lpbNewDib = new BYTE[bih.biSizeImage];
for (int i= 0;i < bih.biHeight; i++)
{
for (int j = 0;j < bih.biWidth;j++)
{
lpbNewDib[j + i * bih.biWidth] =
(BYTE)(*(pCurrImage) * 0.114 + *(pCurrImage++) * 0.587 +
*(pCurrImage++) * 0.299);
}
} //调色板
RGBQUAD new_RGBQUAD[256];
for( i=0;i<256;i++)
{
new_RGBQUAD[i].rgbBlue=new_RGBQUAD[i].rgbGreen=new_RGBQUAD[i].rgbRed=(BYTE)i;
new_RGBQUAD[i].rgbReserved=0;
} WriteFile(hFile,(LPCVOID)&hdr,sizeof(BITMAPFILEHEADER),&dwWritten,0);
WriteFile(hFile,(LPCVOID)&bih,sizeof(BITMAPINFOHEADER),&dwWritten,0);
WriteFile(hFile,(LPCVOID)new_RGBQUAD,1024,&dwWritten,0);
WriteFile(hFile,(LPCVOID)lpbNewDib,bih.biSizeImage,&dwWritten,0);
CloseHandle(hFile);
调色板写入文件以后,如何把像素的索引值对应到调色板?
如果是用LOGPALETTE实现的话,怎么用?以下附源码,生成的8位灰度图像是栅格状的,是什么原因呢?
希望高手能解答下
源码如下:
BITMAPFILEHEADER hdr;
BITMAPINFOHEADER bih;
DWORD dwSize,dwWritten;
LPBITMAPINFOHEADER pdib = (LPBITMAPINFOHEADER)lpCurrImage;//抓取的图像帧,包括位图信息头和位图数据
BYTE* pCurrImage = lpCurrImage + *(LPDWORD)lpCurrImage;//计算位图数据的起始位置
//对齐
DWORD dwBytes = ((DWORD)pdib->biWidth * pdib->biBitCount) / 32;
if (((DWORD) pdib->biWidth * pdib->biBitCount) % 32)
{
dwBytes++;
}
dwBytes *= 4; //创建位图文件
HANDLE hFile = CreateFile(szFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
if (hFile == INVALID_HANDLE_VALUE) {
return FALSE;
} //位图文件头初始化
dwSize = dwBytes * pdib->biHeight / 4 + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);//抓取的图像帧的大小
hdr.bfType = BFT_BITMAP;
hdr.bfSize = dwSize + sizeof(BITMAPFILEHEADER);//位图文件的大小
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
256 * sizeof(RGBQUAD); bih = * pdib;
bih.biBitCount = 8; //灰度转换
lpbNewDib = new BYTE[bih.biSizeImage];
for (int i= 0;i < bih.biHeight; i++)
{
for (int j = 0;j < bih.biWidth;j++)
{
lpbNewDib[j + i * bih.biWidth] =
(BYTE)(*(pCurrImage) * 0.114 + *(pCurrImage++) * 0.587 +
*(pCurrImage++) * 0.299);
}
} //调色板
RGBQUAD new_RGBQUAD[256];
for( i=0;i<256;i++)
{
new_RGBQUAD[i].rgbBlue=new_RGBQUAD[i].rgbGreen=new_RGBQUAD[i].rgbRed=(BYTE)i;
new_RGBQUAD[i].rgbReserved=0;
} WriteFile(hFile,(LPCVOID)&hdr,sizeof(BITMAPFILEHEADER),&dwWritten,0);
WriteFile(hFile,(LPCVOID)&bih,sizeof(BITMAPINFOHEADER),&dwWritten,0);
WriteFile(hFile,(LPCVOID)new_RGBQUAD,1024,&dwWritten,0);
WriteFile(hFile,(LPCVOID)lpbNewDib,bih.biSizeImage,&dwWritten,0);
CloseHandle(hFile);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货