Python實(shí)現(xiàn)圖片壓縮的案例詳解
1、引言
小屌絲:魚哥,求助,求助
小魚:啥情況,這火急火燎的?
小屌絲: 我要在某站進(jìn)行認(rèn)證,上傳圖片時(shí)提示,圖片超過本站最大xxx限制。
小魚:就這??
小屌絲:對啊,我又不想換照片,又不像照片失真。
小魚:就這要求?
小屌絲:對,能趕緊幫我不處理不?
小魚:嗯~ 理論上是可以。
小屌絲:什么都別說,我懂,枸杞一袋!
小魚:懂我,五分鐘后,來撩 拿圖片!
我們先來看一下,小屌絲的自拍照原圖。
圖片大小是 53KB
接下來,就是展示真正技術(shù)的時(shí)候了。
2、PIL模塊
2.1 quality 方式
2.1.1 普通圖片壓縮
我們使用PIL模塊的 quality方法來進(jìn)行壓縮
代碼展示:
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-12 from PIL import Image #讀取img文件 img_file = './pico.jpg' im = Image.open(img_file) #quality 是設(shè)置壓縮比 im.save('pico-ouo.jpg',quality = 20)
運(yùn)行結(jié)果
嗯,結(jié)果還是比較滿意的。
即滿足的小屌絲不想換圖片的要求,
又滿足了小屌絲圖片被壓縮后不失真的要求。
2.1.2 超大圖片壓縮
我們看看超大的圖片,能不能被壓縮。
這里我們就用小屌絲的女神照片來進(jìn)行壓縮。
原圖 120M,
我們看看壓縮后能有多少M(fèi)
運(yùn)行代碼
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-12 from PIL import Image,ImageFile #防止圖片超過178956970 pixels 而報(bào)錯(cuò) ImageFile.LOAD_TRUNCATED_IMAGES = True Image.MAX_IMAGE_PIXELS = None #讀取img文件 img_file = './king-letter.jpg' im = Image.open(img_file) #quality 是設(shè)置壓縮比 im.save('king-letter-ouo.jpg',quality = 20)
運(yùn)行結(jié)果,我們看看圖片大小
完美。
我們在打開圖片看看
完美 二連擊。
注
因?yàn)槲覀兪褂玫膱D片120M,超過了178956970 pixels
所以,我們需要使用imageFile的兩個(gè)方法,限制因超大而報(bào)錯(cuò):
ImageFile.LOAD_TRUNCATED_IMAGES = True Image.MAX_IMAGE_PIXELS = None
如果不限制,報(bào)錯(cuò)信息:
PIL.Image.DecompressionBombError: Image size (206621200 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.
2.2 thumbnail方式
掌握了quality方式,
我們再用PIL的 thumbnail方式進(jìn)行圖片壓縮
我們同樣使用超大圖片。
這次用唐三的女神照片。
代碼展示
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-12 from PIL import Image,ImageFile #防止圖片超過178956970 pixels 而報(bào)錯(cuò) ImageFile.LOAD_TRUNCATED_IMAGES = True Image.MAX_IMAGE_PIXELS = None #讀取img文件 img_file = './king-letter.jpg' im = Image.open(img_file) #獲取原尺寸圖片大小 w,h = im.size #圖片進(jìn)行50%的壓縮 im.thumbnail ?= ((w // 2, h // 2)) #保存 im.save('king-letter-oua.jpg')
運(yùn)行結(jié)果
我們可以看到,thumbnail方式 雖然把圖片壓縮到50%,但是圖片的大小并不會(huì)小太多。
3、OpenCV模塊
除了PIL模塊,還有OpenCV模塊也可以壓縮圖片
3.1 安裝
opencv模塊需要安裝
老規(guī)矩,直接pip安裝:
pip install opencv-python
其他方式安裝:
《Python3,選擇Python自動(dòng)安裝第三方庫,從此跟pip說拜拜?。 ?/a>
《Python3:我低調(diào)的只用一行代碼,就導(dǎo)入Python所有庫?。 ?/a>
3.2 執(zhí)行代碼
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-12 from cv2 import cv2 imgs = cv2.imread('./king.jpg') #圖片縮放至原圖的1/4 resize_img = cv2.resize(imgs, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST) #重寫圖片并保存 cv2.imwrite('king-ouv.jpg', resize_img)
運(yùn)行結(jié)果
原圖
壓縮后圖片
4、總結(jié)
寫到這里,今天的分享就差不多結(jié)束了。
主要通過PIL 和openCV模塊,對圖片進(jìn)行壓縮。
關(guān)于quality的壓縮比例值,需要自己不斷的調(diào)試,否則會(huì)出現(xiàn)失真的情況。
quality的值不固定,是因?yàn)閳D片類型不一樣,圖片大小也不一樣。
到此這篇關(guān)于Python實(shí)現(xiàn)圖片壓縮的案例詳解的文章就介紹到這了,更多相關(guān)Python圖片壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django-Xadmin后臺首頁添加小組件報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Django-Xadmin后臺首頁添加小組件報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python庫安裝加速之使用清華大學(xué)鏡像源的詳細(xì)指南
這篇文章主要介紹了如何通過清華大學(xué)鏡像源加速Python庫安裝,提供臨時(shí)指定和永久配置方法,并列舉阿里云、中科大、豆瓣等其他鏡像源,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-06-06Python計(jì)時(shí)相關(guān)操作詳解【time,datetime】
這篇文章主要介紹了Python計(jì)時(shí)相關(guān)操作,涉及time,datetime模塊的使用技巧,包括時(shí)間戳、時(shí)間差、日期格式等操作方法,需要的朋友可以參考下2017-05-05Python網(wǎng)絡(luò)編程之xmlrpc模塊
這篇文章介紹了Python網(wǎng)絡(luò)編程之xmlrpc模塊,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05Python使用Vagrant搭建開發(fā)環(huán)境的具體步驟
使用 Vagrant 搭建開發(fā)環(huán)境是一個(gè)非常方便的方式,它可以幫助你快速創(chuàng)建、配置和管理虛擬機(jī),確保開發(fā)環(huán)境的一致性,以下是使用 Vagrant 搭建開發(fā)環(huán)境的具體步驟,需要的朋友可以參考下2024-09-09使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式
這篇文章主要介紹了使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06linux之文件查找指定文件中包含關(guān)鍵字的行信息方式
這篇文章主要介紹了linux之文件查找指定文件中包含關(guān)鍵字的行信息方式,具有很好的參考價(jià)值,希望對大家有所幫助。2023-06-06