我想将matplotlib的当前图形复制到剪贴板:
这段代码不起作用(出于测试目的,我想稍后将位图保存到磁盘上,我会将它用作位图图像。我想从一个内存位图开始,我可以使用它QT的QImage,QPixmap,QBitmap或其他一些QT级)。
rgba = self.canvas.buffer_rgba()
im = QImage(self.canvas.buffer_rgba())
print(im.depth()) # --> 0
print(im.save('test.gif',r'GIF')) # ---> False
任何解决方案?
答案 0 :(得分:3)
您没有创建有效的图片。
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()
。
答案 1 :(得分:0)
在交互式Python shell中工作时,您可以使用像这样的函数
def to_clipboard(fig):
QApplication.clipboard().setImage(QPixmap.grabWidget(fig.canvas).toImage())
print('figure %d copied to clipboard' % fig.number)
然后像to_clipboard(gcf())
一样使用它来存储当前数字。
答案 2 :(得分:0)
除了@mata答案之外,对于更新,由于QPixmap.grabWidget现在已过时,我们可以使用:
pixmap = self.canvas.grab()
QApplication.clipboard().setPixmap(pixmap)