在不显示 QImage 的矩形上绘制
Draw on a rects on a QImage without Showing it
我想在 QImage 上方绘制矩形并将结果保存为 png。下面的最小示例应该可以做到这一点。
from PyQt5.QtGui import QImage, QColor, QPainter, QBrush
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
import sys
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.title = "PyQt5 Drawing Tutorial"
self.top = 150
self.left = 150
self.width = 500
self.height = 500
self.mypainter = MyPainter()
self.mypainter.create()
self.InitWindow()
def InitWindow(self):
self.setWindowTitle(self.title)
self.setGeometry(self.top, self.left, self.width, self.height)
self.show()
class MyPainter(QWidget):
def __init__(self):
super().__init__()
self.img = QImage(25, 25, QImage.Format_RGBA64)
self.color1 = QColor(255, 0, 0, 255)
self.color2 = QColor(0, 255, 0, 255)
self.color3 = QColor(0, 0, 255, 255)
self.boxes = (
(2, 2, 10, 10),
(5, 5, 4, 5),
(10, 10, 10, 7))
def create(self):
self.colors = (
self.color1,
self.color2,
self.color3)
for idx, box in enumerate(self.boxes):
self.color = self.colors[idx]
self.bndboxSize = box
self.repaint()
self.img.save("myImg.png")
def paintEvent(self, event):
painter = QPainter(self)
painter.drawImage(self.rect(), self.img)
painter.setBrush(QBrush(self.color))
painter.drawRect(self.bndboxSize)
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
如我所料
黑色背景也可以是透明的。
我得到了什么
这只是一张带有 alphachannel 的图片,如果您将鼠标悬停,您将获得 link
我得到了什么(调试模式)
我不知道如何获得想要的图像。
如果你想创建一个图像,那么没有必要使用小部件,但你必须使用 QPainter 在 QImage 上绘制。在 OP 的尝试中,它被绘制在 QWidget 上,而 QImage 只有噪音。
from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QColor, QGuiApplication, QImage, QPainter
def create_image():
img = QImage(25, 25, QImage.Format_RGBA64)
img.fill(Qt.black)
painter = QPainter(img)
colors = (QColor(255, 0, 0, 255), QColor(0, 255, 0, 255), QColor(0, 0, 255, 255))
boxes = (QRect(2, 2, 10, 10), QRect(5, 5, 4, 5), QRect(10, 10, 10, 7))
for color, box in zip(colors, boxes):
painter.fillRect(box, color)
painter.end()
return img
def main():
app = QGuiApplication([])
qimage = create_image()
qimage.save("myImg.png")
if __name__ == "__main__":
main()
输出:
我想在 QImage 上方绘制矩形并将结果保存为 png。下面的最小示例应该可以做到这一点。
from PyQt5.QtGui import QImage, QColor, QPainter, QBrush
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
import sys
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.title = "PyQt5 Drawing Tutorial"
self.top = 150
self.left = 150
self.width = 500
self.height = 500
self.mypainter = MyPainter()
self.mypainter.create()
self.InitWindow()
def InitWindow(self):
self.setWindowTitle(self.title)
self.setGeometry(self.top, self.left, self.width, self.height)
self.show()
class MyPainter(QWidget):
def __init__(self):
super().__init__()
self.img = QImage(25, 25, QImage.Format_RGBA64)
self.color1 = QColor(255, 0, 0, 255)
self.color2 = QColor(0, 255, 0, 255)
self.color3 = QColor(0, 0, 255, 255)
self.boxes = (
(2, 2, 10, 10),
(5, 5, 4, 5),
(10, 10, 10, 7))
def create(self):
self.colors = (
self.color1,
self.color2,
self.color3)
for idx, box in enumerate(self.boxes):
self.color = self.colors[idx]
self.bndboxSize = box
self.repaint()
self.img.save("myImg.png")
def paintEvent(self, event):
painter = QPainter(self)
painter.drawImage(self.rect(), self.img)
painter.setBrush(QBrush(self.color))
painter.drawRect(self.bndboxSize)
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
如我所料
黑色背景也可以是透明的。
我得到了什么
这只是一张带有 alphachannel 的图片,如果您将鼠标悬停,您将获得 link
我得到了什么(调试模式)
我不知道如何获得想要的图像。
如果你想创建一个图像,那么没有必要使用小部件,但你必须使用 QPainter 在 QImage 上绘制。在 OP 的尝试中,它被绘制在 QWidget 上,而 QImage 只有噪音。
from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QColor, QGuiApplication, QImage, QPainter
def create_image():
img = QImage(25, 25, QImage.Format_RGBA64)
img.fill(Qt.black)
painter = QPainter(img)
colors = (QColor(255, 0, 0, 255), QColor(0, 255, 0, 255), QColor(0, 0, 255, 255))
boxes = (QRect(2, 2, 10, 10), QRect(5, 5, 4, 5), QRect(10, 10, 10, 7))
for color, box in zip(colors, boxes):
painter.fillRect(box, color)
painter.end()
return img
def main():
app = QGuiApplication([])
qimage = create_image()
qimage.save("myImg.png")
if __name__ == "__main__":
main()
输出: