如何打印 QImage 的当前像素?

How to print current pixel of an QImage?

我有一个RGB888格式的qImage定义如下:

int sizeX = 300; int sizeY = 300;
QImage img = QImage(sizeX, sizeY, QImage::Format_RGB888);

我想一张一张打印img的当前像素。所以,我按照这里的例子:`

 for(int i=0; i<sizeX; i++){
 for(int j=0; j<sizeY; j++){
       img.setPixel(i, j, qRgb(rand()%256, rand()%256, rand()%256));
    }
}
QGraphicsScene *graphic = new QGraphicsScene(this);
graphic->addPixmap(QPixmap::fromImage(img));
ui->graphicsView->setScene(graphic);

但是它打印了整个 QImage。我想一张一张打印。 谢谢。最好的问候。

正如 JarMan 评论的那样,您正在寻找“动画”。

逐像素绘制,并为每个像素更新 UI,可以使用 中描述的动画解决方案。

在Qt5中我们必须执行QtWidgets.QApplication.processEvents()来强制Qt重绘。

注:
我在Python(使用PyQt5)中实现了代码,语法与C++不同,但概念是相同的。

初始化阶段:

  • 主要class继承自QGraphicsView class.
  • 创建 QGraphicsScene 对象:
    graphic = QGraphicsScene(0, 0, sizeX, sizeY)
  • 从图像创建 QPixmap 对象:
    pixmap = QPixmap.fromImage(img)
  • 将addPixmap添加到graphic对象,并保留返回的引用:
    pixmap_item = graphic.addPixmap(pixmap)
  • 执行setScene(graphic)

动画:
在动画循环中,我们必须在每次迭代时执行 setPixmap 以更新整个图像。
(这是一种逐像素绘制的方法,但这与您的问题有偏差)。

更新图像的简化代码(每次迭代执行):

img.setPixel(i, j, qRgb(randrange(256), randrange(256), randrange(256)));
pixmap = QPixmap.fromImage(img)
pixmap_item.setPixmap(pixmap)
QtWidgets.QApplication.processEvents()

完成Python代码示例:

import sys
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QApplication
from PyQt5 import QtWidgets
from PyQt5.QtGui import QImage, QPixmap, QPainter, QColor, qRgb
from random import randrange
import time

class Example(QGraphicsView):
    def __init__(self):
        super().__init__()
        self.mPixmap = QPixmap()
        self.sizeX = 300
        self.sizeY = 300
        self.img = QImage(self.sizeX, self.sizeY, QImage.Format_RGB888)
        self.img.fill(QColor(60, 60, 60))  # Fill image with gray color
        self.initUI()

    def initUI(self):
        self.graphic = QGraphicsScene(0, 0, self.sizeX, self.sizeY)

        self.pixmap = QPixmap.fromImage(self.img)
        self.pixmap_item = self.graphic.addPixmap(self.pixmap)

        self.setScene(self.graphic)
        self.show()

    def doAnimation(self):
        for i in range(self.sizeX):
            for j in range(self.sizeY):
                self.img.setPixel(i, j, qRgb(randrange(256), randrange(256), randrange(256)));
                pixmap = QPixmap.fromImage(self.img)
                self.pixmap_item.setPixmap(pixmap)

                QtWidgets.QApplication.processEvents()
                time.sleep(0.001)  # Sleep 1msec (In Python it's slow enough without the sleep...)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Example()
    example.doAnimation()
    app.exec_()

我希望这对你来说不是太多 Python...


示例输出: