繁体   English   中英

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

[英]Python - matplotlib - PyQT: Copy image to clipboard

我想将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

有解决方案吗

您没有创建有效的图像。

im = QImage(self.canvas.buffer_rgba())

实际上忽略了你传递的论点。 canvas.buffer_rgba()返回一个内存视图,没有任何可用的构造函数可以使用:

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

在交互式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())一样使用它来存储当前的数字。

除了@mata回答之外,对于更新,由于QPixmap.grabWidget现在已经过时,我们可以使用:

pixmap = self.canvas.grab()
QApplication.clipboard().setPixmap(pixmap)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM