2011年的文章,好老。。。。

(一)QPixmap和QImage的区别

QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是为I/O,为图片像素访问以及修改而设计的。如果你想访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素。另外跟QImage不同是,QPixmap跟硬件是相关的,如X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客户端,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资源。

相信大家更关心的是谁比较快,哈哈,现在来总结一下:

在X11, Mac 以及 Symbian平台上,QImage: 因为它是存储在客户端,往QImage上绘图比较快,但显示它则比较慢。QPixmap: 因为它是存储在服务器端,往QPixmap上绘图比较慢,但显示它则比较快。但在Windows平台上则是是一样的,因为它们都存储在客户端。

Qt上图片处理使用QPixmap和QImage时最多了,不过既然谈到图片了,我们把其他几个图片处理类也说一下:

QBitmap只是一个继承于QPixmap的简单类,它可以确保图片深度为1。

QBitmap是QPixmap的子类,提供单色图像,可以用来制作游标(QCursor)或者笔刷(QBrush)。

QPicture是一个绘画设备类,它记录了并可以重演QPainter的命令。你可以使用QPainter的begin()方法,指定在QPicture上绘图,使用end()方法结束绘图,使用QPicture的save()方法將QPainter所使用过的绘图指令存至档案。要重播绘图指令的话,建立一個QPicture,使用load()方法载入绘图指令的档案,然后在指定的绘图裝置上绘制QPicture:

(二)QImage与QPixmap完全解析

用Qt程序在手机上显示一幅图片对编程人员来说是再基础不过的一件事情了。那么先让大家看两段代码:

//dangerous should not be used, cannot display earth.png,

//but if we change earth.png to a smaller image e.g. apple.png, apple.png can be displayed

QPixmap pixmap;

pixmap.load( ":/pics/earth.png" );

label->setPixmap( pixmap );

//dangerous should not be used, cannot display earth.png,

//but if we change earth.png to a smaller image e.g. apple.png, apple.png can be displayed

QPixmap pixmap;

pixmap.load( ":/pics/earth.png" );

QPainter painter(this);

painter.drawPixmap(0,0, pixmap);

大家认为这两段代码有什么问题吗? 看起来好像没什么问题啊。是的,在Windows操作系统上是没有问题的。问题是我们做的是Qt for Symbian! 手机上的资源本来就是比较紧缺的,所以我们使用的时候就需要更加注意。 Qt 为我们提供了四个处理图像的类:QImage,QPixmap,QBitmap 和QPicture。其中前两个是最常使用的。

本文就通过一个例子,一步一步为大家讲解QImage与QPixmap的使用奥秘,在此过程中为大家揭示以上代码存在的缺陷。

QPixmap依赖于硬件

首先需要知道的是QPixmap的具体实现是依赖于系统的。在Symbian系统上QPixmap是被存放在Server端的。

目前的Qt会把QPixmap都存储在graphics memory中,这明显是依赖硬件的。因此我们对QPixmap的使用需要格外注意。这也正是以上两段代码存在问题的根源。

那么Qt为什么要这么做呢?很简单,设计之初QPixmap就是用来加速显示的,例如我们在paint的时候用QPixmap就会比用其他类的效果好许多。

现在回到我们最初的问题,以上代码到底有什么问题呢?我们可以先用本文提供的例子程序做个试验。当使用上述代码显示较小图片的时候(比如例子程序中的background.png 和apple.png)是没有问题的,图片都能在手机上正确显示。

但是当我们把图片换成一副较大图片287KB,1058 x 1058的“earth.png”的时候就出现问题了,图片无法显示,程序的界面是一片空白。

据测算,“earth.png”被完全解码后存储在graphics memory中会占用大约4.3MB的空间。如果此时还有其他加载的窗口和QPixmap,很可能就没有空间了。

使用QImage加载后转换成QPixmap 显示

那么安全和正确的方法应该是什么呢?答案是我们需要用QImage做一下预处理:

//correct and recommended way

QImage image;

image.load( ":/pics/earth.png" );

QPainter painter(this);

QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::KeepAspectRatio) );

painter.drawPixmap(0,0, pixmapToShow);

和QPixmap 不同,QImage是独立于硬件的,它可以同时被另一个线程访问。QImage是存储在客户端的,对QImage的使用是非常方便和安全的。 又由于 QImage 也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI 线程中处理,使用这一方式可以很大幅度提高UI响应速度。 因此当图片较大时,我们可以先通过QImage将图片加载进来,然后把图片缩放成需要的尺寸,最后转换成QPixmap 进行显示。 下图是显示效果(图片是按照earth.png的原始尺寸比例缩放后显示的):

其中需要注意的是Qt::KeepAspectRatio的使用,默认参数是Qt::IgnoreAspectRatio,如果我们在程序中这么写:

QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::IgnoreAspectRatio) );

效果就是下面这个样子,earth.png被拉伸以充满整个屏幕:

直接使用QImage 显示

我们也可以直接使用QImage做显示,而不转换成QPixmap ,这要根据我们应用的具体需求来决定,如果需要的话我们可以这么写:

//correct, some times may be needed

