Better transformation from pil.image to gtk pixbuf (see last commit)

This commit is contained in:
tmolitor 2016-04-06 23:38:30 +02:00
parent 3c704f95da
commit 88d4826693

View file

@ -42,6 +42,7 @@ try:
except: except:
pass pass
from io import BytesIO from io import BytesIO
import array
import logging import logging
log = logging.getLogger('gajim.gtkgui_helpers') log = logging.getLogger('gajim.gtkgui_helpers')
@ -417,22 +418,31 @@ def get_abspath_for_script(scriptname, want_type = False):
else: else:
return path_to_script return path_to_script
# see http://stackoverflow.com/a/8892894/3528174
# and https://developer.gnome.org/gdk-pixbuf/unstable/gdk-pixbuf-Image-Data-in-Memory.html#gdk-pixbuf-new-from-bytes
def pillow2pixbuf(im):
arr = array.array('B', im.tobytes())
width, height = im.size
return GdkPixbuf.Pixbuf.new_from_data(arr, GdkPixbuf.Colorspace.RGB,
False, 8, width, height, width * 3)
def get_pixbuf_from_data(file_data, want_type = False): def get_pixbuf_from_data(file_data, want_type = False):
""" """
Get image data and returns GdkPixbuf.Pixbuf if want_type is True it also Get image data and returns GdkPixbuf.Pixbuf if want_type is True it also
returns 'jpeg', 'png' etc returns 'jpeg', 'png' etc
""" """
pixbufloader = GdkPixbuf.PixbufLoader()
# try to open and convert every image format supported by PILLOW to png format # try to open and convert every image format supported by PILLOW to png format
try: try:
avatar = Image.open(BytesIO(file_data)).convert("RGB") im = Image.open(BytesIO(file_data)).convert("RGB")
output = BytesIO() pixbuf = pillow2pixbuf(im)
avatar.save(output, format='PNG') if want_type:
file_data = output.getvalue() typ = "png"
output.close() return pixbuf, typ
else:
return pixbuf
except: except:
log.debug("Could not use pillow to convert avatar image (this is non fatal)") log.info("Could not use pillow to convert avatar image to pixbuf, trying pixbufloader instead...")
pass # this didn't work, so just use the old gtk code to import the image pixbufloader = GdkPixbuf.PixbufLoader()
try: try:
pixbufloader.write(file_data) pixbufloader.write(file_data)
pixbufloader.close() pixbufloader.close()