日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

使用python如何對(duì)圖片進(jìn)行壓縮_python

作者:Mabel-mql ? 更新時(shí)間: 2022-12-26 編程語(yǔ)言

python對(duì)圖片進(jìn)行壓縮

簡(jiǎn)單說(shuō)明

對(duì)于圖片,強(qiáng)行被定義高和寬會(huì)變形,我們希望圖片被改變大小后,比例保持不變,完成對(duì)圖片的壓縮。

使用工具

1.pillow : pip install pillow -i https://pypi.douban.com/simple

2. os : 連接文件,并獲取文件夾下的文件名

實(shí)現(xiàn)過(guò)程

  • 獲取picture文件下的相關(guān)圖片的路徑,將路徑放到列表里面進(jìn)行存儲(chǔ)
  • 使用Image模塊,循環(huán)遍歷所有路徑圖片,讀取圖片的大小。
  • 定義縮小后的圖片寬度大小,并根據(jù)原圖比例計(jì)算壓縮后圖像的高度
  • 使用resize函數(shù)改變尺寸,并使用Image.ANTIALIAS保持圖片的品質(zhì).
  • 保存壓縮好的圖片到新的文件夾

相關(guān)實(shí)現(xiàn)代碼

'''
實(shí)現(xiàn)圖片壓縮
1.保持圖片大小比例不變
2.使用Image里面的resize進(jìn)行

'''

from PIL import Image
import os

#獲取文件夾里面的圖片
path_list=['pictures'+"\\"+i for i in os.listdir('pictures')]
# print(path_list)
#循環(huán)圖片路徑,依次對(duì)圖片進(jìn)行壓縮
for path in path_list:
    im = Image.open(path)
    (x, y) = im.size  # 讀取圖片尺寸(像素)
    x_1 = 165  # 定義縮小后的標(biāo)準(zhǔn)寬度
    y_1 = int(y * x_1 / x)  # 計(jì)算縮小后的高度
    out = im.resize((x_1, y_1), Image.ANTIALIAS)  # 改變尺寸,保持圖片高品質(zhì)
    #判斷圖片的通道模式,若圖片在RGBA模式下,需先將其轉(zhuǎn)變?yōu)镽GB模式
    if out.mode=='RGBA':
        #轉(zhuǎn)化為rgb格式
        out=out.convert('RGB')
       #最后保存為jpg格式的圖片,這里因?yàn)閳D片本身為jpg所以后綴不更改
    out.save('pictures_new\\{}'.format(path.split("\\")[-1]))

結(jié)果截圖

1. 原圖(其中一張)----分辨率大小為3392*3392

在這里插入圖片描述

2. 壓縮后大小為165*144

在這里插入圖片描述

一鍵實(shí)現(xiàn)圖像壓縮和圖像處理

入門(mén)了解1.顏色

如果你有使用顏料畫(huà)畫(huà)的經(jīng)歷,那么一定知道混合紅、黃、藍(lán)三種顏料可以得到其他的顏色,事實(shí)上這三種顏色就是美術(shù)中的三原色,它們是不能再分解的基本顏色。

在計(jì)算機(jī)中,我們可以將紅、綠、藍(lán)三種色光以不同的比例疊加來(lái)組合成其他的顏色,因此這三種顏色就是色光三原色。

在計(jì)算機(jī)系統(tǒng)中,我們通常會(huì)將一個(gè)顏色表示為一個(gè)RGB值或RGBA值(其中的A表示Alpha通道,它決定了透過(guò)這個(gè)圖像的像素,也就是透明度)。

名稱(chēng) RGB值 名稱(chēng) RGB值
White(白) (255, 255, 255) Red(紅) (255, 0, 0)
Green(綠) (0, 255, 0) Blue(藍(lán)) (0, 0, 255)
Gray(灰) (128, 128, 128) Yellow(黃) (255, 255, 0)
Black(黑) (0, 0, 0) Purple(紫) (128, 0, 128)

入門(mén)了解 2. 像素

對(duì)于一個(gè)由數(shù)字序列表示的圖像來(lái)說(shuō),最小的單位就是圖像上單一顏色的小方格,這些小方塊都有一個(gè)明確的位置和被分配的色彩數(shù)值,而這些一小方格的顏色和位置決定了該圖像最終呈現(xiàn)出來(lái)的樣子,它們是不可分割的單位,我們通常稱(chēng)之為像素(pixel)。

每一個(gè)圖像都包含了一定量的像素,這些像素決定圖像在屏幕上所呈現(xiàn)的大小,大家如果愛(ài)好拍照或者自拍,對(duì)像素這個(gè)詞就不會(huì)陌生。

用Pillow處理圖像

Pillow是由從著名的Python圖像處理庫(kù)PIL發(fā)展出來(lái)的一個(gè)分支,通過(guò)Pillow可以實(shí)現(xiàn)圖像壓縮和圖像處理等各種操作。可以使用下面的命令來(lái)安裝Pillow。

pip install pillow

Pillow中最為重要的是Image類(lèi),可以通過(guò)Image模塊的open函數(shù)來(lái)讀取圖像并獲得Image類(lèi)型的對(duì)象。

1. 讀取和顯示圖像

? ?from PIL import Image

? ?# 讀取圖像獲得Image對(duì)象
? ?image = Image.open('guido.jpg')
? ?# 通過(guò)Image對(duì)象的format屬性獲得圖像的格式
? ?print(image.format) # JPEG
? ?# 通過(guò)Image對(duì)象的size屬性獲得圖像的尺寸
? ?print(image.size) ? # (500, 750)
? ?# 通過(guò)Image對(duì)象的mode屬性獲取圖像的模式
? ?print(image.mode) ? # RGB
? ?# 通過(guò)Image對(duì)象的show方法顯示圖像
? ?image.show()

