您未创建有效的图像。
im = QImage(self.canvas.buffer_rgba())
实际上,它忽略了你传递的参数。canvas.buffer_rgba()
返回一个memoryview,而任何一个可用的构造函数都不能处理这个memoryview:
QImage()
QImage(QSize, QImage.Format)
QImage(int, int, QImage.Format)
QImage(str, int, int, QImage.Format)
QImage(sip.voidptr, int, int, QImage.Format)
QImage(str, int, int, int, QImage.Format)
QImage(sip.voidptr, int, int, int, QImage.Format)
QImage(list-of-str)
QImage(QString, str format=None)
QImage(QImage)
QImage(QVariant)
在Python中,实际上只有一个
__init__
方法,因此类型检查必须通过内部检查来完成。
QImage(QVariant)
基本上与
QImage(object)
相同(事实上,在Python3中,它就是这样),因此它允许您传递任何对象,如果无法转换为
QVariant
,则会被忽略,因此返回的QImage将为空。
如果您想从原始rgba数据构造图像,则需要指定其大小,因为无法从原始数据获取此信息,以及格式。 这应该可以工作:
size = self.canvas.size()
width, height = size.width(), size.height()
im = QImage(self.canvas.buffer_rgba(), width, height, QImage.Format_ARGB32)
im.save('test.png')
另一种方法是直接将画布作为位图抓取:
pixmap = QPixmap.grabWidget(self.canvas)
pixmap.save('test.png')
保存到剪贴板:
QApplication.clipboard().setPixmap(pixmap)
哦,并且你不应该使用gif
格式,应该使用png
格式。由于它的专有性质,gif
格式通常不会作为支持的输出格式提供。请检查QImageWriter.supportedImageFormats()
。