определить размер изображения в формате JPEG и PNG перед его сохранением - PullRequest
0 голосов
/ 25 декабря 2018

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

Я использую этот код:

from PIL import Image, ImageGrab
from io import BytesIO

def jpeg_or_png(img):
    img_file = BytesIO()
    img.save(img_file, 'png')
    img_file_size_png = img_file.tell()
    img_file = BytesIO()
    img.save(img_file, 'jpeg')
    img_file_size_jpeg = img_file.tell()

    if img_file_size_jpeg < img_file_size_png:
        return 'jpeg'
    else:
        return 'png'


img = ImageGrab.grabclipboard()
if img:
    print(jpeg_or_png(img))

Всегда возвращается jpeg.Даже если это пустое белое изображение детали, для которого png более эффективно.

Если я сохраню обе версии, и, конечно, .png будет меньше по размеру, но функция все равно вернет .jpeg.

В идеале я хочу определить, какое расширение займет меньше места, не сохраняя его.Я знаю, что могу сохранить оба, затем найти самый большой файл и удалить его.Но это плохая практика и форма, чтобы делать это, потому что для этого потребуется место.

1 Ответ

0 голосов
/ 25 декабря 2018

Ваш код работает на меня.Чтобы помочь в диагностике, вы можете изменить свою функцию, чтобы она возвращала размер изображения в виде словаря.

def jpeg_or_png(img):
    j = BytesIO()
    img.save(j, 'jpeg')
    p = BytesIO()
    img.save(p, 'png')
    return {'jpg': j.tell(), 'png':p.tell()}

Вот два теста с различными снимками экрана:

jpeg_or_png(ImageGrab.grabclipboard())
# returns:
{'jpg': 21753, 'png': 232163}

для этого изображения:

enter image description here

jpeg_or_png(ImageGrab.grabclipboard())
# returns:
{'jpg': 7479, 'png': 3602}

для этого изображения:

enter image description here

...