# HG changeset patch # User Goffi # Date 1583084825 -3600 # Node ID 5c3bf37f22026b3d935d2a895e45ff782d574da3 # Parent 5afd7416ca2db74ab73b4af10f1a8d53d6658816 tools (images): max_size can now be manually specified in checkImage and dest in resizeImage: `context` has been removed as it is not used and doesn't seem that useful. diff -r 5afd7416ca2d -r 5c3bf37f2202 sat/core/constants.py --- a/sat/core/constants.py Sun Mar 01 18:33:16 2020 +0100 +++ b/sat/core/constants.py Sun Mar 01 18:47:05 2020 +0100 @@ -370,13 +370,6 @@ # internationalisation DEFAULT_LOCALE = "en_GB" - # Contexts - # context indicate how things are done (e.g. to who/what a file is transfered) - # this is useful to make some decision (e.g. image size) - - # something is done in instant messaging - CONTEXT_CHAT = "CONTEXT_CHAT" - ## Misc ## SAVEFILE_DATABASE = APP_NAME_FILE + ".db" IQ_SET = '/iq[@type="set"]' diff -r 5afd7416ca2d -r 5c3bf37f2202 sat/tools/images.py --- a/sat/tools/images.py Sun Mar 01 18:33:16 2020 +0100 +++ b/sat/tools/images.py Sun Mar 01 18:47:05 2020 +0100 @@ -21,27 +21,27 @@ import tempfile from PIL import Image -from sat.core.constants import Const as C from pathlib import Path from twisted.internet import threads -def checkImage(host, path, context=C.CONTEXT_CHAT): +def checkImage(host, path, max_size=None): """Analyze image and return a report report will indicate if image is too large, and the recommended new size if this is the case @param host: SàT instance @param path(str, pathlib.Path): image to open - @param context(str): context in which the image is transfered + @param max_size(tuple[int, int]): maximum accepted size of image + None to use value set in config @return dict: report on image, with following keys: - too_large: true if image is oversized - recommended_size: if too_large is True, recommended size to use """ - # TODO: context is not used yet report = {} image = Image.open(path) - max_size = tuple(host.memory.getConfig(None, "image_max", (1200, 720))) + if max_size is None: + max_size = tuple(host.memory.getConfig(None, "image_max", (1200, 720))) if image.size > max_size: report['too_large'] = True if image.size[0] > max_size[0]: @@ -57,21 +57,32 @@ return report -def _resizeImageBlocking(image_path, new_size): +def _resizeImageBlocking(image_path, new_size, dest=None): im_path = Path(image_path) im = Image.open(im_path) resized = im.resize(new_size, Image.LANCZOS) - with tempfile.NamedTemporaryFile(suffix=im_path.suffix, delete=False) as f: + + if dest is None: + dest = tempfile.NamedTemporaryFile(suffix=im_path.suffix, delete=False) + elif isinstance(dest, Path): + dest = Path.open('wb') + + with dest as f: resized.save(f, format=im.format) + return Path(f.name) -def resizeImage(image_path, new_size): - """Resize an image to a new temporary file, and return it path +def resizeImage(image_path, new_size, dest=None): + """Resize an image to a new file, and return its path @param image_path(str, Path): path of the original image @param new_size(tuple[int, int]): size to use for new image - @return (Path): path of the resized file. The image at this path must be deleted - after use + @param dest(None, Path, file): where the resized image must be stored, can be: + - None: use a temporary file + - Path: path to the file to create/overwrite + - file: a file object which must be opened for writing in binary mode + @return (Path): path of the resized file. + The image at this path should be deleted after use """ - return threads.deferToThread(_resizeImageBlocking, image_path, new_size) + return threads.deferToThread(_resizeImageBlocking, image_path, new_size, dest)