问题遇到的现象和发生背景
在编写BMP解析程序时遇到了 无调色板 的8位 彩色 BMP,这个图像由24位BMP画图8位另存为得到
本来是8位BMP图像应该是有调色板的(?),但是这个8位BMP图像没有调色板
问题相关代码,请勿粘贴截图
这个BMP图像的biClrUsed的值为0,且通过计算每个像素点的大小是1字节整(8位),说明没有调色板部分
这个文件通过照片打开正常,但是通过程序打开不正常。
我认为是调色板的问题,但是没有调色板又如何正常显示图片呢
代码:
filename为图像地址
void ImgRead(char filename[])
{
HBITMAP cbitmap;
BYTE* mem;
BITMAPFILEHEADER *fileheader;
BITMAPINFOHEADER *infoheader;
fileheader = (BITMAPFILEHEADER*)malloc(sizeof(BITMAPFILEHEADER));
infoheader = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));
FILE *fp;
fp = fopen(filename, "rb");
fread(fileheader, sizeof(BITMAPFILEHEADER), 1, fp);
fread(infoheader, sizeof(BITMAPINFOHEADER), 1, fp);
rewind(fp);
mem = (BYTE*)malloc(fileheader->bfSize);
fread(mem, fileheader->bfSize, 1, fp);
BITMAPFILEHEADER bfh = *(BITMAPFILEHEADER*)mem;
BITMAPINFOHEADER bih = *(BITMAPINFOHEADER*)(mem + sizeof(BITMAPFILEHEADER));
RGBQUAD rgb = *(RGBQUAD*)(mem + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
BITMAPINFO bi;
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;
UINT8* pixels = mem + bfh.bfOffBits;
void* ppv;
HBITMAP hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &ppv, NULL, 0);
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pixels, &bi, DIB_RGB_COLORS);
HDC* phdc;
HDC* pmdc;
phdc = gethdcptr();
pmdc = getmdcptr();
SelectObject(*pmdc, hBitmap);
BitBlt(*phdc, 0, 0, infoheader->biWidth, infoheader->biHeight, *pmdc, 0, 0, SRCCOPY);
}
图像文件:
csdn传不了bmp,所以用的站外
https://www.intellitech.top/th_1BYTE.bmp