Python - matplotlib - PyQT:将图像复制到剪贴板

3
我希望能将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

有什么解决方案吗?
3个回答

5

您未创建有效的图像。

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()


谢谢,它有效!现在唯一困扰我的是,在保存的图像文件中,图形颜色被改回默认颜色,而在屏幕上则与期望的不同。 - Jomme

2
除了@mata的回答之外,针对更新,由于QPixmap.grabWidget现已过时,我们可以使用以下方法:
pixmap = self.canvas.grab()
QApplication.clipboard().setPixmap(pixmap)

我非常感谢你为这个问题提供的简单解决方案。这对我真的很有效。 - Yong Hwan Kim

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())来存储当前图形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接