網站首頁 編程語言 正文
python對圖片進行壓縮
簡單說明
對于圖片,強行被定義高和寬會變形,我們希望圖片被改變大小后,比例保持不變,完成對圖片的壓縮。
使用工具
1.pillow : pip install pillow -i https://pypi.douban.com/simple
2. os : 連接文件,并獲取文件夾下的文件名
實現過程
- 獲取picture文件下的相關圖片的路徑,將路徑放到列表里面進行存儲
- 使用Image模塊,循環遍歷所有路徑圖片,讀取圖片的大小。
- 定義縮小后的圖片寬度大小,并根據原圖比例計算壓縮后圖像的高度
- 使用resize函數改變尺寸,并使用Image.ANTIALIAS保持圖片的品質.
- 保存壓縮好的圖片到新的文件夾
相關實現代碼
'''
實現圖片壓縮
1.保持圖片大小比例不變
2.使用Image里面的resize進行
'''
from PIL import Image
import os
#獲取文件夾里面的圖片
path_list=['pictures'+"\\"+i for i in os.listdir('pictures')]
# print(path_list)
#循環圖片路徑,依次對圖片進行壓縮
for path in path_list:
im = Image.open(path)
(x, y) = im.size # 讀取圖片尺寸(像素)
x_1 = 165 # 定義縮小后的標準寬度
y_1 = int(y * x_1 / x) # 計算縮小后的高度
out = im.resize((x_1, y_1), Image.ANTIALIAS) # 改變尺寸,保持圖片高品質
#判斷圖片的通道模式,若圖片在RGBA模式下,需先將其轉變為RGB模式
if out.mode=='RGBA':
#轉化為rgb格式
out=out.convert('RGB')
#最后保存為jpg格式的圖片,這里因為圖片本身為jpg所以后綴不更改
out.save('pictures_new\\{}'.format(path.split("\\")[-1]))
結果截圖
1. 原圖(其中一張)----分辨率大小為3392*3392
2. 壓縮后大小為165*144
一鍵實現圖像壓縮和圖像處理
入門了解1.顏色
如果你有使用顏料畫畫的經歷,那么一定知道混合紅、黃、藍三種顏料可以得到其他的顏色,事實上這三種顏色就是美術中的三原色,它們是不能再分解的基本顏色。
在計算機中,我們可以將紅、綠、藍三種色光以不同的比例疊加來組合成其他的顏色,因此這三種顏色就是色光三原色。
在計算機系統中,我們通常會將一個顏色表示為一個RGB值或RGBA值(其中的A表示Alpha通道,它決定了透過這個圖像的像素,也就是透明度)。
名稱 | RGB值 | 名稱 | RGB值 |
---|---|---|---|
White(白) | (255, 255, 255) | Red(紅) | (255, 0, 0) |
Green(綠) | (0, 255, 0) | Blue(藍) | (0, 0, 255) |
Gray(灰) | (128, 128, 128) | Yellow(黃) | (255, 255, 0) |
Black(黑) | (0, 0, 0) | Purple(紫) | (128, 0, 128) |
入門了解 2. 像素
對于一個由數字序列表示的圖像來說,最小的單位就是圖像上單一顏色的小方格,這些小方塊都有一個明確的位置和被分配的色彩數值,而這些一小方格的顏色和位置決定了該圖像最終呈現出來的樣子,它們是不可分割的單位,我們通常稱之為像素(pixel)。
每一個圖像都包含了一定量的像素,這些像素決定圖像在屏幕上所呈現的大小,大家如果愛好拍照或者自拍,對像素這個詞就不會陌生。
用Pillow處理圖像
Pillow是由從著名的Python圖像處理庫PIL發展出來的一個分支,通過Pillow可以實現圖像壓縮和圖像處理等各種操作。可以使用下面的命令來安裝Pillow。
pip install pillow
Pillow中最為重要的是Image類,可以通過Image模塊的open函數來讀取圖像并獲得Image類型的對象。
1. 讀取和顯示圖像
? ?from PIL import Image
? ?# 讀取圖像獲得Image對象
? ?image = Image.open('guido.jpg')
? ?# 通過Image對象的format屬性獲得圖像的格式
? ?print(image.format) # JPEG
? ?# 通過Image對象的size屬性獲得圖像的尺寸
? ?print(image.size) ? # (500, 750)
? ?# 通過Image對象的mode屬性獲取圖像的模式
? ?print(image.mode) ? # RGB
? ?# 通過Image對象的show方法顯示圖像
? ?image.show()
2. 剪裁圖像
? ?# 通過Image對象的crop方法指定剪裁區域剪裁圖像
? ?image.crop((80, 20, 310, 360)).show()
3. 生成縮略圖
? ?# 通過Image對象的thumbnail方法生成指定尺寸的縮略圖
? ?image.thumbnail((128, 128))
? ?image.show()
4. 縮放和黏貼圖像
? ?# 讀取駱昊的照片獲得Image對象
? ?luohao_image = Image.open('luohao.png')
? ?# 讀取吉多的照片獲得Image對象
? ?guido_image = Image.open('guido.jpg')
? ?# 從吉多的照片上剪裁出吉多的頭
? ?guido_head = guido_image.crop((80, 20, 310, 360))
? ?width, height = guido_head.size
? ?# 使用Image對象的resize方法修改圖像的尺寸
? ?# 使用Image對象的paste方法將吉多的頭粘貼到駱昊的照片上
? ?luohao_image.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40))
? ?luohao_image.show()
5. 旋轉和翻轉
? ?image = Image.open('guido.jpg')
? ?# 使用Image對象的rotate方法實現圖像的旋轉
? ?image.rotate(45).show()
? ?# 使用Image對象的transpose方法實現圖像翻轉
? ?# Image.FLIP_LEFT_RIGHT - 水平翻轉
? ?# Image.FLIP_TOP_BOTTOM - 垂直翻轉
? ?image.transpose(Image.FLIP_TOP_BOTTOM).show()
6. 操作像素
? ?for x in range(80, 310):
? ? ? ?for y in range(20, 360):
? ? ? ? ? ?# 通過Image對象的putpixel方法修改圖像指定像素點
? ? ? ? ? ?image.putpixel((x, y), (128, 128, 128))
? ?image.show()
7. 濾鏡效果
? ?from PIL import ImageFilter
? ?# 使用Image對象的filter方法對圖像進行濾鏡處理
? ?# ImageFilter模塊包含了諸多預設的濾鏡也可以自定義濾鏡
? ?image.filter(ImageFilter.CONTOUR).show()
使用Pillow繪圖
Pillow中有一個名為ImageDraw的模塊,該模塊的Draw函數會返回一個ImageDraw對象,通過ImageDraw對象的arc、line、rectangle、ellipse、polygon等方法,可以在圖像上繪制出圓弧、線條、矩形、橢圓、多邊形等形狀,也可以通過該對象的text方法在圖像上添加文字。
完整的代碼如下所示。
import random
from PIL import Image, ImageDraw, ImageFont
def random_color():
? ? """生成隨機顏色"""
? ? red = random.randint(0, 255)
? ? green = random.randint(0, 255)
? ? blue = random.randint(0, 255)
? ? return red, green, blue
width, height = 800, 600
# 創建一個800*600的圖像,背景色為白色
image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
# 創建一個ImageDraw對象
drawer = ImageDraw.Draw(image)
# 通過指定字體和大小獲得ImageFont對象
font = ImageFont.truetype('Kongxin.ttf', 32)
# 通過ImageDraw對象的text方法繪制文字
drawer.text((300, 50), 'Hello, world!', fill=(255, 0, 0), font=font)
# 通過ImageDraw對象的line方法繪制兩條對角直線
drawer.line((0, 0, width, height), fill=(0, 0, 255), width=2)
drawer.line((width, 0, 0, height), fill=(0, 0, 255), width=2)
xy = width // 2 - 60, height // 2 - 60, width // 2 + 60, height // 2 + 60
# 通過ImageDraw對象的rectangle方法繪制矩形
drawer.rectangle(xy, outline=(255, 0, 0), width=2)
# 通過ImageDraw對象的ellipse方法繪制橢圓
for i in range(4):
? ? left, top, right, bottom = 150 + i * 120, 220, 310 + i * 120, 380
? ? drawer.ellipse((left, top, right, bottom), outline=random_color(), width=8)
# 顯示圖像
image.show()
# 保存圖像
image.save('result.png')
注意:上面代碼中使用的字體文件需要根據自己準備,可以選擇自己喜歡的字體文件并放置在代碼目錄下。
使用Python語言做開發,除了可以用Pillow來處理圖像外,還可以使用更為強大的OpenCV庫來完成圖形圖像的處理,OpenCV(Open Source Computer Vision Library)是一個跨平臺的計算機視覺庫,可以用來開發實時圖像處理、計算機視覺和模式識別程序。
在我們的日常工作中,有很多繁瑣乏味的任務其實都可以通過Python程序來處理,編程的目的就是讓計算機幫助我們解決問題,減少重復乏味的勞動。通過本章節的學習,相信大家已經感受到了使用Python程序繪圖P圖的樂趣,其實Python能做的事情還遠不止這些,繼續你的學習吧。
原文鏈接:https://blog.csdn.net/Rebacca122222/article/details/124918529
相關推薦
- 2023-06-18 C#零基礎開發中最重要的概念總結_C#教程
- 2022-04-18 修改taro-ui的樣式,在自定義組件中使用taro-ui,修改ui框架樣式
- 2022-04-23 簡單易懂的二叉樹詳解,你確定不來看看嗎
- 2022-12-05 useReducer?createContext代替Redux原理示例解析_React
- 2023-07-24 evenloop事件循環機制
- 2022-07-13 Linux下網絡配置和ifconfig命令的使用
- 2022-11-24 Python模板的使用詳細講解_python
- 2022-09-04 C#線程委托BeginInvoke與EndInvoke的用法_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支