2. 剪裁圖像

? ?# 通過(guò)Image對(duì)象的crop方法指定剪裁區(qū)域剪裁圖像
? ?image.crop((80, 20, 310, 360)).show()

3. 生成縮略圖

? ?# 通過(guò)Image對(duì)象的thumbnail方法生成指定尺寸的縮略圖
? ?image.thumbnail((128, 128))
? ?image.show()

4. 縮放和黏貼圖像

? ?# 讀取駱昊的照片獲得Image對(duì)象
? ?luohao_image = Image.open('luohao.png')
? ?# 讀取吉多的照片獲得Image對(duì)象
? ?guido_image = Image.open('guido.jpg')
? ?# 從吉多的照片上剪裁出吉多的頭
? ?guido_head = guido_image.crop((80, 20, 310, 360))
? ?width, height = guido_head.size
? ?# 使用Image對(duì)象的resize方法修改圖像的尺寸
? ?# 使用Image對(duì)象的paste方法將吉多的頭粘貼到駱昊的照片上
? ?luohao_image.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40))
? ?luohao_image.show()

5. 旋轉(zhuǎn)和翻轉(zhuǎn)

? ?image = Image.open('guido.jpg')
? ?# 使用Image對(duì)象的rotate方法實(shí)現(xiàn)圖像的旋轉(zhuǎn)
? ?image.rotate(45).show()
? ?# 使用Image對(duì)象的transpose方法實(shí)現(xiàn)圖像翻轉(zhuǎn)
? ?# Image.FLIP_LEFT_RIGHT - 水平翻轉(zhuǎn)
? ?# Image.FLIP_TOP_BOTTOM - 垂直翻轉(zhuǎn)
? ?image.transpose(Image.FLIP_TOP_BOTTOM).show()

6. 操作像素

? ?for x in range(80, 310):
? ? ? ?for y in range(20, 360):
? ? ? ? ? ?# 通過(guò)Image對(duì)象的putpixel方法修改圖像指定像素點(diǎn)
? ? ? ? ? ?image.putpixel((x, y), (128, 128, 128))
? ?image.show()

7. 濾鏡效果

? ?from PIL import ImageFilter

? ?# 使用Image對(duì)象的filter方法對(duì)圖像進(jìn)行濾鏡處理
? ?# ImageFilter模塊包含了諸多預(yù)設(shè)的濾鏡也可以自定義濾鏡
? ?image.filter(ImageFilter.CONTOUR).show()

使用Pillow繪圖

Pillow中有一個(gè)名為ImageDraw的模塊,該模塊的Draw函數(shù)會(huì)返回一個(gè)ImageDraw對(duì)象,通過(guò)ImageDraw對(duì)象的arc、line、rectangle、ellipse、polygon等方法,可以在圖像上繪制出圓弧、線條、矩形、橢圓、多邊形等形狀,也可以通過(guò)該對(duì)象的text方法在圖像上添加文字。

完整的代碼如下所示。

import random

from PIL import Image, ImageDraw, ImageFont


def random_color():
? ? """生成隨機(jī)顏色"""
? ? red = random.randint(0, 255)
? ? green = random.randint(0, 255)
? ? blue = random.randint(0, 255)
? ? return red, green, blue


width, height = 800, 600
# 創(chuàng)建一個(gè)800*600的圖像,背景色為白色
image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
# 創(chuàng)建一個(gè)ImageDraw對(duì)象
drawer = ImageDraw.Draw(image)
# 通過(guò)指定字體和大小獲得ImageFont對(duì)象
font = ImageFont.truetype('Kongxin.ttf', 32)
# 通過(guò)ImageDraw對(duì)象的text方法繪制文字
drawer.text((300, 50), 'Hello, world!', fill=(255, 0, 0), font=font)
# 通過(guò)ImageDraw對(duì)象的line方法繪制兩條對(duì)角直線
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
# 通過(guò)ImageDraw對(duì)象的rectangle方法繪制矩形
drawer.rectangle(xy, outline=(255, 0, 0), width=2)
# 通過(guò)ImageDraw對(duì)象的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')

注意:上面代碼中使用的字體文件需要根據(jù)自己準(zhǔn)備,可以選擇自己喜歡的字體文件并放置在代碼目錄下。

使用Python語(yǔ)言做開(kāi)發(fā),除了可以用Pillow來(lái)處理圖像外,還可以使用更為強(qiáng)大的OpenCV庫(kù)來(lái)完成圖形圖像的處理,OpenCV(Open Source Computer Vision Library)是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺(jué)庫(kù),可以用來(lái)開(kāi)發(fā)實(shí)時(shí)圖像處理、計(jì)算機(jī)視覺(jué)和模式識(shí)別程序。

在我們的日常工作中,有很多繁瑣乏味的任務(wù)其實(shí)都可以通過(guò)Python程序來(lái)處理,編程的目的就是讓計(jì)算機(jī)幫助我們解決問(wèn)題,減少重復(fù)乏味的勞動(dòng)。通過(guò)本章節(jié)的學(xué)習(xí),相信大家已經(jīng)感受到了使用Python程序繪圖P圖的樂(lè)趣,其實(shí)Python能做的事情還遠(yuǎn)不止這些,繼續(xù)你的學(xué)習(xí)吧。

原文鏈接:https://blog.csdn.net/Rebacca122222/article/details/124918529

欄目分類(lèi)
最近更新