2013-07-16 3 views
0

Я хочу, чтобы скопировать текущую фигуру Matplotlib в буфер обмена:Python - Matplotlib - PyQT: Копировать изображение в буфер обмена

этот код doens't работы (для целей тестирования, я хочу, чтобы сохранить растровое изображение на диск позже я буду использовать его как растровое изображение. Я хочу начать с наличия растрового изображения памяти, которое я могу использовать с QIm QQmage, 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 

Любые решения?

ответ

3

Вы не создаете действительное изображение.

im = QImage(self.canvas.buffer_rgba()) 

фактически игнорирует аргумент, который вы передаете. canvas.buffer_rgba() возвращает memoryview, что ни один из 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) 

В питоне есть действительно только один __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().

+0

Спасибо, это работает! Единственное, что меня беспокоит, это то, что цвета графа меняются обратно в цвета по умолчанию в сохраненном файле-изображении, тогда как на экране есть разные по желанию. – Jomme

0

при работе в интерактивной оболочке Python вы можете использовать функцию как этот

def to_clipboard(fig): 
    QApplication.clipboard().setImage(QPixmap.grabWidget(fig.canvas).toImage()) 
    print('figure %d copied to clipboard' % fig.number) 

, а затем использовать его как to_clipboard(gcf()) сохранить текущую фигуру.

Смежные вопросы