问题
In my application I have a GtkImage that must show the processed image from a choosed file. So, in the handlers section I have:
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)
Up to here, all is OK. If we do:
im.save("../tmp/tmp.png")
pixbuf = GdkPixbuf.Pixbuf.new_from_file('../tmp/tmp.png')
self.imagen.set_property("pixbuf", pixbuf)
the expected image is pasted on the GtkImage widget. But that is the ugly way, isnt it?
So Im trying:
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])
But the result is "Error 139, Segmentation fault (core dumped)"
What am I missing?
回答1:
This seems to be related to this gdk bug: https://bugzilla.gnome.org/show_bug.cgi?id=721497
Basically it is a use after free bug in the python wrapper of gdk which can result in image distortions and/or segfaults as it did for you. See: https://stackoverflow.com/a/24070152/3528174
You can find an example of such image distortions in this question: How to correctly covert 3d array into continguous rgb bytes
来源:https://stackoverflow.com/questions/29501835/gtk3-gdk-pixbuf-new-from-data-gives-segmentation-fault-core-dumped-error-13