Pillow 圖片處理模塊

来源:https://www.cnblogs.com/amwkvi/archive/2022/04/19/16166126.html
-Advertisement-
Play Games

Pillow 圖片處理模塊 Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。 安裝Pillow pi ...


Pillow 圖片處理模塊

Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。

  1. 安裝Pillow

    pip install pillow

    Pillow安裝成功後,需要用PIL導入:

    import PIL

    from PIL import Image

    Image是最常用的模塊。

  2. 打開或者新建一張圖片

    import PIL
    from PIL import Image
    pic = Image.open('11.jpg')
    pic.show()
    im = Image.new('RGB', (480, 640), ('pink'))
    im.show()
    

    Image.new()方法有三個參數:圖像模式(RGB),圖像尺寸(寬,高),顏色(red,green,blue),顏色可以直接用#0000FF或者blue表示藍色。

    Image.show()方法可以調用系統自帶的圖像查看程式顯示當前圖片,如系統中並未安裝相應程式,有執行程式時將無任何顯示。

  3. Image模塊的常用屬性

    print('寬:', pic.width)  # 寬: 1361
    print('高:', pic.height)  # 高: 1814
    print('尺寸:', pic.size)  # 尺寸: (1361, 1814)
    print('色彩模式:', pic.mode)  # 色彩模式: RGB
    print('圖像格式:', pic.format)  # 圖像格式: JPEG
    # print('圖片類別:', pic.category)
    print('只讀:', pic.readonly)  # 只讀: 1
    print('圖片信息:', pic.info)  # 圖片信息: {'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)}
    

    其中size屬性返回的是一個元組。

  4. Image.convert()方法進行圖像模式(mode)轉換,支持以下標準模式:

    convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 將當前圖片轉換為指定的模式,並且返迴轉換後的圖片。

    如果不指定模式,則選擇一種能保留圖片所有信息且不使用調色板的模式(通常的結果是不轉換)。

    mode 描述
    1 1位像素,黑白,每位元組存儲一個像素
    L 8位像素,黑白
    P 8位像素,使用調色板映射到任何其他模式
    RGB 3x8位像素,真彩色
    RGBA 4x8位像素,帶透明蒙版的真彩色
    CMYK 4x8位像素,分色
    YCbCr 3x8位像素,彩色視頻格式
    LAB 3x8位像素,L * a * b顏色空間
    HSV 3x8位像素,色相,飽和度,值顏色空間
    I 32位有符號整數像素
    F 32位浮點像素

    1位像素的範圍是0-1,0表示黑1表示白,中間表示灰。8位像素的範圍是0-255,如RGB的(0, 0, 0)表示黑,(255, 255, 255)表示白,依此類推。

    pic1 = pic.convert('1')
    pic1.show()
    

    convert()方法有5個參數,都有預設值,根據轉換的模式來傳值:

    mode,圖片的模式,傳入需要轉換的模式。部分模式之間不支持轉換,代碼會報錯。

    matrix, 轉換矩陣。傳入該參數時,應該傳入由浮點數構成的元組,元組長度為4或12。matrix只支持從少數模式轉換成'L'或'RGB'。

    dither, 高頻振動,用於控制顏色抖動。從模式'RGB'轉換為'P'或從'RGB'或'L'轉換為'1'時使用。可用的方法有'NONE'或'FLOYDSTEINBERG'(預設)。當提供了matrix參數時不使用此功能。

    palette, 調色板,用於控制調色板的產生。從模式'RGB'轉換為'P'時使用,可用的方法有'WEB'(預設)或'ADAPTIVE'。'ADAPTIVE'表示使用自適應的調色板。

    colors, 自適應調色板使用的顏色數。當palette參數為'ADAPTIVE'時,用於控制調色板的顏色數目。預設是最大值,即256種顏色。

  5. 圖片的複製、粘貼和保存

    pic = Image.open('11.jpg')
    im = Image.new('RGB', (128, 128), (255, 0, 0))
    im1 = Image.new('RGBA', (128, 128), (0, 0, 255))
    pic1 = pic.copy()
    pic1.paste(im, (640, 600), mask=im1)
    pic1.save('22.jpg', quality=95, subsampling=0)
    

    Image.copy()方法:將指定對象複製並返回。

    Image.paste(im,(行,列),mask=None):在當前圖片對象基礎上,把im對象粘貼到指定位置,mask參數指定蒙板。

    Image.save()方法:保存當前圖片對象到指定位置。

    具體說明

    copy(): 拷貝當前的圖片,拷貝出來的圖片與原圖一模一樣。如果想在圖片上粘貼一些內容,又想保留原圖時,可以使用此方法。

    paste(im, box=None, mask=None): 將另一張圖片粘貼到當前圖片中,如果粘貼的模式不匹配,則將被粘貼圖片的模式轉換成當前圖片的模式。有3個參數。

    im, 被粘貼的圖片。傳入一張圖片,當第二個參數box指定的是一個區域時,im參數也可以是一個整數或顏色值(元組表示,16進位表示和顏色名都可以,如上面代碼中的image_new可以換成(0, 0, 255), '#0000FF', 'blue')。

    box, 圖片粘貼的位置或區域。傳入一個長度為2或4的元組,如果不傳值,預設為(0, 0),圖片被粘貼在當前圖片的左上角。如果傳入長度為2的元組(x, y),表示被粘貼圖片的左上角坐標位置。如果傳入長度為4的元組(x1, y1, x2, y2),表示圖片粘貼的區域,此時區域的大小必須與被粘貼圖片一致,否則會報錯,傳入的元組長度為其他值也會報錯。

    mask, 蒙版。傳入一張與被粘貼圖片尺寸一樣的圖片,可以使用模式為'1'、'L'或者'RGBA'的圖像。如果mask圖像的顏色值為255,則直接按被粘貼圖片的顏色粘貼,如果mask圖像的顏色值為0,則保留當前圖片的顏色(相當於沒有粘貼),如果mask圖像的顏色值為0~255之間的值,則將im與mask進行混合後再粘貼。

    save(fp, format=None, quality=95, subsampling=0): 將當前圖片按指定的文件名保存,運行後會將圖片按新名字保存在當前路徑下(也可以指定路徑)。文件名最好帶擴展名,方便打開,format表示圖片的格式,沒有指定format則會根據擴展名來解析(如果能解析出來),一般不需要指定format,傳入一個規範的文件名即可。quality:壓縮比,預設是75。subsampling:可選參數為0,1,2;選擇0即可實現小變大的需求。

  6. 圖片裁剪和縮放

    pic = Image.open('11.jpg')
    im_crop = pic.crop(box=(200, 200, 680, 840))
    im_crop.show()
    im_resize = pic.resize((480, 640),reducing_gap=2)
    im_resize.show()
    

    im_crop = pic.crop(box=(200, 200, 680, 840)):裁剪圖片,box參數中的四個數字為圖片坐標,分別是x1,y1,x2,y2。

    im_resize = pic.resize((480, 640),reducing_gap=2)

    crop(box=None):裁剪圖片,返回裁剪區域的圖片。box表示裁剪的區域,傳入長度為4的元組(x1, y1, x2, y2),不傳預設為拷貝原圖,相當於copy()方法,如果裁剪的區域超過了原圖的區域,超出部分用像素格填充。

    resize(size, resample=BICUBIC, box=None, reducing_gap=None): 縮放圖片,返回縮放後的圖片。有4個參數。

    size, 圖片縮放後的尺寸,傳入一個長度為2的元組(width, height)。

    resample, 重採樣,是一個可選的重採樣過濾器。可以傳入Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOS。預設過濾器為Image.BICUBIC。如果圖像的模式為'1'或'P',則始終設置為Image.NEAREST。

    box, 縮放圖片的區域。傳入長度為4的元組(x1, y1, x2, y2),這個區域必須在原圖的(0, 0, width, height)範圍內,如果超出範圍會報錯,如果不傳值則預設將整張原圖進行縮放。

    reducing_gap, 減少間隙。傳入一個浮點數,用於優化圖片縮放效果,預設不進行優化,值大於3.0時優化效果基本已經是公平的重採樣。

  7. 圖片旋轉和翻轉

    • rotate()方法:將圖片對象進行旋轉,可以實現順時針或逆時針任意角度。
    • transpose()方法:將圖片對象進行順時針或逆時針90度旋轉或者翻轉,區別於上面的方法不能任意角度,但可以進行垂直或水平翻轉。 ★★★★★這個方法比較常用,但根據系統提示在Pillow10(2023-07-01)更新後會停用現在的方法。
    im_resize.rotate(45).show()         # 圖片向左(逆時針)旋轉45度並顯示。
    im_resize.transpose(Image.FLIP_LEFT_RIGHT).show()   # 逆時針旋轉90度並顯示。
    im_resize.transpose(Image.FLIP_TOP_BOTTOM).show()   # 逆時針旋轉90度並顯示。
    im_resize.transpose(Image.ROTATE_90).show()     # 逆時針旋轉90度並顯示。
    im_resize.transpose(Image.ROTATE_180).show()    # 逆時針旋轉90度並顯示。
    im_resize.transpose(Image.ROTATE_270).show()    # 逆時針旋轉90度並顯示。
    
  8. 圖片特效

    Pillow提供一些簡單的圖片特效使用,需要從PIL庫中導入ImageFilter模塊。

     pic = Image.open('11.jpg')
     def pic_filter(imfile, x):
         filters = [
             ImageFilter.BLUR,   # 模糊效果
             ImageFilter.DETAIL, # 細節效果
             ImageFilter.CONTOUR,    # 輪廓效果
             ImageFilter.EDGE_ENHANCE,   # 邊緣增強(比銳化更好)
             ImageFilter.EDGE_ENHANCE_MORE,  # 進一步邊緣增強
             ImageFilter.FIND_EDGES, # 查找邊緣
             ImageFilter.EMBOSS,     # 浮雕效果
             ImageFilter.SHARPEN,    # 銳化
             ImageFilter.SMOOTH,     # 平滑
             ImageFilter.SMOOTH_MORE,    # 進一步平滑
         ]
     return imfile.filter(filters[x]) # 根據列表序號選擇效果並顯示
     pic_filter(pic,3).show()
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天有個粉絲加了我,問我如何實現類似shiro的資源許可權表達式的訪問控制。我以前有一個小框架用的就是shiro,許可權控制就用了資源許可權表達式,所以這個東西對我不陌生,但是在Spring Security中我並沒有使用過它,不過我認為Spring Security可以實現這一點。是的,我找到了實現它的 ...
  • Python 能做很多無聊,但有意思的事情,例如接下來的一些案例。 Python 整蠱程式 以下程式,不要發代碼,要不實現不了你整蠱的目的。 要打包成一個 exe 程式,發給朋友才有意思。 使用 pip install pyinstaller。 打包命令如下: pyinstaller -F 文件名. ...
  • 引用 引用的基本使用 作用:給變數起別名 語法:數據類型 &別名 = 原名 引用註意事項 引用必須初始化 引用一旦初始化,就不可以更改(一個別名只能初始化一次:只可以跟一個原名) 引用做函數參數 函數傳參時,可以用引用技術讓形參修飾實參 簡化指針修飾形參 #include<iostream> usi ...
  • Spring 配置文件自定義標簽的前置條件 在上一篇文章https://www.cnblogs.com/redwinter/p/16165274.html Spring BeanFactory的創建過程中瞭解了BeanDefinition的載入和BeanFactory的創建,並且提到了Spring留 ...
  • 本文實現用Python將文本文件自動保存到Excel表格裡面去。 需求 將錦江區.txt 文件中的數據整理到 錦江區.xlsx 的 錦江區 sheet ; 將推薦菜欄位丟棄(保留前面14個欄位) ; 將人均消費中的 ¥ 符號去掉,如果價格為空整條數據都不要; 成果展示 txt文本部分數據 效果 稍微 ...
  • 1.導包(配置pom.xml) 一定要用這個網站:https://mvnrepository.com/ 點擊查看代碼 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4 ...
  • 控制小數位數 控制數值變大變小 數字轉漢字格式 引入 cn.hutool.core.convert 包 ...
  • 車牌識別在高速公路中有著廣泛的應用,比如我們常見的電子收費(ETC)系統和交通違章車輛的檢測,除此之外像小區或地下 車庫門禁也會用到,基本上凡是需要對車輛進行身份檢測的地方都會用到。 簡介 車牌識別系統(Vehicle License Plate Recognition)是電腦視頻圖像識別技術在車 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...