QPixmap/QImage/QPicture

QImage与Qpixmap的区别

1、QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的

2、QPixmap依赖于所在的平台的绘图引擎,故例如反锯齿等一些效果在不同的平台上可能会有不同的显示效果,QImage使用Qt自身的绘图引擎,可在不同平台上具有相同的显示效果

3、目前的Qt会把QPixmap都存储在graphics memory中,QImage是存储在客户端的,是独立于硬件的。在 X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客户端,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资源。

4、由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度。

5、QImage可通过setPixpel()和pixel()等方法直接存取指定的像素,Qt的文档中有如下例程:


QImage image(3, 3, QImage::Format_RGB32);

QRgb value;

value = qRgb(189, 149, 39);

image.setPixel(1, 1, value);

value = qRgb(122, 163, 39);

image.setPixel(0, 1, value);

image.setPixel(1, 0, value);

value = qRgb(237, 187, 51);

image.setPixel(2, 1, value);


QPixmap、QImage、QBitmap和QPicture - Elerao - Static Elerao

·QImage的显示

·QPainter中绘制QImage的接口原型:

void QPainter::drawImage ( int x, int y,

const QImage & image,

int sx = 0, int sy = 0,

int sw = -1, int sh = -1,

Qt::ImageConversionFlags flags = Qt::AutoColor )

其中x和y为绘制位置,sx和sy是指图像左上角的坐标,sw和sh是指定了图像的大小,如果都为0或负数,就显示完整个图像。

QImage image;

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

QPainter painter(this);

painter.drawImage(0,0, image);

·当图片较大时,我们可以先通过QImage将图片加载进来,然后把图片缩放成需要的尺寸,最后转换成QPixmap 进行显示。

QImage image;

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

QPainter painter(this);

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

painter.drawPixmap(0,0, pixmapToShow);

·QBitmap与QPixmap

·QBitmap是QPixmap的一个子类,主要用于显示单色位图。用于制作游标QCursor或笔刷QBrush等,图像显示对比如下

QPixmap pixImg("caterpillar.jpg");

QBitmap bitImg("caterpillar.jpg");

QPainter painter(this);

painter.drawPixmap(0, 0, pixImg);

painter.drawPixmap(200, 0, bitImg);


QPixmap、QImage、QBitmap和QPicture - Elerao - Static Elerao

·QPicture

·QPicture则是一个绘图装置,用于记录和重播Qpainter的绘图指令。

·使用begin()方法在QPicture上进行绘图,使用end()结束绘图,使用save()保存至档案

QPicture picture;

QPainter painter;

painter.begin(&picture);

painter.drawRect(10, 20, 100, 50);

painter.end();

picture.save("draw_record.pic");

需重播绘图指令的话,新建一个QPicture对象,使用load()重新载入保存的档案,然后再在指定的绘图设备QDevice上绘制QPicture:

QPicture picture;

picture.load("draw_record.pic");

QPainter painter;

painter.begin(this);

painter.drawPicture(0, 0, picture);

painter.end();

在QT中进行图像的加载优化以及绘图过程的记录,首先需要理解QT的绘图设备概念和它们之间的关系。QPixmap作为专门用于显示图像的类,提供了高效的图像缓冲机制,而在进行图像处理时,QImage则提供了对像素进行直接操作的能力。为了有效地利用这些特性,你可以采取以下步骤: 参考资源链接:[深入浅出QT绘图:设备、图像优化像素操作](https://wenku.csdn.net/doc/578eenmos7?spm=1055.2569.3001.10343) 1. 加载图像:使用QPixmap的load()函数加载需要显示的图像文件,或者使用QImage的load()函数加载图像到内存中进行处理。 2. 图像优化:为了优化显示速度和性能,可以对QPixmap进行缩放处理,例如使用scaled()函数。另外,如果对显示质量要求不高,可以考虑降低图像的分辨率,使用QPixmap的fromImage()函数来创建一个新的、尺寸更小的QPixmap对象。 3. 像素操作:利用QImage的bits()方法获取图像的像素数据,然后根据需要进行像素级的操作。例如,进行颜色转换时,可以遍历像素数组,根据转换规则修改每个像素值。 4. 记录绘图过程:使用QPicture的begin()函数开始记录绘制操作,然后在需要记录的绘图代码中调用QPainter进行绘制。当绘制完成后,使用end()方法结束记录。之后,可以在任何支持QPainter的绘图设备上重现绘制过程。 在实际操作中,需要注意的是,QPixmap优化显示的关键在于减少图像的内存占用和提高显示效率,而QImage像素操作则更注重图像处理的灵活性和准确性。QPicture则提供了一种记录和重现绘图命令的方法,便于跨设备和平台使用。 为了更好地掌握这些知识点,推荐参考《深入浅出QT绘图:设备、图像优化像素操作》这本书。它详细讲解了QT中绘图设备的使用,QPixmapQImage的优化和像素级操作,以及QPicture在记录绘图过程中的应用。通过阅读这本书,你可以系统地学习和实践QT绘图技术,从而在图形界面设计和图像处理方面达到更高的水平。 参考资源链接:[深入浅出QT绘图:设备、图像优化像素操作](https://wenku.csdn.net/doc/578eenmos7?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值