本文目錄一覽:
Python:這有可能是最詳細的PIL庫基本概念文章了
PIL有如下幾個模塊:Image模塊、ImageChops模塊、ImageCrackCode模塊、ImageDraw模塊、ImageEnhance模塊、ImageFile模塊、ImageFileIO模塊、ImageFilter模塊、ImageFont模塊、ImageGrab模塊、ImageOps模塊、ImagePath模塊、ImageSequence模塊、ImageStat模塊、ImageTk模塊、ImageWin模塊、PSDraw模塊
啊啊啊啊怎麼這麼多模塊啊~~~!!!!
別擔心我為你一一講解
Image模塊提供了一個相同名稱的類,即image類,用於表示PIL圖像。
Image模塊是PIL中最重要的模塊 ,比如創建、打開、顯示、保存圖像等功能,合成、裁剪、濾波等功能,獲取圖像屬性功能,如圖像直方圖、通道數等。
Image模塊的使用如下:
ImageChops模塊包含一些算術圖形操作,這些操作可用於諸多目的,比如圖像特效,圖像組合,算法繪圖等等,通道操作只用於8位圖像。
ImageChops模塊的使用如下:
由於圖像im_dup是im的複製過來的,所以它們的差為0,圖像im_diff顯示時為黑圖。
ImageCrackCode模塊允許用戶檢測和測量圖像的各種特性。 這個模塊只存在於PIL Plus包中。
因為我目前安裝的PIL中沒有包含這個模塊。所以就不詳細介紹了
ImageDraw模塊為image對象提供了基本的圖形處理功能。 例如,它可以創建新圖像,注釋或潤飾已存在圖像,為web應用實時產生各種圖形。
ImageDraw模塊的使用如下:
在del draw前後顯示出來的圖像im是完全一樣的,都是在原有圖像上畫了兩條對角線。
原諒我的報錯
ImageEnhance模塊包括一些用於圖像增強的類。它們分別為 Color類、Brightness類、Contrast類和Sharpness類。
ImageEnhance模塊的使用如下:
圖像im0的亮度為圖像im的一半。
ImageFile模塊為圖像打開和保存功能提供了相關支持功能。另外,它提供了一個Parser類,這個類可以一塊一塊地對一張圖像進行解碼(例如,網絡聯接中接收一張圖像)。這個類的接口與標準的sgmllib和xmllib模塊的接口一樣。
ImageFile模塊的使用如下:
因為所打開圖像大小大於1024個byte,所以報錯:圖像不完整。
所以大家想看的可以自行去找一個小一點的圖看一下
ImageFileIO模塊用於從一個socket或者其他流設備中讀取一張圖像。 不贊成使用這個模塊。 在新的code中將使用ImageFile模塊的Parser類來代替它。
ImageFilter模塊包括各種濾波器的預定義集合,與Image類的filter方法一起使用。該模塊包含這些圖像增強的濾器:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH,SMOOTH_MORE和SHARPEN。
ImageFilter模塊的使用如下:
ImageFont模塊定義了一個同名的類,即ImageFont類。這個類的實例中存儲着bitmap字體,需要與ImageDraw類的text方法一起使用。
PIL使用自己的字體文件格式存儲bitmap字體。用戶可以使用pilfont工具包將BDF和PCF字體描述器(Xwindow字體格式)轉換為這種格式。
PIL Plus包中才會支持矢量字體。
ImageGrab模塊用於將屏幕上的內容拷貝到一個PIL圖像內存中。 當前的版本只在windows操作系統上可以工作。
ImageGrab模塊的使用如下:
圖像im顯示出筆記本當前的窗口內容,就是類似於截圖的工具
ImageOps模塊包括一些“ready-made”圖像處理操作。 它可以完成直方圖均衡、裁剪、量化、鏡像等操作 。大多數操作只工作在L和RGB圖像上。
ImageOps模塊的使用如下:
圖像im_flip為圖像im垂直方向的鏡像。
ImagePath模塊用於存儲和操作二維向量數據。Path對象將被傳遞到ImageDraw模塊的方法中。
ImagePath模塊的使用如下:
ImageSequence模塊包括一個wrapper類,它為圖像序列中每一幀提供了迭代器。
ImageSequence模塊的使用如下:
後面兩次show()函數調用,分別顯示第1張和第11張圖像。
ImageStat模塊計算一張圖像或者一張圖像的一個區域的全局統計值。
ImageStat模塊的使用如下:
ImageTk模塊用於創建和修改BitmapImage和PhotoImage對象中的Tkinter。
ImageTk模塊的使用如下:
這個是我一直不太懂的有沒有大佬能幫我解決一下在線等~急!
PSDraw模塊為Postscript打印機提供基本的打印支持。用戶可以通過這個模塊打印字體,圖形和圖像。
PIL中所涉及的基本概念有如下幾個: 通道(bands)、模式(mode)、尺寸(size)、坐標系統(coordinate system)、調色板(palette)、信息(info)和濾波器(filters)。
每張圖片都是由一個或者多個數據通道構成。PIL允許在單張圖片中合成相同維數和深度的多個通道。
以RGB圖像為例,每張圖片都是由三個數據通道構成,分別為R、G和B通道。而對於灰度圖像,則只有一個通道。
對於一張圖片的通道數量和名稱,可以通過getbands()方法來獲取。getbands()方法是Image模塊的方法,它會返回一個字符串元組(tuple)。該元組將包括每一個通道的名稱。
Python的元組與列表類似,不同之處在於元組的元素不能修改,元組使用小括號,列表使用方括號,元組創建很簡單,只需要在括號中添加元素,並使用逗號隔開即可。
getbands()方法的使用如下:
圖像的模式定義了圖像的類型和像素的位寬。當前支持如下模式:
1:1位像素,表示黑和白,但是存儲的時候每個像素存儲為8bit。
L:8位像素,表示黑和白。
P:8位像素,使用調色板映射到其他模式。
I:32位整型像素。
F:32位浮點型像素。
RGB:3×8位像素,為真彩色。
RGBA:4×8位像素,有透明通道的真彩色。
CMYK:4×8位像素,顏色分離。
YCbCr:3×8位像素,彩色視頻格式。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
可以通過mode屬性讀取圖像的模式。其返回值是包括上述模式的字符串。
mode 屬性 的使用如下:
通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。
mode屬性的使用如下:
PIL使用笛卡爾像素坐標系統,坐標(0,0)位於左上角。注意:坐標值表示像素的角;位於坐標(0,0)處的像素的中心實際上位於(0.5,0.5)。
坐標經常用於二元組(x,y)。長方形則表示為四元組,前面是左上角坐標。例如:一個覆蓋800×600的像素圖像的長方形表示為(0,0,800,600)。
調色板模式 (“P”)使用一個顏色調色板為每個像素定義具體的顏色值
使用info屬性可以為一張圖片添加一些輔助信息。這個是字典對象。加載和保存圖像文件時,多少信息需要處理取決於文件格式。
info屬性的使用如下:
對於將多個輸入像素映射為一個輸出像素的幾何操作,PIL提供了4個不同的採樣濾波器:
NEAREST:最近濾波。 從輸入圖像中選取最近的像素作為輸出像素。它忽略了所有其他的像素。
BILINEAR:雙線性濾波。 在輸入圖像的2×2矩陣上進行線性插值。注意:PIL的當前版本,做下採樣時該濾波器使用了固定輸入模板。
BICUBIC:雙立方濾波。 在輸入圖像的4×4矩陣上進行立方插值。注意:PIL的當前版本,做下採樣時該濾波器使用了固定輸入模板。
ANTIALIAS:平滑濾波。 這是PIL 1.1.3版本中新的濾波器。對所有可以影響輸出像素的輸入像素進行高質量的重採樣濾波,以計算輸出像素值。在當前的PIL版本中,這個濾波器只用於改變尺寸和縮略圖方法。
注意:在當前的PIL版本中,ANTIALIAS濾波器是下採樣 (例如,將一個大的圖像轉換為小圖) 時唯一正確的濾波器。 BILIEAR和BICUBIC濾波器使用固定的輸入模板 ,用於固定比例的幾何變換和上採樣是最好的。Image模塊中的方法resize()和thumbnail()用到了濾波器。
resize()方法的定義為:resize(size, filter=None)= image
resize()方法的使用如下:
對參數filter不賦值的話,resize()方法默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
thumbnail ()方法的定義為:im.thumbnail(size, filter=None)
thumbnail ()方法的使用如下:
這裡需要說明的是,方法thumbnail()需要保持寬高比,對於size=(200,200)的輸入參數,其最終的縮略圖尺寸為(182, 200)。
對參數filter不賦值的話,方法thumbnail()默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
python如何安裝pil庫
PIL:Python Imaging Library,已經是Python平台事實上的圖像處理標準庫了。
由於PIL僅支持到Python 2.7,加上年久失修,於是一群志願者在PIL的基礎上創建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了許多新特性,因此,我們可以直接安裝使用Pillow。
安裝Python時已經把pip3也備好了,可以直接使用pip3安裝PIL
命令行:pip3 install pillow
注意:
1.PIL安裝包名字的pillow
2.使用pip3命令時,是要在pip3.exe所在路徑下才能執行。一般pip3.exe是在python安裝目錄下的Script文件夾中。
更多Python相關技術文章,請訪問Python教程欄目進行學習!以上就是小編分享的關於python如何安裝pil庫的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!
1.圖像裁剪、加邊框、旋轉(Python PIL)
日常工作中經常要用Photoshop打印一些地質圖,雖然說PS有動作錄製的功能,但是打印這個功能我嘗試過錄製動作後並未能成功運行,而且要打印的圖像尺寸很多都是不同的,試了幾次後就放棄了,直到後來Python學起來了,通過pywinauto庫實現了這個功能,在這裡就簡單記錄下吧。
在寫Photoshop的打印操作之前,先來回顧下打印之前的圖像處理工作。
接到的地質圖多為MapGIS程序導出的jpg圖片,偶爾也會有Tif格式的遙感圖。對這些圖像進行打印很簡單,基本流程是:用PS打開圖像-裁剪圖像四周空白邊緣-為圖像四周加上3cm寬白色邊框(為了美觀和裝訂的需要)-打印。那為啥用PS來打印不直接用Windows自帶打印呢,應該是打印需要用到PS特定的顏色處理模式吧,經過試驗,通過兩種方式打出來的色彩效果確實是不同的。
打印前圖像處理的主要目標很簡單:
1、裁剪圖像四周空白
2、為圖像四周加上3cm白色邊框
下面就用Python實現它們
圖像處理主要用的是PIL這個庫,中途由於單位電腦比較舊(4g內存Win7 32位系統,後來重裝成64位了,體驗就是搞這種東西必須整個64位系統),性能不太行了,也用Opencv整了下,還是感覺PIL稍微快那麼一點點,不知道是不是錯覺呢。
(後來發現這兩步在PS錄個動作也能輕鬆完成(→ܫ←))
一、獲取所有圖片路徑
有時候要打印的圖片會放在好多個不同文件夾裡面,要把它們遍歷出來:
import os
二、讀取圖片並裁剪四周空白
import PIL
獲得了圖像尺寸後接下來就要對圖像進行邊緣空白的裁剪了(其實這兩步不分先後順序的):
裁剪的思路是網上搜到的,整理下就是:
1、先把圖像轉成灰度模式(值變成單一的0-255以方便判斷,如果要裁剪其他顏色我就不知道了,我這裡只要裁掉最常見的由MapGIS導出的標準的白色邊緣)。
2、分別從四個方向掃描圖像,找到四個方向各自第一個灰度值不為255(最純粹的白色(→ܫ←))的像素,記下它的坐標(i,j)。
3、通過四組坐標大小比較,得到圖像除了四周空白區域外的坐標極值,也就得到了裁剪的區域左上(left,top)和右下坐標(right,bottom)。
4、利用PIL.Image.crop(),完成圖像的裁剪。
5、沒了,就是後來發現PIL自帶這個算法,引用一下: 使用PIL裁剪圖片白邊
要是用PS來做呢,‘圖像-裁切-確定’就完事了。
三、給裁剪後的圖像加上x厘米的白色邊框
這一步主要是為了打印出來的圖規範且美觀。
這一步要是用PS來搞,‘圖像-畫布大小-設置相對的寬度和高度’ 就好了
四、判斷圖像是否需要旋轉。
為什麼要旋轉這些圖像呢?因為最終是要把它們用打印機打印出來,而打印機能打印的最大寬度是有限的,所以就有了這個步驟。
單位的打印機型號是惠普的HP DesignJet Z6200 60 英寸照片打印機,最大打印紙張寬度是60英寸,大約就是1524mm左右吧,除了最大尺寸外,日常還用到的紙張寬度有440、610、914、1067、1274等6、7種吧,所以出於節約打印時間和省錢的考慮,為每張圖選擇最合適的打印紙張寬度也是很有必要的。
判斷圖像是否需要旋轉的思路是這樣的:
1、比較圖像的寬和高,判斷誰是圖像的長邊和短邊。
2、短邊如果大於1524mm,這圖按1:1就打不出來了,超過打印機最大可裝入的紙張的寬度,把這個圖像文件放到Oversize_path路徑下,後續自己看着辦。
3、在短邊小於等於1524mm的前提下,根據對圖像寬高和長短邊的比較,有兩種需要旋轉的情況:
3.1 如果圖像的寬是長邊(矮胖的矩形),且寬大於1524mm,那麼這圖得旋轉90°;
3.2 如果圖像的高是長邊(瘦高的矩形),且高小於1524mm,那麼這圖也得旋轉90°。
*printTOtkinter()是個用tkinter搞的進度顯示窗口,就輸出下一些文本信息而已。
五、為圖像選擇最合適的打印紙張尺寸
單位打印紙有438、610、914、1524等7種寬度,現在要選出最適合的一種來進行打印。
在把短邊大於1524這種情況排除之後,剩下的圖像情況為短邊小於1524,即單位的打印機能打印出來了。
這時要判斷最佳打印用紙的寬度,有兩種情況需要考慮:
1、長邊>1524,改用短邊來比較選擇打印紙寬度。
2、長邊 ≤ 1524,用長邊來比較選擇打印紙寬度。
下面思路就是把要用作比較的邊長放入紙張寬度列表,把列表排序後找到比這個邊長大一點的那個紙張寬度。
主要的步驟就是這些,再經過一頓複製粘貼完善一下其他細節之後,最後會得到一個存放打印信息的列表,把它用txt存起來,這樣後面的PS批量打印需要的信息就全部搞到手了。最後放個gif。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/181472.html