1. 程式人生 > 其它 >《Python 程式設計快速上手——讓繁瑣工作自動化》第十七章 · 操作影象

《Python 程式設計快速上手——讓繁瑣工作自動化》第十七章 · 操作影象

技術標籤:Python學習

PILLOW的中文文件在這裡


模組 :Pillow

一、 計算機影象基礎

1. 顏色和RGBA值

計算機程式將影象中的顏色表示為RGBA。RGBA是一組數字,指定顏色中的紅、綠、藍和alpha(透明度)的值。這些值是從0(根本沒有)到255(最大)的整數。如:
紅色 (255, 0, 0, 255)
綠色 (0, 255, 0, 255)
藍色 (0, 0, 255, 255)
黑色 (0, 0, 0, 255)
不知道所用顏色的RGBA值也沒有關係,可以用:

  • ImageColor.getcolor()函式
    作用: 接受一個顏色名稱字串作為第一個引數,字串“RGBA”作為第二個引數,返回一個RGBA元組
    程式碼舉例:
from PIL import ImageColor
ImageColor.getcolor('red', 'RGBA')
ImageColor.getcolor("Blue", 'RGBA')#不區分大小寫

上述程式碼分別返回紅色和藍色對應的RGBA值

2. 座標和Box元組

影象畫素用x和y座標指定,分別指定畫素在影象中的水平和垂直位置。原點位於左上角。

  • 矩形元組引數 - - 包括左和頂座標,直到但是不包括右和底座標

二、 用Pillow操作影象

  • Image.open() 函式
    作用:該函式的返回值是Image物件資料型別,它是Pillow將影象作為Python值的方法。

2.1 處理Image資料型別

Image物件包含的屬性載入了影象檔案的基本資訊,包括寬度,高度,檔名,影象格式等。

程式碼舉例:

from PIL import Image  				#Pillow模組的名字是PIL,這保持與老模組Python Imaging Library 相容
catIm = Image.open("zophie.png")  	#影象要儲存在當前資料夾,否則就要用絕對路徑

catIm.size
width, height = catIm.size			#多重賦值技巧,將寬和高分別賦值給width和height
print(width, height)
catIm.filename #檔名 catIm.format_description #影象格式 catIm.save('zophie.jpg') #檔案拓展名是什麼,就用什麼格式儲存下來
  • image.new( )
    作用:返回一個新的Image物件
    包含引數:
  1. 字串‘RGBA’
  2. 大小,寬度和高度的元組
  3. 背景顏色

程式碼舉例:

im = Image.new("RGBA", (300, 100), 'purple')
im.save("purpleImage.png")

im2 = Image.new("RGBA", (300,100)) #沒有指定顏色,那麼就預設為不可見的黑色 (0, 0, 0, 0)
im2.save('transparentsImage.png')

2.2 裁剪圖片

意涵: 在影象內選擇一個矩形區域,並刪除矩形區域外的一切。

  • crop()
    作用: 接受一個矩形元組,返回一個Image物件 。返回的是新的物件,元物件不會改變
    程式碼舉例:
from PIL import Image
croppedIm = catIm.crop((355, 345, 565, 560))
croppedIm.save("Cropped.png")

2.3 複製和貼上影象到其他影象

  • copy( )
    **作用:**返回一個新的Image物件
    程式碼舉例:
catIm = Image.open('zophie.png')
catcopyIm = catIm.copy()
  • paste( )
    作用: 在Image物件(主Image物件)上呼叫,將另一個影象(源Image物件)貼上在它上面
    程式碼舉例:
faceIm = catIm.crop((335, 345, 565, 560))
catcopyIm.paste(faceIm, (0, 0))
catcopyIm.paste(faceIm, (400, 500))
catcopyIm.save("pasted.png")

上述程式碼實現在原點和在(400, 500)處貼上影象

catImWidth, catImHeight = catIm.size
faceImWidth, faceImHeight = faceIm.size
catCopyTwo = catIm.copy()
for left in range(0, catImWidth, faceImWidth):
    for top in range(0, catImHeight, faceImHeight):
        print(left, top)
        catCopyTwo.paste(faceIm, (left, top))

catCopyTwo.save('tiled.png')

上述程式碼實現平鋪效果

2.4 調整影象大小

  • resize()方法
    作用: 在Image物件上呼叫,返回指定寬度和高度的新Image物件。它不會修改原Image,而是會建立一個新的Image。
    用法: 接受兩個整數作為引數,表示返回影象的新寬度和新高度
    程式碼舉例:
