Вы не создаете действительное изображение.
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()
.
Спасибо, это работает! Единственное, что меня беспокоит, это то, что цвета графа меняются обратно в цвета по умолчанию в сохраненном файле-изображении, тогда как на экране есть разные по желанию. – Jomme