QT图像类的选择与处理(数码相框优化图片显示)

1.文档目的

数码相框主要功能是播放照片,所以,照片的播放效果以及画面的清晰度显然是我们首要考虑的问题,但是在嵌入式设备中由于硬件的局限性,所以需要对图片的显示方法进行针对性的优化。而本文档编写目的在于分析QT中的几个基本图片类,从而从中找出能适合并具有较好显示效果的图片显示方法。

2.资料分析

Qt提供给了4个图像类:QImage/QPixmap/QBitmap/Qpicture。

QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmapQImage则是为I/O,为图片像素访问以及修改而设计的。如果需要访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素。另外跟QImage不同是,QPixmap跟硬件是相关的,如X11,Mac以及Embedded平台上,QPixmap是存储在服务器端,而QImage则是存储在客户端;在X11,Mac以及Embedded平台上,QImage:因为它是存储在客户端,往QImage上绘图比较快,但显示它则比较慢。QPixmap:因为它是存储在服务器端,往QPixmap上绘图比较慢,但显示它则比较快

QBitmap只是一个继承于QPixmap的简单类,它可以确保图片深度为1QBitmapQPixmap的子类,提供单色图像,可以用来制作游标(QCursor)或者笔刷(QBrush

QPicture是一个绘画设备类,它记录了并可以重演QPainter的命令。你可以使用QPainterbegin()方法,指定在QPicture上绘图,使用end()方法结束绘图,使用QPicturesave()方法將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缓存绘图的方式。

QDir picdir(nPicdir); QStringList filters; filters << "*.bmp" << "*.jpg" << "*.png"<<"*.gif"; picdir.setNameFilters(filters); QFileInfoList list = picdir.entryInfoList(); QFileInfo fileInfo = list.at(0); QString path=fileInfo.filePath(); QImage image; image.load(path); double showwidth= static_cast(width()); double showheight= static_cast(height()); m_pixmap =QPixmap::fromImage(image.scaled(showwidth, showheight,Qt::KeepAspectRatio));

 
   

你可能感兴趣的:(QT图像类的选择与处理(数码相框优化图片显示))