Python-matplotlib-PyQT : Copy image to clipboard

标签 python matplotlib pyqt

我想将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() 返回一个内存 View ,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')

另一种方法是直接将 Canvas 作为像素图抓取:

pixmap = QPixmap.grabWidget(self.canvas)
pixmap.save('test.png')

保存到剪贴板:

QApplication.clipboard().setPixmap(pixmap)

哦,你不应该使用gif,使用png。由于其专有性质,gif 通常不能用作受支持的输出格式。检查 QImageWriter.supportedImageFormats()

关于Python-matplotlib-PyQT : Copy image to clipboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17676373/

相关文章:

python - 计算一系列的总和?

python - 通过 matplotlib 图向后和向前滚动

python - Matplotlib pyplot 符号学因特定数据而被破坏

qt - QGraphicsObject 上的 deleteLater 与 removeItem

python - 为什么Python服务器只能接收一次

python - 在 sleep 期间安全地重新启动Python程序?

javascript - 将 Javascript 中完成的字节字符串创建复制到 Python 2.7 中

python - Mac OSX - 属性错误 : 'FigureCanvasMac' object has no attribute 'restore_region'

python - 如何更新pyqt中的图表之类的东西

python - PyQt5:绘制新图形时维护以前绘制的图形/线