2023.2.22记录:图像显示不出来调用SetDIBitsToDevice函数返回值是0,原因是图片数据大小超过ui显示范围大小,故显示不出来,得缩放比例才能正常显示,暂未解决。
难死我了,搞了两天显示的可能还不对,但是记录一下,希望广大网友有更好的方法评论,诚心求教。
MFC本身没有提供直接显示RAW类型数据的接口,所以要先创建一个BITMAPINFO来进行显示。
IMAGE_INFO imgInfo; // 图像数据
GetImageInfo(image, &imgInfo); // 获取图像数据
unsigned char *data = GetImageBuff(image); // 真正的图像数据
CDC* pDC = GetDlgItem(IDC_STATIC)->GetDC(); //获取图片控件DC
#pragma region 创建一个图像对象
BITMAPINFO bitmapInfo;
memset(&bitmapInfo, 0, sizeof(bitmapInfo));
// 本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节
bitmapInfo.bmiHeader.biSize = sizeof(bitmapInfo);
// BMP图像的宽度,单位像素
bitmapInfo.bmiHeader.biWidth = static_cast<LONG>(imgInfo.width);
// BMP图像的高度,单位像素
bitmapInfo.bmiHeader.biHeight = static_cast<LONG>(imgInfo.height);
// BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色
bitmapInfo.bmiHeader.biBitCount = 24; // RGB 888 3个字节
// 压缩方式,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩,3表示每个像素值由指定的掩码决定
bitmapInfo.bmiHeader.biCompression = BI_RGB;
// 重要的颜色数,此值为0时所有颜色都重要,对于使用调色板的BMP图像来说,当显卡不能够显示所有颜色时,此值将辅助驱动程序显示颜色
bitmapInfo.bmiHeader.biClrImportant = 0;
// BMP图像使用的颜色,0表示使用全部颜色,对于256色位图来说,此值为100h=256
bitmapInfo.bmiHeader.biClrUsed = 0;
// BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足
bitmapInfo.bmiHeader.biSizeImage = 0;
// 水平分辨率,单位像素 / m
bitmapInfo.bmiHeader.biXPelsPerMeter = 0;
// 垂直分辨率,单位像素/m
bitmapInfo.bmiHeader.biYPelsPerMeter = 0;
// 目标设备的级别,必须是1
bitmapInfo.bmiHeader.biPlanes = 1;
#pragma endregion 创建一个图像对象
int nResult = ::SetDIBitsToDevice(
pDC->m_hDC, // 绘画对象句柄
0, // 起始绘画坐标x
0, // 起始绘画坐标y
bitmapInfo.bmiHeader.biWidth, // 图片宽度
bitmapInfo.bmiHeader.biHeight, // 图片高度
0, // 图片起始坐标x
0, // 图片起始坐标y
0, // 线性画图 从0开始
bitmapInfo.bmiHeader.biHeight, // 画这么高的图
data, // 图片数据
(BITMAPINFO*)&bitmapInfo, // 数据头
DIB_RGB_COLORS);
// 这个据说可以按比例自动缩放图片 但是我试了好像不行。。。
// int nResult = ::StretchDIBits(pDC->m_hDC, 0, 0, 900,
// 800, 0, bitmapInfo.bmiHeader.biHeight, bitmapInfo.bmiHeader.biWidth,
// bitmapInfo.bmiHeader.biHeight, data, (BITMAPINFO*)&bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
ImageRelease(image); // 释放图像数据