如何将bmp图像数据还原为图片并在listcontrol中显示? mfc
问题描述如下:从串口接收的bmp图像数据保存在rgbBuffer[]数组,通过下面代码实现了图像的还原和显示,下图中央的大图:BITMAPINFOHEADERbmiHea...
问题描述如下:从串口接收的bmp图像数据保存在rgbBuffer[]数组,通过下面代码实现了图像的还原和显示,下图中央的大图:
BITMAPINFOHEADER bmiHeader;
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = 240; // 位图宽度(像素);
bmiHeader.biHeight = 320; // 位图高度(像素);
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB; // 没有压缩;BI_RGB
bmiHeader.biSizeImage = 153600;
bmiHeader.biXPelsPerMeter = 0;
bmiHeader.biYPelsPerMeter = 0;
bmiHeader.biClrUsed = 0;
bmiHeader.biClrImportant = 0;
// now blast it to the CDC passed in.
// lines returns the number of lines actually displayed
//pDC->SetStretchBltMode(STRETCH_HALFTONE); //COLORONCOLOR
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC-> m_hDC, //pDC-> m_hDC, 色彩格式转化 pDC->GetSafeHdc()
170,
bmiHeader.biHeight+50,
bmiHeader.biWidth,//目标图像宽度
0-bmiHeader.biHeight, //目标图像高度
0,
0,
bmiHeader.biWidth*2, //源图像宽度 用来放大和缩小原始图像
bmiHeader.biHeight*2, //源图像高度
rgbBuffer, //imageBuffer,图像数据 //DIB数据缓存区指针(BYTE * 类型)
//buffer,
(LPBITMAPINFO)&bmiHeader,
DIB_RGB_COLORS,
SRCCOPY);
请问在此基础上,我该怎么实现将该图片加入到listcontrol中显示,最好有代码。最终效果如下,在左下角的listcontrol中显示该图片的缩略图:
我尝试下面的代码,可只能显示图片的一部分,就还差一步
BITMAP BitMap;
BitMap.bmType=0;
BitMap.bmHeight=320;
BitMap.bmWidth=240;
BitMap.bmWidthBytes=240*4;//大于或等于bmWidth*bmBitsPixel/8所得的值
BitMap.bmPlanes=1;
BitMap.bmBitsPixel=32;
BitMap.bmBits=rgbData;
CBitmap cbitMap;
cbitMap.CreateBitmapIndirect(&BitMap);
//imageList.Add(&cbitMap);
imageList.Add(&cbitMap,RGB(0,0, 0));
//imageList.Add(&cbitMap,RGB(255,255, 255)); //增加非选中状态图像
CString strTemp;
for (int n = 0; n < 1; n++) {
strTemp.Format(_T("pic:%d"),n);
m_ListCtrl.InsertItem(n,strTemp, n);
}
//imageList.Draw(pDC, 0, CPoint(0,0),NULL);
imageList.Detach();
效果如图:
请高手帮忙啊 展开
BITMAPINFOHEADER bmiHeader;
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = 240; // 位图宽度(像素);
bmiHeader.biHeight = 320; // 位图高度(像素);
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB; // 没有压缩;BI_RGB
bmiHeader.biSizeImage = 153600;
bmiHeader.biXPelsPerMeter = 0;
bmiHeader.biYPelsPerMeter = 0;
bmiHeader.biClrUsed = 0;
bmiHeader.biClrImportant = 0;
// now blast it to the CDC passed in.
// lines returns the number of lines actually displayed
//pDC->SetStretchBltMode(STRETCH_HALFTONE); //COLORONCOLOR
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC-> m_hDC, //pDC-> m_hDC, 色彩格式转化 pDC->GetSafeHdc()
170,
bmiHeader.biHeight+50,
bmiHeader.biWidth,//目标图像宽度
0-bmiHeader.biHeight, //目标图像高度
0,
0,
bmiHeader.biWidth*2, //源图像宽度 用来放大和缩小原始图像
bmiHeader.biHeight*2, //源图像高度
rgbBuffer, //imageBuffer,图像数据 //DIB数据缓存区指针(BYTE * 类型)
//buffer,
(LPBITMAPINFO)&bmiHeader,
DIB_RGB_COLORS,
SRCCOPY);
请问在此基础上,我该怎么实现将该图片加入到listcontrol中显示,最好有代码。最终效果如下,在左下角的listcontrol中显示该图片的缩略图:
我尝试下面的代码,可只能显示图片的一部分,就还差一步
BITMAP BitMap;
BitMap.bmType=0;
BitMap.bmHeight=320;
BitMap.bmWidth=240;
BitMap.bmWidthBytes=240*4;//大于或等于bmWidth*bmBitsPixel/8所得的值
BitMap.bmPlanes=1;
BitMap.bmBitsPixel=32;
BitMap.bmBits=rgbData;
CBitmap cbitMap;
cbitMap.CreateBitmapIndirect(&BitMap);
//imageList.Add(&cbitMap);
imageList.Add(&cbitMap,RGB(0,0, 0));
//imageList.Add(&cbitMap,RGB(255,255, 255)); //增加非选中状态图像
CString strTemp;
for (int n = 0; n < 1; n++) {
strTemp.Format(_T("pic:%d"),n);
m_ListCtrl.InsertItem(n,strTemp, n);
}
//imageList.Draw(pDC, 0, CPoint(0,0),NULL);
imageList.Detach();
效果如图:
请高手帮忙啊 展开
1个回答
展开全部
在列表控件中显示的图像都是图标,所以你要获取每一个位图的略缩图标,这样你就可以把他显示在列表控件中。如何在列表控件中显示图标,网上有很多资料;至于如何获取位图略缩图标,网上也有很多这样的例子。
更多追问追答
追问
显示位图的图标这个我已经搞定了,现在的问题是怎么将图像数据(不包括文件头,信息头什么的)还原并显示在listcontrol中,目前只能显示其中的一部分
追答
从效果来看,你的图像列表位图大小应该是小于实际图像大小,所以你要获取实际位图图像略缩图
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询