1.文档目的
数码相框主要功能是播放照片,所以,照片的播放效果以及画面的清晰度显然是我们首要考虑的问题,但是在嵌入式设备中由于硬件的局限性,所以需要对图片的显示方法进行针对性的优化。而本文档编写目的在于分析QT中的几个基本图片类,从而从中找出能适合并具有较好显示效果的图片显示方法。
2.资料分析
Qt提供给了4个图像类:QImage/QPixmap/QBitmap/Qpicture。
QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是为I/O,为图片像素访问以及修改而设计的。如果需要访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素。另外跟QImage不同是,QPixmap跟硬件是相关的,如X11,Mac以及Embedded平台上,QPixmap是存储在服务器端,而QImage则是存储在客户端;在X11,Mac以及Embedded平台上,QImage:因为它是存储在客户端,往QImage上绘图比较快,但显示它则比较慢。QPixmap:因为它是存储在服务器端,往QPixmap上绘图比较慢,但显示它则比较快;
QBitmap只是一个继承于QPixmap的简单类,它可以确保图片深度为1。QBitmap是QPixmap的子类,提供单色图像,可以用来制作游标(QCursor)或者笔刷(QBrush);
QPicture是一个绘画设备类,它记录了并可以重演QPainter的命令。你可以使用QPainter的begin()方法,指定在QPicture上绘图,使用end()方法结束绘图,使用QPicture的save()方法將QPainter所使用过的绘图指令存至档案。要重播绘图指令的话,建立一個QPicture,使用load()方法载入绘图指令的档案,然后在指定的绘图裝置上绘制Qpicture;
用Qt程序在嵌入式上显示一幅图片,分别使用QImage/Qpixmap有以下两种方法:
//dangerousshouldnotbeused,cannotdisplayearth.png,
//butifwechangeearth.pngtoasmallerimagee.g.apple.png,apple.pngcanbedisplayed
QPixmappixmap;
pixmap.load(":/pics/*.png");
label->setPixmap(pixmap);
和
//dangerousshouldnotbeused,cannotdisplayearth.png,
//butifwechangeearth.pngtoasmallerimagee.g.apple.png,apple.pngcanbedisplayed
QPixmappixmap;
pixmap.load(":/pics/*.png");
QPainterpainter(this);
painter.drawPixmap(0,0,pixmap);
这两段代码看起来好像没什么问题。确实,在PC上是没有问题的。问题是我们做的是QtforEmbedded!嵌入式上的资源本来就是比较紧缺的,所以我们使用的时候就需要更加注意。
首先需要知道的是QPixmap的具体实现是依赖于系统的。在Embedded系统上QPixmap是被存放在Server端的。目前的Qt会把QPixmap都存储在graphicsmemory中,这明显是依赖硬件的。因此我们对QPixmap的使用需要格外注意。这也正是以上两段代码存在问题的根源。
那么Qt为什么要这么做呢?很简单,设计之初QPixmap就是用来加速显示的,例如我们在paint的时候用QPixmap就会比用其他类的效果好许多。
当使用上述代码显示较小图片的时候是没有问题的,图片都能在嵌入式设备上正确显示。但是当我们把图片换成一副较大图片287KB,1058x1058的“*.png”的时候就出现问题了,图片无法显示,程序的界面是一片空白。
据测算,“*.png”被完全解码后存储在graphicsmemory中会占用大约4.3MB的空间。如果此时还有其他加载的窗口和QPixmap,很可能就没有空间了。
使用QImage加载后转换成QPixmap显示
那么安全和正确的方法应该是什么呢?答案是我们需要用QImage做一下预处理:
//correctandrecommendedway
QImageimage;
image.load(":/pics/*.png");
QPainterpainter(this);
QpixmappixmapToShow=QPixmap::fromImage(image.scaled(size(),Qt::KeepAspectRatio));
painter.drawPixmap(0,0,pixmapToShow);
和QPixmap不同,QImage是独立于硬件的,它可以同时被另一个线程访问。QImage是存储在客户端的,对QImage的使用是非常方便和安全的。又由于QImage也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度。因此当图片较大时,我们可以先通过QImage将图片加载进来,然后把图片缩放成需要的尺寸,最后转换成QPixmap进行显示。下图是显示效果(图片是按照earth.png的原始尺寸比例缩放后显示的):
3.实现过程
数码相框采用Qimage优化图片尺寸,Qpixmap缓存绘图的方式。
分享到:
相关推荐
图像处理包括:灰度化、均值滤波、边缘检测、伽马变换、旋转镜像、亮度调节、二值化、对比度,饱和度调节、色彩调节、图片保存、水印等。 视频处理包括:二值化、边缘检测、灰度化、平滑、局部马赛克、缩放等。 此外...
Qt实战案例之利用QImage类实现对图像的简单处理(显示图像、灰度化处理),可参考文章:https://blog.csdn.net/didi_ya/article/details/122810276
软件包括了显示遥感图像,及鼠标拖动,随鼠标位置缩放,及部分栅格图像处理功能(图像锐化,平滑等),和显示矢量图像的功能。
这是我自己写的一个简单的数码相框程序,可给初学者参考
在qt creater环境下,进行图像处理的锐化
使用QT制作一个简单的数码相框,适合初学者。
Qt案例,利用QImage类实现对图像的基本操作,包括图像显示、图像缩放、图像旋转等,与滑动条配合使用,可参考文章:https://blog.csdn.net/didi_ya/article/details/122897518
尽管数码相框已经出现很多年,...数码相框通过液晶的屏幕来显示数字相片,可以通过读卡器接口从SD卡获取数字相片信息,并可设置循环显示方式,比普通相框更加灵活多变,也给日益增多的数码相片提供一个新的展示空间。
用QT的opengl显示图片,一个类的定义文件。
支持图像的放大缩小和移动,适合图像开发者的入门借鉴,支持高帧率相机的图像采集得显示。(必须得50个字的介绍)
总结了一些qt上图片的显示问题,以及关于qt国际化文件加载的问题,自己操作过的
利用Qt编写的简易图像处理程序,包括图像的边缘检测、放大缩小和几个常用的处理功能。
运用了OpenCV、C++、水果识别、Qt界面、颜色识别、边缘检测、图像处理 ,能够实现对不同种类水果进行识别分类。
代码实现:读取图片,显示图像,获取图片坐标及像素值进行显示(vs2013+qt5.3.0 x64环境)
QT与OPENCV进行数字图像处理
案例通过利用OpenCV进行图片的识别分析,计算判断图片与源数据是否一致,框架采用Qt+OpenCV实现,演示包可以直接分析使用
使用QT做界面下的采用opencv库编的图像处理软件,对于刚入门视觉学习,图像处理的人应该很有帮助,功能也比较全面,对于图像的基本处理都集成了,也可以根据自己需求添加相应功能;opencv为2.4.9其他版本的话可以...
使用QT做界面下的采用opencv库编的图像处理软件,对于刚入门视觉学习,图像处理的人应该很有帮助,功能也比较全面,对于图像的基本处理都集成了,也可以根据自己需求添加相应功能;opencv为2.4.9其他版本的话可以...
qt图像处理,文字处理软件(菜单+工具栏+鼠标事件+定时器)
基于S3C2410和Qt_Embedded的数码相框设计.pdf基于S3C2410和Qt_Embedded的数码相框设计.pdf基于S3C2410和Qt_Embedded的数码相框设计.pdf基于S3C2410和Qt_Embedded的数码相框设计.pdf基于S3C2410和Qt_Embedded的数码...