Python: создание миниатюры изображения (в бинарном виде) для размещения в форме

Есть база данных sqlite3, в её таблице есть поле BLOB для хранения прикреплённых к записям изображений. Запись с помощью формы редактируется. В форме есть Canvas, в котором изображение, прикреплённое к записи, показывается. Естественно, что изображения имеют самые разнообразные размеры. Поэтому для показа в форме готовится миниатюра - создаётся новое изображение заданного размера и на него накладывается исходное изображение, но с изменёнными размерами. Там уж как получится, либо чёрная полоса сверху и снизу, либо по бокам. Вот функция, которая занимается производством такой миниатюры (image_data - содержимое файла изображения из поля BLOB (по сути это добавленное в поле неизменённое никак содержимое файла изображения), canvas_width и canvas_height - размеры Canvas в форме):

import PIL.Image as PILImage
import io as io
import PIL.ImageTk as PILImageTk
    
def lib_resize_image(image_data="", canvas_width=200, canvas_height=200):

 if not image_data: image_s=None
 else:
  img=PILImage.open(io.BytesIO(image_data))
  img_width, img_height=img.size

  img_ratio=img_width/img_height
  canvas_ratio=canvas_width/canvas_height

  if img_ratio>canvas_ratio:
   new_width=canvas_width
   new_height=int(canvas_width/img_ratio)
  else:
   new_height=canvas_height
   new_width=int(canvas_height*img_ratio)

  img_resized=img.resize((new_width, new_height), PILImage.BICUBIC)

  new_img=PILImage.new("RGB", (canvas_width, canvas_height), "black")
  position=((canvas_width-new_width)//2, (canvas_height-new_height)//2)
  new_img.paste(img_resized, position)

  image_s=PILImageTk.PhotoImage(new_img)

 return image_s

Я хотел бы узнать, можно ли в данном случае избавиться от использования io, есть ли какие-то другие, более изящные, короткие и понятные способы сделать это же.


Ответы (0 шт):