Gtk+3 Gdk Pixbuf.new_from_data выдает ошибку "Ошибка сегментации (дамп памяти)" 139

В моем приложении у меня есть GtkImage, который должен показать обработанное изображение из выбранного файла. Итак, в разделе обработчиков у меня есть:

import numpy as np
from PIL import Image , ImageDraw
from gi.repository import Gtk,  GdkPixbuf
. . .
. . .
def on_fitchooserdialog_response(self, menuitem, data=None):
    if data == 1:  
        self.fitlist = self.fitchooser.get_filenames()
        # get data from 1st file:
        _, self.data = Getdata(self.fitlist[0])
        # convert from Fits to 2D array:
        pngarray = Fit2png(self.data)
        # rescale:
        size = tuple(x/2 for x in pngarray.shape)
        im = Image.fromarray(pngarray)
        im.thumbnail((size[1],size[0]), Image.BICUBIC)

До здесь все в порядке. Если мы делаем:

       im.save("../tmp/tmp.png")
       pixbuf = GdkPixbuf.Pixbuf.new_from_file('../tmp/tmp.png')
       self.imagen.set_property("pixbuf", pixbuf)

ожидаемое изображение вставляется в виджет GtkImage. Но это безобразный способ, не так ли?

Итак, я пытаюсь:

im = im.convert("RGB")
arr = np.array(im).flatten()
pixbuf = GdkPixbuf.Pixbuf.new_from_data(arr,
      GdkPixbuf.Colorspace.RGB, False, 8, size[1], size[0], 3*size[1])

Но результат "Ошибка 139, ошибка сегментации (ядро сброшено)"

Что мне не хватает?

1 ответ

Похоже, это связано с этой ошибкой gdk: https://bugzilla.gnome.org/show_bug.cgi?id=721497

В основном это использование после бесплатной ошибки в оболочке Python gdk, которая может привести к искажению изображения и / или ошибкам сегмента, как это было сделано для вас. Смотрите: /questions/14536194/kak-pravilno-preobrazovat-trehmernyij-massiv-v-nepreryivnyie-bajtyi-rgb/14536211#14536211

Вы можете найти пример таких искажений изображения в этом вопросе: Как правильно преобразовать трехмерный массив в непрерывные байты RGB

Другие вопросы по тегам