【问题标题】:Python - matplotlib - PyQT: Copy image to clipboardPython - matplotlib - PyQT:将图像复制到剪贴板
【发布时间】:2013-07-14 14:58:30
【问题描述】:

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

有什么解决办法吗?

【问题讨论】:

    标签: python matplotlib pyqt


    【解决方案1】:

    您没有创建有效的图像。

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

    【讨论】:

    • 谢谢,它有效!现在唯一困扰我的是图形颜色在保存的图像文件中更改回默认颜色,而在屏幕上根据需要有不同的颜色。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-29
        • 2023-03-11
        • 2010-11-07
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 2021-07-27
        • 1970-01-01
        相关资源
        最近更新 更多