当前位置:首页 > 技术文章 > 正文内容

怎样用VC++实现对24位bmp图像的打开和显示(bmp图片假定放在D盘picture...

370SEO1年前 (2024-01-20)167

怎样用VC++实现对24位bmp图像的打开和显示(bmp图片假定放在D盘picture文件夹内),以备后续的图像处理?

希望高手给出具体的源代码,我找了很多,不过都有错误。我是新手,不太会调试。也希望能给个VC++的调试类问题的网站。不甚感激!
是在VS2008中 ,好像调试了下 有很多错误也
24位位图在VC++中需要三个结构来存储:
BITMAPFILEHEADER:文件信息头
LPBITMAPINFOHEADER:位图信息头指针
LPBYTE:像素数据指针

假设你的图片名为:“图片.bmp”。

1、你用VC++建立一个MFC(exe)工程,命名为“My”,在弹出的“MFC应用程序向导-步骤1”中选“单文档”,然后点“完成”->“确定”。

2、在“MyView.h”文件中找到代码“CMyDoc* GetDocument();”在其下方添加如下代码:
BITMAPINFOHEADER bmih;
LPBYTE pBits;
BOOL Read(char* s);

3、然后打开“MyView.cpp”文件,在最下面写如下代码:
BOOL CMyView::Read(char* s)
{
CFile file;
BITMAPFILEHEADER bmfh;

//打开文件
if(!file.Open(s,CFile::modeRead))
{
AfxMessageBox("File cannot open!");
return FALSE;
}

//读文件信息头
file.Read( (LPVOID)&bmfh, sizeof(bmfh) );
if(bmfh.bfType != 0x4d42)
{
AfxMessageBox("This is not a bmp file!");
return FALSE;
}

//读位图信息头
int infoSize = bmfh.bfOffBits - sizeof(bmfh);
bmih = (LPBITMAPINFOHEADER)new BYTE[infoSize];
file.Read( (LPVOID)bmih, infoSize);
if(bmih->biBitCount!=24)
{
AfxMessageBox("The number of colors is not valid!");
return FALSE;
}

//读图像数据
pBits = new BYTE[bmih->biSizeImage];
file.Read( (LPVOID)pBits, bmih->biSizeImage);

return TRUE;
}

4、往上找,找到构造函数:CMyView::CMyView()
在其中添加代码:
Read("d:\\picture\\图片.bmp");

5、往下找,找到OnDraw函数,在该函数的第三行添加代码:
if(bmih && pBits)
{
::StretchDIBits(pDC->GetSafeHdc(),0,0,bmih->biWidth,bmih->biHeight,0,0,bmih->biWidth,bmih->biHeight,pBits,(LPBITMAPINFO)bmih,DIB_RGB_COLORS,SRCCOPY);
}

运行即可。我已试过,可以打开并显示。希望你一步一步照做,代码不要写错!

http://wenku.baidu.com/view/550a8fd049649b6648d7478a.html
http://wenku.baidu.com/view/fe8ff04ffe4733687e21aa95.html

求教,StretchDIBits函数结果色彩不正确

如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配。如果目标矩形大小要比源矩形小,那么该函数通过使用指定的光栅操作对行列进行压缩。
函数原型:int StretchDIBits(HDC hdc, int XDest , int YDest , int nDestWidth, int nDestHeight, int XSrc, int Ysrc, int nSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO * lpBitsInfo, UINT iUsage, DWORD dwRop);  参数:  hdc:指向目标设备环境的句柄。
XDest:指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。
YDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
nDestWidth:指定目标矩形的宽度。
nDestHeight:指定目标矩形的高度。
XSrc:指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示。
YSrc:指定DIB中源矩形(左上角)的Y轴坐标,坐标以像素点表示。
nSrcWidth:按像素点指定DIB中源矩形的宽度。
nSrcHeight:按像素点指定DIB中源矩形的高度。
lpBits:指向DIB位的指针,这些位的值按字节类型数组存储,有关更多的信息,参考下面的备注一节。
lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。
iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了,那么该bmiColors是否包含了明确的RGB值或索引。参数iUsage必须取下列值,这些值的含义如下:
DIB_PAL_COLOR:表示该数组包含对源设备环境的逻辑调色板进行索引的16位索引值。
DIB_RGB_COLORS:表示该颜色表包含原义的KGB值,若想了解更多的信息,请参考下面备注一节。
返回值:如果函数执行成功,那么返回值是拷贝的扫描线数目,如果函数执行失败,那么返回值是GDI_CRROR。
Windows NT:若想获取更多错误信息,请调用GetLastError函数。
Windows 98、Windows NT 5.0及以后版本:如果设备驱动程序不支持传送给StretchDIBits的JPEG文件格式的图像,则该函数将失败,并返回GEI_ERROR。
备注:自底向上的DIB的起始点为左下角,自顶向下DIB的起始点为左上角。
如果nSrcWidth和nDestWidth参数的符号不同。或是nSrcHeight和nDesHeight参数的符号不同。那么函数StretchDIBits将创建位图的镜像。如果NsrcWidth和NdestWidth符号不同,那么函数将沿着X轴创建位图镜像。如果NsrcHeight和NdestHeight符号不同,那么函数将沿着Y轴创建位图镜像。
如果BITMAPINFOHEADER结构中的成员biCompression为BI_JPEG,那么参数lpBits指向的是一个包含JPEG图像的缓冲区。BITMAPINFOHEADER结构中的biSizeImage成员指定了该缓冲区的大小。参数iUsage必须设为DIB_RGB_COLORS。dwRop必须设为SRCCOPY。
如果BITMAPV4HEADER结构中的成员bV 4Compression为BI_JPEG,那么参数lpBits指向的是一个包含JPEG图像的缓冲区。BITMPV4HEADER结构中的bV4SizeImage成员指定了该缓冲区的大小。参数iUsage必须设为DIB_RGB_COLORS。参数dwRop必须设为SRCCOPY。
如果BITMAPV5HEADER结构中的成员bV 5Compression为BI_JPEG,那么参数lpBits指向的是一个包含JPEG图像的缓冲区。BITMPV5HEADER结构中的bV5SizeImage成员指定了该缓冲区的大小。参数iUsage必须设为DIB_RGB_COLORS。dwRop必须设为SRCCOPY。
为确保打印时可以有正确的图元文件假脱机操作。应用程序应在调用StretchDIBits函数之前调用CHECKJPEGFORMAT转义符,以确认打印机识别JPEG图像。
ICM:执行颜色管理。如果指定的BITMAPINFO结构中的bmiHeader不包含BITMAPV4HEADER或BITMAPV5HEADER,那么当前设备环境的颜色配置(profile)被用作源颜色配置(profile)。如果没有颜色档案,那么就使用RGB。如果指定的BITMAPINFO结构中的成员bmiHeader包含了BITMAPV4HEADER或BITMAPV5HEADER,那么将把位图标头中指定的颜色配置(profile)用作源颜色配置。

下面分享相关内容的知识扩展:

如何将bmp图像数据还原为图片并在listcontrol中显示? mfc

问题描述如下:从串口接收的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();

效果如图:

请高手帮忙啊
如何将bmp图像数据还原为图片并在listcontrol中显示? mfc
如何将bmp图像数据还原为图片并在listcontrol中显示? mfc
在列表控件中显示的图像都是图标,所以你要获取每一个位图的略缩图标,这样你就可以把他显示在列表控件中。如何在列表控件中显示图标,网上有很多资料;至于如何获取位图略缩图标,网上也有很多这样的例子。

为什么用StretchDIBits 和SetDIBitsToDevice绘图的清晰度不同

我感觉效率由高到低应该是
SetDIBitsToDevice DrawDibDraw StretchDIBits
相信我不会错的。

怎么用VB库函数LoadPicture读取图片的一部分?

其他 *** 思路也行
Image 控件因为不能使用 hDC 和 hWnd 操作,占用内存少,重绘快。里面有一个 Stretch 属性,设置为 True 就是图片将就 Image,False 就是 Image 将就图片(估计也是用 PaintPicture 函数画的……参数不同而已)。
注意!设置为 False,Image 自动调整完毕后再进行大小修改是可以的,不会限定大小!
如果没有特殊需求(如 GDI+),就用 Image 好一点,甚至是 Form(支持 PictureBox 的所有 *** )。
我估计 PaintPicture 的原型是 StretchDIBits。

下面讲解我从不知道有 PaintPicture 这个函数到掌握其用法的过程,供大家参考:
1、见到 PaintPicture 函数,考虑是否为 VB 的标准库函数;
2、直接调用,说明是;
3、用对象浏览器查找,发现所有具有 hDC 的控件都支持 PaintPicture,在根据 jcButton 的 DrawGradientEx 函数(by Charles PV)推测其原型。
4、由于 PaintPicture 的之一个参数类型为 StdPicture,结合 LoadPicture 的返回值及自动转换(IPictureDisp->StdPicture)想到用法。以下为简略型。

PaintPicture LoadPicture("{图片名称}", ...一堆参数,根据名称想作用), 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, ...又是一堆参数

这个没有设置返回值接收,想要也很简单,用个变量接着,再向 PaintPicture 后和最后添加两个半角括号即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文链接:http://www.370seo.com/16179.html

“怎样用VC++实现对24位bmp图像的打开和显示(bmp图片假定放在D盘picture...” 的相关文章

114514表示什么意思(男生回复我“114514”是什么意思-) _1

114514表示什么意思(男生回复我“114514”是什么意思-) _1

本文共计4058个文字,预计阅读时间需要13分22秒,由作者编辑整理创作于2023年08月29日 17点59分53秒。114514表示什么意思114514,网络流行语,常见于b站弹幕上。来自日本,一个一直背着臭名昭著的家伙干电影《仲夏夜之淫梦》,猛兽们的热心指点,后辈原文,原文,原文是的:“!!",...

内衣ub是什么意思(股票ub是什么意思-)

本文共计873个文字,预计阅读时间需要2分45秒,由作者编辑整理创作于2023年09月01日 13点13分45秒。内衣ub是什么意思内衣ub是大小意思。根据查询相关资料显示:Underwear作为U的缩写,解释为内衣时的信息。股票ub是什么意思?就是股票布林线指标的上轨UpperB(简称UB)意思。...

孙红雷个人资料简介 孙红雷介绍(孙红雷个人资料简历 孙红雷简介)

本文共计2920个文字,预计阅读时间需要9分35秒,由作者编辑整理创作于2023年09月03日 13点24分04秒。孙红雷个人资料简介 孙红雷介绍1、孙红雷,1970年8月16日出生于黑龙江省哈尔滨市,中国内地男演员,毕业于中央戏剧学院音乐剧大专班。 2、1999年出演个人首部电影《我的父亲母亲》...

什么叫做联合国-联合国是什么意思-女人叫联合国是什么意思

本文共计1092个文字,预计阅读时间需要3分29秒,由作者编辑整理创作于2023年09月02日 14点38分20秒。什么叫做联合国?联合国是什么意思?世界各主权国家为维护和加强国际和平与合作而建立的世界范围的国际组织。1945年4月25日~6月26日,以中、苏、美、英为发起国的联合国宪章制宪会议在美...

东方财富如何购买可转债(东方财富为什么没有可转债了)

本文共计3541个文字,预计阅读时间需要11分39秒,由作者编辑整理创作于2023年08月30日 23点53分47秒。东方财富如何购买可转债打开东方财富APP,然后点击首页右下角的交易;打开交易页面后,点击更多:3.打开交易功能页面后,将页面滑到底部;4.在交易功能页面底部,点击权益查询;5.打开业...

摈弃与摒弃的区别是什么-摒弃和摈弃有何区别-

摈弃与摒弃的区别是什么-摒弃和摈弃有何区别-

本文共计955个文字,预计阅读时间需要3分2秒,由作者编辑整理创作于2023年09月05日 15点57分21秒。摈弃与摒弃的区别是什么? 区别:1、意思不同:“摈弃”,表示抛弃,多用于人和具体事物。“摒弃”,表示舍弃、除去,多用于较抽象的事物,较少用于人或具体事物。2、出处不同:摈弃出自汉刘向《列女...