From 86e9231ac97606980c311504a3d0ecf4c9c73c7c Mon Sep 17 00:00:00 2001 From: qubesuser Date: Wed, 8 Nov 2017 17:29:25 +0100 Subject: [PATCH] use PIL image library instead of ImageMagick to load/save images when tinting --- imgconverter/qubesimgconverter/__init__.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/imgconverter/qubesimgconverter/__init__.py b/imgconverter/qubesimgconverter/__init__.py index 8d00507..9b26a60 100644 --- a/imgconverter/qubesimgconverter/__init__.py +++ b/imgconverter/qubesimgconverter/__init__.py @@ -35,6 +35,7 @@ import subprocess import sys import unittest +import PIL.Image # those are for "zOMG UlTRa HD! WalLLpapPer 8K!!1!" to work seamlessly; # 8192 * 5120 * 4 B = 160 MiB, so DoS by memory exhaustion is unlikely @@ -72,6 +73,12 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()''' if p.wait(): raise Exception('Conversion failed') + def save_pil(self, dst): + '''Save image to disk using PIL.''' + + img = PIL.Image.frombytes('RGBA', self._size, self._rgba) + img.save(dst) + @property def data(self): return self._rgba @@ -129,6 +136,12 @@ get_from_stream(), get_from_vm(), get_xdg_icon_from_vm(), get_through_dvm()''' return cls(rgba=rgba, size=size) + def load_from_file_pil(cls, filename): + '''Loads image from local file using PIL.''' + img = PIL.Image.open(filename) + img = img.convert('RGBA') + return cls(rgba=img.tobytes(), size=img.size) + @classmethod def get_from_stream(cls, stream, max_width=MAX_WIDTH, max_height=MAX_HEIGHT): '''Carefully parse image data from stream. @@ -239,9 +252,9 @@ def hex_to_float(colour, channels=3, depth=8): def tint(src, dst, colour): '''Tint image to reflect vm label. - src and dst may specify format, like png:aqq.gif''' + src and dst may NOT specify ImageMagick format''' - Image.load_from_file(src).tint(colour).save(dst) + Image.load_from_file_pil(src).tint(colour).save_pil(dst) # vim: ft=python sw=4 ts=4 et