Сжатие размера изображений с помощью Python

Высококачественное изображение состоит из множества пикселей, что увеличивает общий объем памяти. Но иногда, когда мы хотим сохранить изображение в меньшем качестве для лучшей загрузки, в этом случае мы используем сжатие изображения. Сжатие изображения — это процесс, при котором мы минимизируем размер изображения без ухудшения его качества.

Для сжатия изображения в Python мы можем использовать библиотеку pillow, которая является сторонней библиотекой с открытым исходным кодом.
Чтобы использовать эту библиотеку, сначала нужно установить ее для нашей среды Python с помощью команды pip install.

pip install pillow
Вход в полноэкранный режим Выйти из полноэкранного режима

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

import PIL
from PIL import Image

#open the image
with  Image.open('original.jpg') as my_image:

    # the original width and height of the image
    image_height = my_image.height
    image_width = my_image.width

    print("The original size of Image is: ", round(len(my_image.fp.read())/1024,2), "KB")

    #compressed the image
    my_image = my_image.resize((image_width,image_height),PIL.Image.NEAREST)

    #save the image
    my_image.save('compressed.jpg')

    #open the compressed image
    with Image.open('compressed.jpg') as compresed_image:
        print("The size of compressed image is: ", round(len(compresed_image.fp.read())/1024,2), "KB")

Войти в полноэкранный режим Выход из полноэкранного режима

Вывод

The original size of Image is:  1953.24 KB
The size of compressed image is:  1547.01 KB
Вход в полноэкранный режим Выход из полноэкранного режима


Разбейте код

  1. Сначала загрузите исходное изображение, которое мы хотим скомпоновать, используя метод Image.open().
  2. Найдите ширину и высоту исходного изображения, используя свойства width и height.
  3. Сожмите копию изображения с помощью метода resize, сохраните размер сжатого изображения таким же, как и исходного, и примените фильтр PIL.Image.NEAREST к сжатому изображению в операторе my_image.resize((image_width,image_height),PIL.Image.NEAREST). Примечание: Существует несколько фильтров сжатия для метода изменения размера, вы можете ознакомиться со всеми фильтрами здесь.
  4. Наконец, сохраните сжатое изображение с помощью метода save().

Примечание: Я использовал

print("The original size of Image is: ", round(len(my_image.fp.read())/1024,2), "KB")
print("The size of compressed image is: ", round(len(compresed_image.fp.read())/1024,2), "KB")

чтобы показать разницу между размерами исходного и сжатого изображения.

Изменение размера

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

from turtle import width
import PIL
from PIL import Image

#open the image
with  Image.open('original.jpg') as my_image:

    #new widht and height in px
    width = 400
    height = 700

    print("The original size of Image is: ", round(len(my_image.fp.read())/1024,2), "KB")

    #compressed the image
    my_image = my_image.resize((width,height),PIL.Image.NEAREST)

    #save the image
    my_image.save('compressedResized.jpg')

    #open the compressed image
    with Image.open('compressedResized.jpg') as compresed_image:
        print("The size of compressed image is: ", round(len(compresed_image.fp.read())/1024,2), "KB")
Вход в полноэкранный режим Выход из полноэкранного режима

Вывод

The original size of Image is:  1953.24 KB
The size of compressed image is:  56.89 KB
Вход в полноэкранный режим Выход из полноэкранного режима

Загрузка из Интернета и сжатие изображения

Мы также можем загрузить изображение из Интернета и сжать его с помощью библиотеки Python pillow.
Чтобы загрузить изображение из Интернета, нам сначала нужно установить библиотеку Python requests.

pip install requests
Вход в полноэкранный режим Выход из полноэкранного режима
import PIL
from PIL import Image
import requests

img_url = "https://images.pexels.com/photos/60597/dahlia-red-blossom-bloom-60597.jpeg"

response = requests.get(img_url)


#download image 
with open("downloaded.jpg", 'wb') as save_image:
    save_image.write(response.content)

#open the image
with  Image.open('downloaded.jpg') as my_image:

    # the original width and height of the image
    image_height = my_image.height
    image_width = my_image.width

    print("The original size of Image is: ", round(len(my_image.fp.read())/1024,2), "KB")

    #compressed the image
    my_image = my_image.resize((image_width,image_height),PIL.Image.NEAREST)

    #save the image
    my_image.save('compressed.jpg')

    #open the compressed image
    with Image.open('compressed.jpg') as compresed_image:
        print("The size of compressed image is: ", round(len(compresed_image.fp.read())/1024,2), "KB")
Войдите в полноэкранный режим Выход из полноэкранного режима

Вывод

The original size of Image is:  706.43 KB
The size of compressed image is:  401.19 KB
Войти в полноэкранный режим Выход из полноэкранного режима

Сжатие загруженных изображений в Django.

Эта функция сжатия в Python с подушкой очень удобна в Django, когда пользователь загружает изображение высокого качества, а вы хотите его сжать.

class UserProfile(models.Model):
    profile_picture = models.ImageField(upload_to='profile_pictures', blank=True, verbose_name='Profile Picture')

def save(self, * args, **kwargs):
        super().save( * args, **kwargs)
        if self.profile_picture:
            img= Image.open(self.profile_picture.path)

            if img.height>1000 or img.width >1000:
                output_size= (500,500)
                img.resize((output_size), PIL.Image.NEAREST)
                img.save(self.profile_picture.path)
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий