Подтвердить что ты не робот

Как уменьшить размер файла изображения с помощью PIL

Я использую PIL для изменения размеров изображений, преобразовывая большие изображения в более мелкие. Существуют ли какие-либо стандартные способы уменьшить размер файла изображения, не теряя качество слишком много, скажем, что исходный размер изображения составляет 100 КБ, я хочу, чтобы он уменьшался до 5 или 10 КБ, особенно для форматов png и jpeg.

4b9b3361

Ответ 1

Встроенный параметр для сохранения JPEG и PNG optimize.

 >>> from PIL import Image
 # My image is a 200x374 jpeg that is 102kb large
 >>> foo = Image.open("path\\to\\image.jpg")
 >>> foo.size
  (200,374)
 # I downsize the image with an ANTIALIAS filter (gives the highest quality)
 >>> foo = foo.resize((160,300),Image.ANTIALIAS)
 >>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
 # The saved downsized image size is 24.8kb
 >>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95)
 # The saved downsized image size is 22.9kb

Флаг optimize сделает дополнительный проход по изображению, чтобы найти способ максимально уменьшить его размер. 1,9 КБ может показаться не таким уж большим, но для сотен/тысяч картинок это может сложиться.

Теперь, чтобы попробовать уменьшить его до 5–10 кб, вы можете изменить значение качества в параметрах сохранения. Использование качества 85 вместо 95 в этом случае даст: Unoptimized: 15.1kb Оптимизировано: 14.3kb Использование качества 75 (по умолчанию, если аргумент пропущен) даст: Unoptimized: 11.8kb Оптимизировано: 11.2kb

Я предпочитаю качество 85 с оптимизацией, потому что на качество это не сильно влияет, а размер файла намного меньше.

Ответ 2

позволяет сказать, что у вас есть модель под названием "Книга", а на ней - "cover_pic", в этом случае вы можете сделать следующее для сжатия изображения:

from PIL import Image
b = Book.objects.get(title='Into the wild')
image = Image.open(b.cover_pic.path)
image.save(b.image.path,quality=20,optimize=True)

надеюсь, что это поможет любому, кто наткнулся на него.

Ответ 3

Смотрите функцию thumbnail модуля изображения PIL. Вы можете использовать его для сохранения меньших версий файлов в виде различных типов файлов, и если вы хотите сохранить как можно больше качества, подумайте об использовании фильтра ANTIALIAS, когда вы это сделаете.

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

Ответ 4

Основным менеджером изображений в PIL является модуль PIL Image.

from PIL import Image
import math

foo = Image.open("path\\to\\image.jpg")
x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)
foo = foo.resize((x2,y2),Image.ANTIALIAS)
foo.save("path\\to\\save\\image_scaled.jpg",quality=95)

Вы можете добавить optimize=True к аргументам, которые вы хотите уменьшить размер еще больше, но оптимизировать работает только для JPEG и PNG. Для других расширений изображений вы можете снизить качество нового сохраненного изображения. Вы можете изменить размер нового изображения, просто удалив немного кода и определив размер изображения, и вы сможете понять, как это сделать, только если внимательно посмотрите на код. Я определил этот размер:

x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)

просто чтобы показать вам, что (почти) обычно делается с горизонтальными изображениями. Для вертикальных изображений вы можете сделать:

x, y = foo.size
x2, y2 = math.floor(x-20), math.floor(y-50)

Помните, что вы все еще можете удалить этот бит кода и определить новый размер.