gpt4 book ai didi

python - 以更高的分辨率将 matplotlib 图复制到 QClipboard

转载 作者:行者123 更新时间:2023-11-28 19:05:35 27 4
gpt4 key购买 nike

在 pyQt 应用程序中,我正在将 matplotlib 图形 (self.canvas) 复制到 QClipboard 实例中,使用其中之一

cb = QClipboard(self)
img = QImage(self.canvas.grab())
cb.setImage(img)

img = QPixmap(self.canvas.grab())
self.cb.setPixmap(img)

两者都很好,但是,我无法控制导出图像的分辨率。这可以通过创建和导出临时文件来实现,但是,这很慢并且由于文件系统限制而存在潜在问题:

self.canvas.figure.savefig(self.temp_file, dpi = 300, type = 'png')
temp_img = QImage(self.temp_file)
cb.setImage(temp_img)

那么,有没有办法在不绕过文件系统的情况下设置复制图片的分辨率呢?

------------------------------------

编辑:我刚刚发现上述内容在 pyqt4 下不起作用。相反,您可以使用

img = QPixmap.grabWidget(self.canvas)
self.cb.setPixmap(img)

------------------------------------

编辑:另一个几乎可行的解决方案是以下代码,不幸的是它改变了颜色(回到 matplotlib 默认值?):

# construct image from raw rgba data, this changes the colormap:
size = self.canvas.size()
width, height = size.width(), size.height()
im = QImage(self.canvas.buffer_rgba(), width, height, QImage.Format_ARGB32)
self.cb.setImage(im)

最佳答案

以下是一个不完整的答案。因此,仍然欢迎进一步的答案,使这个完整的或替代的解决方案。

您可以不将图像保存到磁盘,而是将其保存到文件缓冲区并从那里读取。但是,将缓冲区直接读入 QImage 可能很困难。这是被问到的 here ,但答案是先将文件保存到磁盘。这在这里是不希望的。

相反,您可以将 numpy 数组形式的图形读取到 QImage 中。这可能涉及

  1. 将具有所需分辨率的图形保存到缓冲区,然后读取缓冲区并从中创建一个 numpy 数组。这个问题解决了这个问题: How can I render a Matplotlib Axes object to an image (as a Numpy array)?
  2. 从一个 numpy 数组创建一个 QImage。这个问题解决了这个问题:How to set an numpy array image on a QWidget using PyQt5还有Convert 16-bit grayscale to QImage

不幸的是,我目前无法让 RGB 数组正确显示,但以下是将图形显示为灰度图像的解决方案:

import io
import sys
from PyQt4 import QtGui
import matplotlib.pyplot as plt
import numpy as np

def get_image():
plt.plot([1,3,2])
buff = io.BytesIO()
plt.savefig(buff, format="png", dpi=100)
buff.seek(0)
img = plt.imread(buff)
return img


class App(QtGui.QWidget):

def __init__(self):
super(App, self).__init__()
self.setGeometry(300, 300, 250, 150)
self.setLayout(QtGui.QVBoxLayout())
label = QtGui.QLabel()
label2 = QtGui.QLabel("Some other text label")

img = get_image()

im = img.mean(axis=2)
im = ((im - im.min()) / (im.ptp() / 255.0)).astype(np.uint8)
print im.shape, im.max(), im.min()
temp_img = QtGui.QImage(im,im.shape[1],im.shape[0],im.shape[1], QtGui.QImage.Format_Indexed8)
pixmap = QtGui.QPixmap(temp_img)
label.setPixmap(pixmap)

self.layout().addWidget(label)
self.layout().addWidget(label2)
self.show()


if __name__ == '__main__':
app = QtGui.QApplication([])
ex = App()
sys.exit(app.exec_())

关于python - 以更高的分辨率将 matplotlib 图复制到 QClipboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47449925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com