簡體   English   中英

如何使用 PIL 減小圖像文件大小

[英]How to reduce the image file size using PIL

我正在使用 PIL 通過將較大的圖像轉換為較小的圖像來調整圖像的大小。 是否有任何標准方法可以在不損失太多質量的情況下減小圖像的文件大小? 假設圖像的原始大小為 100 kB。 我想把它縮小到 5 或 10 kB,尤其是對於 PNG 和 JPEG 格式。

保存 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.9kb 可能看起來不多,但超過數百/數千張圖片,它可以加起來。

現在嘗試將其縮小到 5kb 到 10kb,您可以在保存選項中更改質量值。 在這種情況下使用質量 85 而不是 95 將產生: 未優化:15.1kb 優化:14.3kb 使用質量 75(如果省略參數,則默認)將產生:未優化:11.8kb 優化:11.2kb

我更喜歡帶有優化的質量 85,因為質量受到的影響不大,而且文件大小要小得多。

假設您有一個名為 Book 的模型,上面有一個名為“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)

希望它對任何偶然發現它的人有所幫助。

請參閱 PIL 的 Image Module 的縮略圖功能。 您可以使用它將較小版本的文件保存為各種文件類型,如果您想盡可能多地保留質量,請考慮在這樣做時使用ANTIALIAS過濾器。

除此之外,我不確定是否有辦法指定最大所需大小。 當然,您可以編寫一個函數,嘗試以不同的質量保存文件的多個版本,直到滿足特定大小,丟棄其余的並為您提供所需的圖像。

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)

. 請記住,您仍然可以刪除那段代碼並定義新的大小。

您可以調整圖像大小,也可以降低圖像質量。 這里附上幾個例子:

Python PIL調整圖像大小

from PIL import Image
WIDTH = 1020
HEIGHT = 720
img = Image.open("my_image.jpg")
resized_img = img.resize((WIDTH, HEIGHT))
resized_img.save("resized_image.jpg")

更改圖像分辨率枕頭

from PIL import Image
size = 7016, 4961
im = Image.open("my_image.png")
im_resized = im.resize(size, Image.ANTIALIAS)
im_resized.save("image_resized.png", "PNG")

或者你可以使用

im_resized.save("image_resized.png", quality=95, optimize=True)

此腳本將減少圖像的寬度和高度, with saving it's proportion ,並減小大小

two options ,它們的邏輯相同, first one is how i did in django projectsecond is on pure python

您可以將TARGET_WIDTH更改為所需的寬度

django models.py圖像保存后,將再次處理

from PIL import Image

class Theme(models.Model):
    image = models.ImageField(upload_to='theme_image/')
    
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        this_image = Image.open(self.image.path)
        width, height = this_image.size
        TARGET_WIDTH = 500
        coefficient = width / 500
        new_height = height / coefficient
        this_image = this_image.resize((int(TARGET_WIDTH),int(new_height)),Image.ANTIALIAS)
        this_image.save(self.image.path,quality=50)

沒有 django foo.py

from PIL import Image

this_image = Image.open("path\to\your_image.jpg")
width, height = this_image.size
TARGET_WIDTH = 500
coefficient = width / 500
new_height = height / coefficient
this_image = this_image.resize((int(TARGET_WIDTH),int(new_height)),Image.ANTIALIAS)
this_image.save("path\where\to_save\your_image.jpg",quality=50)

如果你有一個胖 png(1MB 用於 400x400 等):

__import__("importlib").import_module("PIL.Image").open("out.png").save("out.png")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM