2012-05-15 77 views
31

我使用PIL通過將較大圖像轉換爲較小圖像來調整圖像大小。是否有任何標準的方法來減少圖像的文件大小而不會過多地丟失質量,可以說圖像的原始大小是100KB,我想把它縮小到5或10KB,特別是對於png和jpeg格式。如何使用PIL減少圖像文件大小

+0

你認爲「太多」的質量損失是什麼?如果要將文件大小減少10到20倍,最簡單的方法就是減少像素數量。將寬度和高度減少2/3會給你一張約1/9原始尺寸的圖片。但這是相當多的解決方案,你放鬆。 –

回答

1

查看PIL的圖像模塊的thumbnail功能。您可以使用它來將較小版本的文件保存爲各種文件類型,並且如果您想保留儘可能多的質量,請考慮使用ANTIALIAS過濾器。

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

+0

有沒有辦法通過保持尺寸不變尤其是減小文件大小。爲png格式。 –

+1

如果您想要保持相同的尺寸,您可以嘗試的另一件事是保存圖像時設置質量設置。看看[這個答案](http://stackoverflow.com/a/1405701/369878) – Cryptite

+0

但質量屬性沒有差別的PNG formats.even我改變質量的文件大小保持不變。 –

54

用於保存JPEG和PNG的內置參數是optimize

# 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到10 kb,您可以更改保存選項中的質量值。 在這種情況下使用的的85代替95質量將產生: 未優化:優化15.1kb :14.3kb 使用的75質量(默認如果參數被排除在外)將產生: 未優化:優化11.8kb : 11.2kb

我更喜歡質量85與優化,因爲質量不受影響太大,文件大小更小。

8

可以說你有 在這種情況下,所謂的書並在其上的字段名爲「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) 

希望它能幫助任何人磕磕絆絆之上。