3

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

解決策はありますか?

4

3 に答える 3

5

有効なイメージを作成していません。

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__メソッドが 1 つしかないため、型チェックは内部チェックで行う必要があります。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')

もう 1 つの方法は、キャンバスをピックスマップとして直接取得することです。

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

クリップボードに保存:

QApplication.clipboard().setPixmap(pixmap)

ああ、あなたは使うべきではありませんgif、使用してpngください。独自の性質のため、gif通常、サポートされている出力形式として利用できません。確認してくださいQImageWriter.supportedImageFormats()

于 2013-07-16T13:52:45.650 に答える