def adjust_image(f, max_size=(<NUM_LIT>, <NUM_LIT>), new_format=None, jpeg_quality=<NUM_LIT>, fill=False, stretch=False,<EOL>return_new_image=False, force_jpeg_save=True):
assert isinstance(max_size, (list, tuple)) and len(max_size) == <NUM_LIT:2><EOL>assert <NUM_LIT:0> < jpeg_quality <= <NUM_LIT:100><EOL>if new_format:<EOL><INDENT>new_format = new_format.lower()<EOL>if new_format not in ('<STR_LIT>', '<STR_LIT>', '<STR_LIT>'):<EOL><INDENT>raise RuntimeError('<STR_LIT>')<EOL><DEDENT><DEDENT>f.seek(<NUM_LIT:0>)<EOL>img = Image.open(f)<EOL>if ((new_format == '<STR_LIT>' and img.mode != '<STR_LIT>') or<EOL>(new_format is None and img.format == '<STR_LIT>' and img.mode != '<STR_LIT>')):<EOL><INDENT>do_convert = True<EOL>if dju_settings.DJU_IMG_CONVERT_JPEG_TO_RGB:<EOL><INDENT>img = get_image_as_rgb(f)<EOL>if img is not None:<EOL><INDENT>do_convert = False<EOL><DEDENT><DEDENT>if do_convert:<EOL><INDENT>current_format = img.format<EOL>img = img.convert('<STR_LIT>')<EOL>img.format = current_format<EOL><DEDENT><DEDENT>max_width, max_height = max_size<EOL>img_width, img_height = img.size<EOL>img_format = img.format.lower()<EOL>ch_size = ch_format = False<EOL>if max_width is None:<EOL><INDENT>max_width = int(((img_width / float(img_height)) * max_height))<EOL><DEDENT>elif max_height is None:<EOL><INDENT>max_height = int(((img_height / float(img_width)) * max_width))<EOL><DEDENT>if (img_width, img_height) != (max_width, max_height):<EOL><INDENT>tasks = []<EOL>if fill:<EOL><INDENT>if (img_width < max_width or img_height < max_height) and not stretch:<EOL><INDENT>k = max(max_width / float(img_width), max_height / float(img_height))<EOL>w, h = max_width / k, max_height / k<EOL>left, top = int((img_width - w) / <NUM_LIT>), int((img_height - h) / <NUM_LIT>)<EOL>tasks.append(('<STR_LIT>', ((left, top, int(left + w), int(top + h)),), {}))<EOL><DEDENT>else:<EOL><INDENT>k = min(img_width / float(max_width), img_height / float(max_height))<EOL>w, h = img_width / k, img_height / k<EOL>tasks.append(('<STR_LIT>', ((int(w), int(h)), Image.LANCZOS), {}))<EOL>left, top = int((w - max_width) / <NUM_LIT>), int((h - max_height) / <NUM_LIT>)<EOL>tasks.append(('<STR_LIT>', ((left, top, left + max_width, top + max_height),), {}))<EOL><DEDENT><DEDENT>elif ((img_width > max_width or img_height > max_height) or<EOL>(img_width < max_width and img_height < max_height and stretch)):<EOL><INDENT>k = max(img_width / float(max_width), img_height / float(max_height))<EOL>w, h = int(img_width / k), int(img_height / k)<EOL>tasks.append(('<STR_LIT>', ((w, h), Image.LANCZOS), {}))<EOL><DEDENT>for img_method, method_args, method_kwargs in tasks:<EOL><INDENT>if ((img_method == '<STR_LIT>' and method_args[<NUM_LIT:0>] == (img_width, img_height)) or<EOL>(img_method == '<STR_LIT>' and method_args[<NUM_LIT:0>] == (<NUM_LIT:0>, <NUM_LIT:0>, img.size[<NUM_LIT:0>], img.size[<NUM_LIT:1>]))):<EOL><INDENT>continue<EOL><DEDENT>img = getattr(img, img_method)(*method_args, **method_kwargs)<EOL>ch_size = True<EOL><DEDENT><DEDENT>if new_format and new_format != img_format:<EOL><INDENT>img_format = new_format<EOL>ch_format = True<EOL><DEDENT>if not ch_format and img_format == '<STR_LIT>' and force_jpeg_save:<EOL><INDENT>ch_format = True<EOL><DEDENT>if return_new_image:<EOL><INDENT>t = StringIO()<EOL>_save_img(img, t, img_format=img_format, quality=jpeg_quality, progressive=True, optimize=True)<EOL>return t<EOL><DEDENT>if ch_size or ch_format:<EOL><INDENT>img.load()<EOL>truncate_file(f)<EOL>_save_img(img, f, img_format=img_format, quality=jpeg_quality, progressive=True, optimize=True)<EOL>if isinstance(f, UploadedFile):<EOL><INDENT>f.seek(<NUM_LIT:0>, <NUM_LIT:2>)<EOL>f.size = f.tell()<EOL>set_uploaded_file_content_type_and_file_ext(f, img_format)<EOL><DEDENT><DEDENT>return ch_size or ch_format<EOL>
Підганяє зображення під параметри.
max_size - максимальний розмір картинки. один з розмірів може бути None (авто)
new_format - формат файлу (jpeg, png, gif). якщо None, тоді буде використаний формат оригіналу
jpeg_quality - якість JPEG
fill - чи зображення має бути заповненим при обрізці (інакше буде вписане)
stretch - чи розтягувати, якщо картинка замаленька
return_new_image - якщо True, тоді буде повертатись новий об'єкт StringIO картинки. Інакше bool, чи файл змінювався.
force_jpeg_save - якщо True, тоді якщо файл JPEG, то він буде перезбережений в будь-якому випадку