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

有什么解决办法吗?

4

3 回答 3

5

您没有创建有效的图像。

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中就是这样的),所以它基本上允许你传递任何对象,如果内部不能转换为a就忽略它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()

于 2013-07-16T13:52:45.650 回答
1

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

pixmap = self.canvas.grab()
QApplication.clipboard().setPixmap(pixmap)
于 2019-06-18T15:26:05.143 回答
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())存储当前图形一样使用它。

于 2016-06-16T16:27:39.913 回答