显示内存中图片方法总结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

图片文件的存在形式并不总是文件形式,有时可能是内存块、也有可能是字节流,比如保存于数据库中的某一图片,用GetChunk方法读取出来后一般保存在一个预先分配的内存块中,我们知道内存块的首地址,内存块的大小,要把这样的图片显示出来,可以自己编写函数按文件结构解析数据,但未免太麻烦,也是没有意义的“制造轮子”的重复工作,不如用windows系统自带的Ipicture的COM组件显示图片来得更简便些。下面是核心代码。技巧是把数据内存块转换成一个内存文件CMemFile,不必把图片文件存储成一个临时文件再读取。

  1 #include <atlbase.h>

复制代码
 2 #include <afxpriv2.h>
 3 void CIpicDlg::ShowPic()
 4 {
 5     CComQIPtr<IPicture>spIPicture;
 6     HRESULT m_hr;
 7     //unsigned char* pPictureData;
 8     //UINT nPictureSize;
 9     CRect rc;
10     m_wndPic1.GetClientRect(&rc);
11     CDC* pDC = m_wndPic1.GetDC();
12     if(m_pPictureData)
13     {
14         CMemFile memfile;
15         memfile.Attach(m_pPictureData,m_nPictureSize);
16         CArchive ar(&memfile, CArchive::load | CArchive::bNoFlushOnDelete);
17         CArchiveStream arcstream(&ar);
18         HRESULT hr = OleLoadPicture((IStream*)&arcstream, 0, FALSE,
19             IID_IPicture, (void**)&spIPicture);
20         ASSERT(SUCCEEDED(hr) && spIPicture);
21         OLE_XSIZE_HIMETRIC hmWidth = 0;
22         OLE_YSIZE_HIMETRIC hmHeight = 0;
23         m_hr = spIPicture->get_Width(&hmWidth);
24         ASSERT(SUCCEEDED(m_hr));
25         m_hr = spIPicture->get_Height(&hmHeight);
26         ASSERT(SUCCEEDED(m_hr));
27         spIPicture->Render(pDC->m_hDC, rc.left, rc.top, rc.Width(), rc.Height(),
28             0, hmHeight, hmWidth, -hmHeight, NULL);
29         CSize sz(hmWidth,hmHeight);
30         pDC->HIMETRICtoDP(&sz);
31     }
32     if (spIPicture)
33     {
34         spIPicture.Release();
35     }
36 }

///////////////////////////////////////////////////////////////////////////////////////////////////
显示内存中的BMP

//把BMP文件读到内存中 bmpbuf

void CAskProxyDlg::OnButton3()
{
 // TODO: Add your control notification handler code here
 CFile pfile;
 pfile.Open("d:\\22.bmp",CFile::modeRead);
 int ll = pfile.GetLength();
 
 pfile.Read(bmpbuf,ll);
 
 ShowBmp();
// PostDecHandler((BYTE*)bmpbuf + 0x436,0,0);
 pfile.Close();
}

//显示内存中的BMP

void CAskProxyDlg::ShowBmp()
{
 CClientDC dc(this);//取得客户区内存DC
 
 CString cs;
 int index(0);
 BITMAPFILEHEADER *pfilehead = (BITMAPFILEHEADER*)bmpbuf;
 index = sizeof(BITMAPFILEHEADER);
 BITMAPINFO *pbi = (BITMAPINFO*)(bmpbuf + index);//BITMAPINFOHEADER

 int width = pbi->bmiHeader.biWidth;
 int height = pbi->bmiHeader.biHeight;
 int r = SetDIBitsToDevice(dc.m_hDC,100,100,width,height,0,0,0,height,bmpbuf+pfilehead->bfOffBits,pbi,DIB_RGB_COLORS);

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////

QImage类提供了一个硬件无关的图像表示方法,该图像可以逐像素被访问和用于画图设备。

Qt提供了QImage、QPixmap、QBitmap和QPicture四种图像操作类。QImage类主要用于I/O和直接逐像素访问、操作;QPixmap主要用于在屏幕中显示图像;QBitmap是一个基于方便考虑继承自QPixmap的提供1bit深度二值图像的类;QPicture是一个可以记录和响应QPainter类命令的画图设备。

QImage继承自QPaintDevice,QPainter类可以被用来直接在图像上进行画操作。

QImage类支持QImage::Format枚举变量描述的多种图像类型,包括8-bit, 32-bit 和 alpha-blended images

QImage 提供很多可以用于获取图像信息和进行图像变换的函数。

1。读写图像

QImage有多种读取图像的方法。图像文件可以在生成QImage对象的过程中或者在之后用load和loadFromData方法读取,也可以用静态方法fromData利用给定的数据构造。读取的图像可以是存储在磁盘中或某个嵌入式应用程序的资源。

save方法可以用来保存QImage对象。

2。图像信息

QImage类提供了很多用于获取图像信息的方法。

如size、width、height、dotsPerMeterX、dotsPerMeterY、pixel、text、depth

3。像素赋值操作

1).32-bit图像

用qRgb或qRgba方法设置一个颜色值,再用sexPixel将相应像素设置为相应颜色

2).8-bit和1-bit二值图像

每一个像素的值是color table List中的一个索引,因此像素的值只能被改成一个在color table List中已经定义的值。如果想往color table List中加入新的值,可以用setColor方法。

4。图像格式

QImage中的每一个像素由一个整数表示,这个整数的大小取决于不同的图像格式。

8-bit图像的每一个像素的值是color table List中的一个索引,32-bit每一个像素拥有一个自己的rgb值(RGB、ARGB、premultiplied ARGB)

图像的格式可以用format方法得到,convertToFormat方法可以用来将一种格式的图像转换为另外一种,allGray和isGrayscale方法可以用来检查一个彩色图像是否可以被安全转换为灰度图像。

5。图像变换

mirrored、scaled、rgbSwapped、scaledToWidth、scaledToHeight、transformed...


FPGA使用DDR 显示PAL图像 PAL图像经过DDR缓存之后显示出来 具体解释参考http://blog.csdn.net/yunge812/article/details/79594235 立即下载

相关推荐

ImageView使用和从内存读取图片显示

1 import java.io.File; 2 3 import android.app.Activity; 4 import android.graphics.Bitmap; 5 import android.graphics.BitmapFactory; 6 import android.os.Bundle; 7 import android.view.Vie...

weixin_30532837的博客 210

opencv从内存读取图片

使用场景: cv_2.4.1/ cpp/linux,我有一内存的文件内存快,是一图片。需要读取到Mat中。 原方案是io保存一次,然后执行imread。后面细想,这个方案要消耗两次IO,很浪费。能否绕过IO的瓶颈呢? 然后我去查CV的文档,有imdecode这样的接口 Reads an image from a buffer in memory. C++: Mat imdecode(In

songtzu的专栏 1万+

OpenCV3小白入门之读取图像(opencv3.4.1)

读取图像的基本语句有三条:    1.定义图像存放的矩阵——Mat;    2.读取图像——imread(与实例化Mat集成一条语句);    3.定义窗口——nameWindow(非必须);    4.显示图像——imshow;以下为实例代码:#include &lt;iostream&gt; // for standard I/O//opencv头文件 opencv2与opencv3的引用路径...

wangxilin2012的博客 4077

如何将内存图像数据封装成QImage V1

如何将内存图像数据封装成QImage         当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。        下面以灰度相机为例,介绍封装方法:        第一步:首先根据相机的SDK内的读图像函数,获取图像数据imgDat

分享的滋味 4353

图片无法显示因计算机内存可能不足,Windows照片查看器无法显示图片,内存可能不足的解决方法...

最近在Windows10系统下使用Windows照片查看器打开一个JPG格式的图片,打开之后提示“Windows 照片查看器无法显示图片,因为计算机上的可用内存可能不足。请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满),然后重试”,这时候我们按下F11键可以查看图片,说明图片自身并非是损坏的,那么我们要如何解决这个问题呢?下面装机之家分享一下Windows 照片查看器无法显示...

weixin_29461699的博客 5010

STM32显示外置FLASH存储的图片,遇到内存不足的显示方法

这里数组的大小定义为了480,scrollStep的值为 数组大小(480)/ 2 /屏幕宽度(240)。注意scrollStep要为整数,数组大小和scrollStep根据实际调整。如图,一张240x240的图片大小达到了115200,如果要显示存储在FLASH中的这张图片,首先要定义一个大小为115200的数组。新建工程,使用硬件spi驱动W25Q64和LCD屏幕,本文使用的屏幕为1.54寸240x240屏幕。如何把图片存储在外置FALSH并显示参考我之前的文章。本文中使用的MCU为。

nnnzn的博客 3374

PyQT5 图片存到内存后的显示方法

测试环境; python3.7 # 打开图片 with open('图片地址’,‘rb’) as pic_file: pic = pic_file.read() #pic也可以是生成的数据: pic = base64.b64decode(json_data.get('data')) picture= QtGui.QImage.fromData(pic) pixmap = QtGui...

vzdong1的博客 1877

win7图片查看器无法显示图片内存不足解决方法

