Python3 用PIL處理圖像(一)——PIL的基礎運用

PIL是一個功能非常強大的第三方圖像處理庫,它可以轉化圖像格式、創建縮略圖、顯示圖像、截取圖像、翻轉或旋轉圖片等等;原本PIL是隻支持python2的,後來出現了移植到python3的pillow,其功能與PIL相似,所以這裏需要注意。
 

一、安裝PIL

pip install pillow

我在安裝的時候出現了網絡延遲報錯等情況,總之鍥而不捨,多試幾次,或者換個時間再來,前提是命令不要出錯;

 

二、PIL的核心類——Image

Image是PIL的核心類,裏面存儲了PIL處理的必須參數和基礎方法,接下來我們就通過這個類對圖像進行初步處理;

  1. open(文件路徑)方法,返回一個圖片對象
    from PIL import Image            # 導入Image庫
    
    img = Image.open('logo.png')    # 打開圖像文件,返回Image對象
    print(img)                       # 輸出文件對象信息
    '''
    PngImageFile        圖像格式
    mode=1              色彩模式
    size=1540x1540      圖像分辨率
    '''
    print('圖像格式:',img.format)
    print('圖像分辨率:',img.size)
    print('圖像模式:',img.mode)
    
    # 輸出結果:
    # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=400x400 at 0x17066924F28>
    # # 圖像格式: PNG
    # # 圖像分辨率: (400, 400)
    # # 圖像模式: RGBA

    從上面我們可以知道Image對象有format、size和mode三個屬性:
      format屬性表示圖像的格式,我們常見的有JPG、PNG等
      size屬性即爲圖片的分辨率,用像素表示
      mode屬性定義了像素類型、顏色深度等等,這一塊涉及到的原型比較複雜,後面再慢慢理解,現在只需要知道的是:L表示灰度圖像、RGB表示真彩圖像、CMYK表示預先壓縮的圖像;上面的RGBA,最後的A表示Alpha(色彩空間)

    色彩模式
    模式 說明
    1 1位像素,非黑即白,沒有灰度之說,0表示黑,255表示白(一般來說我們生成的二維碼就是1模式);但是存儲佔用8Bit
    L

    8位像素,與1模式相比,L模式有了灰度的變化,即可以表示黑白照片了;

    RGB模式轉L模式公式(注意:最後會取整):R*0.299+G*0.587+B*0.114

    P 8位像素,對應的顏色值是按照調色板查詢出來的,所以也可以使用調色板映射到其他模式
    RGB

    3*8位像素,真彩色圖像,用R、G、B三個通道組合而成,每隔通道用8Bit存儲,可理解成三原色模式

    RGBA 4*8位像素,真彩色+透明通道,在RGB模式的基礎上加上了一個Alpha(透明通道),如果從RGB轉到RGBA,默認A爲255,即爲完全不透明
    CMYK 4*8位像素,出版圖像,一般印刷用這個模式較多
    YCbCr 3*8位像素,彩色視頻格式
    I 32位整型灰度圖像,我們可以理解成,這個是L模式的進階版
    F 32位浮點型像素,這個在I模式的基礎上保留了小數部分
  2. OK,講到這裏,有必要理解一下一張照片是怎麼顯示圖像的,我們先來看下下面這張圖片:

    這是一張照片放大之後的截圖,我們可以看見放大之後流暢的線條消失了,取而代之的是一個一個小方塊,玩過我的世界的朋友可能知道,我的世界其實就是一個像素世界,所有的東西都是由方塊構成的;
    那麼圖片也是一樣,它其實就是由一個一個小的像素點構成的,只不多我們現在的分辨率非常高,基本的1024*768,橫向有1024個像素點,縱向有768個像素點,縮小成一張照片,我們肉眼就很難分別了;
    那麼每一個像素點都有一個值,我們最常使用的就是用RGB表示顏色,當這些顏色都鋪滿整個畫面的時候,就構成了一個圖像,這個就是圖像的顯示原理;
    現在有一種隱寫術,就是可以用圖片作爲介質,隱藏我們需要保存的數據,他是怎麼實現的呢?我們知道一個像素點是由RGB三個通道構成,一個通道佔8bit,假設我將最後一位清空用於保存我們的數據,那麼一個1024*768的圖片就有1024*768*3=2,359,296‬bit的空間給我們保存數據,即可以保存1024*768*3/8/1024=288kb的數據;那麼這樣不會破壞原來的照片嘛,會,但是顏色的差別微乎其微,我們的肉眼根本分辨不出來,這樣我們就可以將信息以其他載體隱藏起來啦。
  3. show()方法,顯示圖像


    這個方法非常簡單,會用系統默認圖片瀏覽器打開圖片;

  4. save(文件路徑,後綴名)方法,保存指定格式的圖像
    將此圖像保存在給定的文件名下, 如果未指定格式,則儘可能使用文件名擴展名確定要使用的格式;

  5. transpose(翻轉模式)方法,翻轉圖像


    通過原型,我們可以知道翻轉模式有以下幾種:
        Image.FLIP_LEFT_RIGHT,表示將圖像左右翻轉
        Image.FLIP_TOP_BOTTOM,表示將圖像上下翻轉
        Image.ROTATE_90,表示將圖像逆時針旋轉90°
        Image.ROTATE_180,表示將圖像逆時針旋轉180°
        Image.ROTATE_270,表示將圖像逆時針旋轉270°
        Image.TRANSPOSE,表示將圖像進行轉置(相當於順時針旋轉90°)
        Image.TRANSVERSE,表示將圖像進行轉置,再水平翻轉
    下面我們來看下效果:

  6. thumbnail((尺寸),採樣算法) 創建縮略圖(注意:尺寸傳參的是元組)

    這張照片的差別感覺不大,但是NEAREST採樣方式是最差的,默認使用的是BICUBIC,我們一般使用LANCZOS作爲我們的採樣算法,對於其中的差別,還是要多試,找到自己需求的那一個就好;
  7. resize((尺寸),採樣算法) 調整圖片分辨率

    這個方法跟thumbnail()的用法和功能還是非常相近,區別是:thumbnail()分辨率不能大於原分辨率,如果大於了也不會報錯,最按照原分辨率設置,resize()則沒有這個限制;
  8. rotate(角度) 逆時針旋轉圖像到指定角度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章