如何打印 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...
示例输出:
我有一个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...
示例输出: