[英]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.