求大神,QImage要转为qpainter qpixmapp 怎样转

2433人阅读
&QImage 和 IplImage 之间转换问题:
常用方法:
这个对于IplImage向QImage转换是一个非常重要的功能!
因为我们可以用下面的语句直接从IplImage构造QImage, 避免重复复制数据.
彩色图像:
IplImage *img = cvLoadImage(&lena.jpg&, 1);
QImage qImage(img-&imageData, img-&width, img-&height,
img-&widthStep, QImage::Format_RGB888);
灰度图像:
IplImage *pImg2 = cvCreateImage(cvGetSize(pImg),8,1);
qimage((unsigned char * )pImg2-&imageDataOrigin,pImg2-&width,pImg2-&height,QImage::Format_Indexed8);
如果在显示 单通道灰度图 时,图像错位(斜偏移),
1、这时可以把 单通道& 转为 3通道 图。如下:
外部输入 disp 为&& 单通道CvMat矩阵
& IplImage&& img,& *pI
& pImg&& &=&& cvGetImage(&& disp,&&&& &img&& );
&&IplImage&&& *pImg2&& =&& cvCreateImage(& cvGetSize(pImg),& 8,& 3);
&&cvCvtColor(& &pImg,&&& pImg2,&&&& CV_GRAY2BGR );
&&QImage&&&
qimage( (unsigned char * )pImg2-&imageDataOrigin,&&& pImg2-&width,&& pImg2-&height,&&
QImage::Format_RGB888/*QImage::Format_Indexed8*/); //图像会错位
2、在初始化qimage 时,加上widthstep,如 上面彩色图像的转换。结果如下:
QImage qimage( (unsigned char * )pImg-&imageDataOrigin, pImg-&width, pImg2-&height, pImg-&widthStep, QImage::Format_Indexed8);
在 Qt 中显示:
int main ( int argc,&& char *argv[] )
&&&&&&& QApplication app(argc, argv);
&&&&&&& QWidget *window = new QW
&&&&&&& window-&setWindowTitle(&Enter your age&);
&&&&& //& QImage-------〉QPixmap-------〉QLabel
&&&&&& QLabel *label = new QL
&&&&& label-&setPixmap(lpmap.fromImage(qimage,0));
&&&&& QVBoxLayout *layout = new QVBoxL
&&&&&&&&layout-&addWidget(& label& );
&&&&&&& window-&setLayout(& layout& );
&&&&&&& window-&show();&
&&&&&&& return app.exec();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:178064次
积分:2136
积分:2136
排名:第8212名
原创:35篇
转载:27篇
评论:43条
(1)(2)(1)(1)(2)(2)(3)(2)(3)(2)(1)(5)(1)(1)(2)(2)(1)(1)(1)(2)(2)(3)(1)(1)(5)(13)(1)用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
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
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
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
image.load( &:/pics/earth.png& );
QPainter painter(this);
painter.drawImage(0,0, image);
下面是显示效果(当然我们也可以对其进行缩放之后再显示) 从图片可以看出来它是按照原始尺寸显示earth.png的:&
本代码已通过在N97和N8上的测试。
转 &&/s_agapo/archive//2395603.html
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31466次
排名:千里之外
转载:44篇
(1)(1)(1)(1)(1)(1)(1)(1)(2)(1)(3)(1)(1)(3)(2)(5)(1)(2)(10)(3)(1)(3)带你认识更牛的人下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我会很努力的干好每件事;
我会很负责的对待每个人;
我会很****************;
LOFTER精选
网易考拉推荐
阅读(3544)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084067',
blogTitle:'QPixmap和QImage相互转换和读取JPG文件',
blogAbstract:'CLoadImg.h类头文件:#ifndef CLOADIMG_H #define CLOADIMG_H
#include &QtGui/QtGui&
class CLoadImg : public QWidget { ',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我会很努力的干好每件事;\r\n我会很负责的对待每个人;\r\n我会很****************;',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}求大神,QImage要转为QPixmap 怎样转_百度知道
求大神,QImage要转为QPixmap 怎样转
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Qt可显示基本的图像类型,利用QImage、QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放、旋转)。
1. Qt可显示的图像类型
参考Qt的帮助文档,可支持的类型,即可以直接读取并显示的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。
2. Qt用如何显示图像
通常用QLabel显示图像,QLabel类有setPixmap()函数,可以用来显示图像。也可以直接用QPainter画出图像。
如果图像过大,直接用QLabel显示,将会出现有部分图像显示不出来,这时可以用Scroll Area部件。方法:将QLabel部件放到Scroll Area部件里面,将两个采用栅格布局,当图像超出了QLabel部件大小时,就会产生滑动杆,这样图像就可以都看到了。
3. 显示的方法
步骤:先打开一个图像;将图像文件加载进QImage对象中;再用QPixmap对象获得图像;最后用QLabel选择一个QPixmap图像对象显示。
代码如下:
filename=QFileDialog::getOpenFileName(this,
tr(&选择图像&),
tr(&Images (*.png *.bmp *.jpg *.tif *.GIF )&));
if(filename.isEmpty())
QImage* img=new QI
if(! ( img-&load(filename) ) ) //加载图像
QMessageBox::information(this,
tr(&打开图像失败&),
tr(&打开图像失败!&));
ui-&label-&setPixmap(QPixmap::fromImage(*img));
注:也可以直接用QPixmap类的对象采用Load函数加载图像。这里说下QImage和QPixmap类的用处:QImage为图像的像素级访问做了优化,QPixmap使用底层平台的绘制系统进行绘制,无法提供像素级别的操作,而QImage则是使用独立于硬件的绘制系统。
4. 图像缩放
图像缩放采用scaled函数。函数原型
QImage QImage::scaled ( const QSize & size,Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationModetransformMode = Qt::FastTransformation ) const
使用方法如下,还是利用上面的img:
QImage* imgScaled = new QImage;
*imgScaled=img-&scaled(width,
Qt::KeepAspectRatio);
ui-&label-&setPixmap(QPixmap::fromImage(*imgScaled));
scaled函数中width和height表示缩放后图像的宽和高,即将原图像缩放到(width,height)大小。
5. 图像旋转
图像旋转可以利用QImage类的transformed函数,向transformed函数传入QMatrix对象,QMatrix对象指定了旋转的角度。
代码如下:
QImage* imgRatate = new QI
matrix.rotate(270);
*imgRotate = img-&transformed(matrix);
ui-&label-&setPixmap(QPixmap::fromImage(*imgRotate));
注意:rotate函数中参数是旋转的角度,旋转是按顺时针方向旋转的,上面顺时针旋转270度,即逆时针旋转90度。
6. 图像连续缩放
有了图像缩放的基础,就可以实现图像的连续缩放,可以放置一个横向滑竿(中文解释不标准,就是Horizontal Slider部件 ),滑动滑轮的位置以实现图像连续缩放。
Horizontal Slider部件指向的值为整型value,即缩放后的图像为
img-&scaled(orignalWidth*value/100,
orignalHeight*value/100,
Qt::KeepAspectRatio);
orignalWidth和orignalHeight为原始图像的宽和高。
注意:在对原始图像进行缩放多少倍数时,在相应的槽函数内只需要调用Horizontal Slider部件对象的setValue函数即可,因为Horizontal Slider部件滑竿指向的值一旦变化就会触发对应的槽函数来对图像进行缩放。
[喝小酒的网摘]http://blog./a/10356.htm
原文:[喝小酒的网摘]http://blog./a/10356.htm
移植了Qtopia4.4.3,但是想要自己在这套框架上添加自己的一些应用,遇到了一些问题,经过研究问题终于得到解决,现分享给大家!!!
可能大家都知道,Qtopia默认编译是没有包含对QFileDialog这个类配置与编译的,所以如果大家在自己的应用程序中如果有用到QFileDialog这个类,那么不好意思,你的应用程序是无法编译通过的。经常出现的错误如下:
FileInformation.h
/********************************************************************
created: 10:4:2012
F:C++FileInformationFileInformationf
在Qt中经常会涉及到界面字体大小的设置,默认字体一般比较小,特别是在移植到开发板上进行显示一般都要放大字体,因为开发板上液晶显示屏幕分辨率都是非常的小,跟电脑显示有很大差别。
一种整体界面字体设置的方法:
在main函数中添加程序:
QFont font
= a参考文献
[1] 程秉辉,JohnHawke. Windows编程实战-基础练功篇.科学出版社,2005
[2]CHARLESPETZOLD.WINDOWS程序设计(第5版).北京博彦科技发展有限责任公司
译.北京大学出版社,2004
[3]BruceEckel.Thin附录C&&&&&& Qt资源
C.1Qt官方资源
&&& 全球各大公司以及独立开发人员每天都在加入 Qt的开发社区。他们已经认识到了Qt
的架构本身便可加快应用程序开发进度。这些开发人员,无论是想开发单平台软件、还
IP:222.205.11.105:qt中怎么显示bmp的图像IP:59.41.252.230:QT 读取 图片格式IP:218.17.164.121:label->setPixmapIP:219.224.167.214:QT QImage 显示IP:122.73.39.235:QT读取BMP文件IP:221.10.50.238:Qt实现图像浏览IP:115.61.182.164:qt Label
pixmapIP:222.71.92.235:QImage 像素IP:180.168.172.195:QT 显示bmp图片IP:121.8.171.101:setPixmapIP:14.144.160.9:QFileDialog 字体大小IP:175.167.197.20:qt4如何实现背景图片的缩放IP:116.25.65.98:qt 图像旋转IP:60.191.94.118:QPixmap::load( .jpg) file 失败IP:147.250.223.122:qpixmap load 失败 windowsIP:61.183.59.199:用Qpixmap::scrollIP:59.46.115.74:pixmap.fromImage(image);IP:220.133.3.71:setPixmap( QPixmap::fromImage sizeIP:183.62.6.132:qt
label无法缩放图像IP:162.105.71.173:QImage 像素操作IP:199.76.167.151:ui->imagelabel->setpixmap(qpixmap::fromimage(image));思IP:199.76.149.148:ui->label->setpixmap(qpixmap::fromimage(imagec));思IP:182.242.225.8:qtopia中没有qfiledialogIP:114.246.141.229:QT 读取BMP图片并在界面上显示IP:59.46.115.74:qlabel 显示bmpIP:222.66.117.84:QT label pixmap 按比例缩放IP:183.221.12.55:qt图像进度IP:114.220.65.200:Qt如何对像素操作IP:222.190.117.200:QT fromimage()IP:222.190.117.200:QT fromimage}

我要回帖

更多关于 qpixmap 缩放 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信