您没有创建有效的图像。
im = QImage(self.canvas.buffer_rgba())
实际上忽略了您传递的参数。 canvas.buffer_rgba() 返回一个内存视图,available constructors 都不能使用它:
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()。