catIm = Image.open("zophie.png")
width, height = catIm.size
quartersizeIm = catIm.resize((int(width / 2), int(height / 2)))
quartersizeIm.save('quartersized.png')
svelteIm = catIm.resize((width, height + 300))
svelteIm.save('svelte.png')

2.5 旋轉和翻轉影象

  • rotate()
    **作用:**返回旋轉後的新Image物件
    程式碼舉例:
from PIL import Image
catIm = Image.open('zophie.png')
catIm.rotate(90).save("rotated90.png")  #連續呼叫
    • expand 關鍵字引數
      設定為True, 就會放大影象的尺寸,以適應這個旋轉後的影象。如:
catIm.rotate(36, expand = True).save("rotated36.png")
  • transpose()
    作用: 得到影象的映象翻轉
    TIPS: 必須傳入引數 FLIP_LEFT_RIGHT 或者 FLIP_TOP_BOTTOM
    程式碼舉例:
catIm.transpose(Image.FLIP_LEFT_RIGHT).save("horizontal_flip.png")
catIm.transpose(Image.FLIP_TOP_BOTTOM).save("vertical_flip.png")

2.6 更改單個畫素

  • getpixel()
  • putpixel()

作用:接受元組,作為畫素的x和y座標 ; putpixel()還接受一個元組,作為該畫素的顏色 要用RGBA或者RGB
程式碼舉例:

from PIL import Image
im = Image.new('RGBA', (100, 100))
im.getpixel((0,0))
for x in range(100):
    for y in range(50):
        im.putpixel((x, y), (128, 128, 128, 255))

from PIL import ImageColor
for x in range(100):
    for y in range(50, 100):
        im.putpixel((x, y), ImageColor.getcolor('darkgray', "RGBA"))

im.save("putPixel.png")

三、 在影象上繪畫

Pillow 的 ImageDraw 模組

要利用這個模組,就首先要輸入以下程式碼

 
from PIL import Image, ImageDraw
im = Image.new('RGBA', (200, 200), 'white') #先得到一個Image物件
draw = ImageDraw.Draw(im)                   #然後再將這個Image物件傳遞給ImageDraw.Draw()函式,
                                            #得到一個ImageDraw物件

3.1 繪製形狀

  • line(xy, fill, width)
    作用: 繪製線條
    TIPS: xy是一個元組的列表, fille是線的顏色
    draw.line([(0, 0), (199, 0), (199, 199), (0, 199), (0, 0)], fill='black')

用line()繪製網狀圖形舉例:


for i in range(100, 200, 10):
    draw.line([(i, 0), (200, i - 100)], fill="green")

im.save("drawing.png")
                                     

繪製結果如下:
在這裡插入圖片描述

  • rectangle(xy, fill, outline)
    作用:繪製方格
    TIPS:xy是矩形元組,形式是(left, top, right, bottom)
    如:draw.rectangle((20, 30, 60, 60), fill="blue")

  • ellipse(xy, fill, outline)
    作用: 繪製橢圓
    如: draw.ellipse((120, 30, 160, 60), fill="red")

  • polygon(xy, fill, outline)
    作用:繪製多邊形
    如:draw.polygon(((57, 87), (79, 62), (94, 85), (120, 90), (103, 113)), fill="brown")

3.2 繪製文字

ImageDraw 的text()方法, 有四個引數 :

  1. xy
  2. text
  3. fill 文字顏色
  4. font 一個imageFont物件,用於設定文字的字型和大小
    另外的方法 - textsize()方法,它的第一個引數是要測量的文字字串,第二個引數是可選的imageFont物件 ,返回一個兩整數元組,表示輸出文字的寬度和高度 用這個方法可以幫助你準確計算文字放在影象上的位置。

程式碼舉例:

from PIL import Image, ImageDraw, ImageFont
import os
im = Image.new("RGBA", (200, 200), "white")
draw = ImageDraw.Draw(im)
draw.text((20, 150), 'Hellow', fill="purple")

FontFolder = '/Users/clufier/sites/opcai/vendor/topthink/think-captcha/assets/ttfs'
arialFont = ImageFont.truetype(os.path.join(FontFolder,'2.ttf'), 22)
draw.text((100, 150), 'Howdy', fill='gray', font=arialFont)
im.save("text.png")