簡體   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