use PIL image library instead of ImageMagick to load/save images when tinting
This commit is contained in:
parent
6c6070ab49
commit
86e9231ac9
@ -35,6 +35,7 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
import PIL.Image
|
||||||
|
|
||||||
# those are for "zOMG UlTRa HD! WalLLpapPer 8K!!1!" to work seamlessly;
|
# 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
|
# 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():
|
if p.wait():
|
||||||
raise Exception('Conversion failed')
|
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
|
@property
|
||||||
def data(self):
|
def data(self):
|
||||||
return self._rgba
|
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)
|
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
|
@classmethod
|
||||||
def get_from_stream(cls, stream, max_width=MAX_WIDTH, max_height=MAX_HEIGHT):
|
def get_from_stream(cls, stream, max_width=MAX_WIDTH, max_height=MAX_HEIGHT):
|
||||||
'''Carefully parse image data from stream.
|
'''Carefully parse image data from stream.
|
||||||
@ -239,9 +252,9 @@ def hex_to_float(colour, channels=3, depth=8):
|
|||||||
def tint(src, dst, colour):
|
def tint(src, dst, colour):
|
||||||
'''Tint image to reflect vm label.
|
'''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
|
# vim: ft=python sw=4 ts=4 et
|
||||||
|
Loading…
Reference in New Issue
Block a user