一、windows照片查看器无法显示图片的原因 Windows 因为计算机的可用内存不足导致无法显示图片,大部分的原因是因为软件的配置没选对,软件识别不了照片的颜色,所以一直识别加载,导致内存不足,无法显示图片。 二、解决方法 解决方法很简单,只要修改配置文件即可。 具体步骤 (1)打开电脑控制面板,将查看方式选为“大图标”,然后找到并点击“颜色管理” (2)选择“高级”,然后将设备配置文件修改为“Agfa”,这样设置后,原先因为内存不足显示不了的图片就能打开了。 ....

hu5566798的博客 3万+

内存优化之设置图片显示所有方法对比

今天有时间对比了一下所有设置图片或者背景的方式占用手机内存大小(三张全屏图片):      第一种使用:setImageResource()方法,占用内存254M(魅蓝手机,没有OOM) 第二种使用:imageView.setImageBitmap(BitmapFactory.decodeResource());方法,占用内存240M,稍微好了一点 第三种:XML文件中设置src或者backgro

zhq217217的博客 468

qt html 内存中的图片,QT显示图片的四种方法

weixin_29751415的博客 1194

打开图片显示Windows照片查看器无法显示图片。因为计算机上的可用内存可能不足。解决方法

打开图片显示Windows照片查看器无法显示图片。因为计算机上的可用内存可能不足。解决方法! 首先,去exiftool(.)org下载个免费的命令行程序exiftool.exe。 然后,用记事本建一个批处理文件Remove-icc.bat,编辑输入:exiftool -icc_profile= *.jpg 然后,将exiftool.exe和Remove-icc.bat都放在需要更改的微信图片目录下,运行Remove-icc.bat,目录里面所有的内嵌有icc文件的jpg都会被去除icc配置,也就可以用Wi.

XiaoShen`s BLOG 1851

计算机上可用内存不足无法打开图,Windows照片查看器无法显示图片因为计算机上的可用内存可能不足解决方法...

在电脑上查看图片,会碰到“Windows照片查看器无法显示图片因为计算机上的可用内存可能不足”的情况,有些图片可以正常查看,有些图片就会这样,内存设定都很足够,具体怎样来解决这个问题,请看全文。解决“Windows照片查看器无法显示图片,因为计算机上的可用内存可能不足……”方法估计现在有许多人和疑惑 使用系统自带Windows照片查看器打开图片时 部分图片图片显示显示内存不足等情况然而实际...

weixin_31662303的博客 7569

STM32显示外置FLASH存储的图片,遇到内存不足的显示方法_stm32将图片数组放到存储器中

如图,一张240x240的图片大小达到了115200,如果要显示存储在FLASH中的这张图片,首先要定义一个大小为115200的数组。

芯_v_648374雨馨博客 1060

LeveListDrawable实现多图片显示以及防止图片内存溢出方法

一个LeveListDrawable管理着一组交替的drawable资源。LeveListDrawable里面的每一个drawable资源与一个最大数值结合起来,作为LevelListDrawable资源的一项。 调用Drawable的setLevel()方法可以加载level-list或代码中定义的某个drawable资源,判断加载某项的方式:level-list中某项的android:max

知也无涯 412

计算机桌面图片打不开显示内存不足,windows照片查看器无法显示图片,因为计算机上的可用内存可能不足解决方法...

win7查看照片显示内存不足怎么办呢?有用户使用win7照片查看器打开图片时提示:windows照片查看器无法显示图片,因为计算机上的可用内存可能不足。但是电脑硬件配置足够高,内存也不小,那么遇到这个问题该怎么解决呢?其实我们可以通过“校准显示器”的方法来解决,下面小编教大家照片查看器无法显示图片,因为计算机上的可用内存可能不足的解决方法。解决步骤如下:1、点击屏幕右下角“开始”图标,打开“控...

weixin_36353180的博客 2万+

利用CImage完成图片显示、拷贝、绘制及转换图片格式 .

近日一个利用VC编写的程序需要在界面上显示图片,经过查阅资料利用CImage方得实现。将相关技术点整理如下,以供以后参考。 一、             图片的载入 如果需要在界面上显示的是已经存在的图片,那么需要将待显示图片载入至CImage对象之中,CImage提供了四

1450

windows照片查看器无法显示图片内存不足_电脑使用图片转换器打开heic图片方法...

每一个苹果新用户似乎都会遇到一个共同的问题吗,那就是为什么拍出来的照片电脑和安卓手机都打不开,其实仔细看一下就知道了,苹果iOS11系统之后的默认图片都是heic格式,而安卓和电脑中都不支持这种格式,只有将其进行格式转换才能打开,那Windows怎么打开heic,heic是什么图片呢,window图片查看器只能打开jpg,png,bmp格式的图片,这样就需要将heic转成普通jpg,png图片,使...

weixin_39539764的博客 438
上一篇: 骆驼命名法,帕斯卡命名法和匈牙利命名法
下一篇: DDB与DIB
wwl33695
博客等级 码龄18年 136粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值