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, есть ли какие-то другие, более изящные, короткие и понятные способы сделать это же.