QImage image;

image.load( ":/pics/earth.png" );

QPainter painter(this);

painter.drawImage(0,0, image);

下面是显示效果(当然我们也可以对其进行缩放之后再显示) 从图片可以看出来它是按照原始尺寸显示earth.png的:

测试设备

本代码已通过在N97和N8上的测试。

qpixmap mysql_QPixmap和QImage的区别及剖析相关推荐

  1. QImage、 QPixmap、 QBitmap、 QPicture区别

    QImage QImge类被设计和优化为了I/O操作.直接访问和操作像素.其优势在于:通过I/O访问图片很方便.效率很高,对图片进行访问操作很方便 QPixmap QPixmap类被设计和优化为了在屏 ...

  2. Oracle 数据库、Microsoft SQL Server、MySQL 数据库三种常见数据库的区别深度剖析

    文章目录 前言 一.ORACLE 数据库 二.Microsoft SQL Server 数据库 三.MySQL 数据库 总结 前言 Oracle 数据库.Microsoft SQL Server.My ...

  3. php v11跟v14区别,内幕剖析评测戴森v11absolute和fluffy有何区别?哪个好?亲身体验诉说...

    两个戴森v11absolute和fluffy区别不是很大的哈,款式和配置是差不多的,只是说戴森V11 Fluffy Extra更强一些,看个人喜欢吧,我自己用的是戴森V11 Fluffy Extra, ...

  4. 黑莓9000和9900哪个好_黑莓9900和9930的区别大剖析【详细介绍】

    现在的手机越来越高级,一代比一代高配置.很多人问黑莓9900和9930的区别在哪里?黑莓9900比9930早出一年.但是很多功能比黑莓9930少很多.功能不同自然参数是不相同的了,黑莓9900和993 ...

  5. .ne和php区别,深度剖析曝光松下吹风机ne62与wne6c哪个好?有什么区别?真实评测体验曝光...

    松下吹风机ne62与wne6c哪个好?有没有区别?这二款区别不大的哈,款式和配置是差不多的,这两个家用是足够了的,看个人喜欢吧,我自己用的是松下EH-WNE6C,款式是我喜欢的,造型很别致, 整体看着 ...

  6. linux中线程和进程的区别深度剖析底层实现

    文章目录 前言 Linux中进程和线程的共性 Linux中进程的创建 Linux中线程的实现 总结 前言 在没有仔细了解过Linux的进程和线程实现机制之前,看过很多关于进程和线程的博客,从这些博客中 ...

  7. QImage与Qpixmap的区别

    1.QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O.图片访问和像素修改而设计的 2.QPixmap依赖于所在的平台的绘图引擎,故例如反锯齿等一些效果在不同的平台 ...

  8. Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转

    Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...

  9. QImage与QPixmap完全解析 转:http://blog.csdn.net/jiong_1988/article/details/7472159

    用Qt程序在手机上显示一幅图片对编程人员来说是再基础不过的一件事情了.那么先让大家看两段代码: //dangerous should not be used, cannot display earth ...

最新文章

  1. SpreadJS 类Excel表格控件 - V12 新特性详解
  2. android bitmap 占用内存大小,drawable与bitmap内存占用大小
  3. ALV 后台输出时,增加spool假脱机的宽度
  4. 使用TWebBrowser组件保存网页为html和mht文件 收藏
  5. mysql 禁用查询缓存 query cache
  6. SQL存储过程中调用存储过程返回的表
  7. Apache虚拟主机指南
  8. 嵌套矩形——DAG上的动态规划
  9. LeetCode 1119. 删去字符串中的元音
  10. b树c语言,B树——思路、及C语言代码的实现
  11. 手机快充功能到底是充电头的功劳还是线的功劳?
  12. Cisco策略路由(policy route)精解(转载)
  13. netdevice - 底层访问 Linux 网络设备
  14. 银行系统总体架构\银行核心系统\常用金融名词解释
  15. 计算机固态硬盘装系统,固态硬盘如何装系统
  16. css3三角形兼容_CSS三角的写法(兼容IE6)
  17. 织梦首页php打开慢,DEDECMS网站打开速度慢解决方法
  18. CE 无法搜索中文字符串变量的解决办法
  19. leetcode146. LRU Cache
  20. java list 索引值_List中固定某个索引的值-简单替换位置

热门文章

  1. Android Hook原理分析--Xposed hook 原理分析
  2. linux运行xampp,Linux安装Xampp教程
  3. 美科技巨头每秒能赚多少钱?苹果11376元、谷歌6691元
  4. 40k~65k, 区块链架构师技能包一览: 多语言、多平台、多算法...别慌, 先投简历再说...
  5. 路由器 虚拟网服务器,虚拟路由器的功能有哪些?蒲公英路由器实现虚拟网组建...
  6. 路由器WAN和LAN接口的区别
  7. Cosmic Rays(最短路变形)
  8. 计算机专业 英语六级作文,英语六级作文范文 计算机和人 Computer and Man
  9. 寒武纪2019秋招嵌入式软件开发笔试-牛客网刷题
  10. lvm镜像卷【存储】