天天看點

Python一鍵實作圖像壓縮和圖像處理

前言

  • 大家好我是辣條哥,最近有小段時間沒有更新大家還記得我吧!最近其實在弄一些别的小事情,大家有興趣的話也可以來圍觀一下~

    點選檢視​​→→→《五包辣條與Python》←←←希望大家也像在這裡大力支援一樣的支援辣條哥​​

  • 廢話不多說我們直接進入今天正題,随着現在短視訊類越來越火,随之而來的就是大量的視訊圖像的處理,不過在辣條眼裡程式設計無所不能,你們覺得呢~接下來我們直接開始進入操作環節
Python一鍵實作圖像壓縮和圖像處理

目錄

  • ​​前言​​
  • ​​入門了解1.顔色。​​
  • ​​入門了解 2. 像素。​​
  • ​​用Pillow處理圖像​​
  • ​​1. 讀取和顯示圖像​​
  • ​​2. 剪裁圖像​​
  • ​​3. 生成縮略圖​​
  • ​​4. 縮放和黏貼圖像​​
  • ​​5. 旋轉和翻轉​​
  • ​​6. 操作像素​​
  • ​​7. 濾鏡效果​​
  • ​​使用Pillow繪圖​​
  • ​​總結​​

入門了解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)。每一個圖像都包含了一定量的像素,這些像素決定圖像在螢幕上所呈現的大小,大家如果愛好拍照或者自拍,對像素這個詞就不會陌生。

Python一鍵實作圖像壓縮和圖像處理

用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()      
Python一鍵實作圖像壓縮和圖像處理

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.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()      
Python一鍵實作圖像壓縮和圖像處理

使用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')      
注意:上面代碼中使用的字型檔案需要根據自己準備,可以選擇自己喜歡的字型檔案并放置在代碼目錄下。

總結