PIL使用說明

使用Image類

Python Imaging Library中最重要的類是 :py:class:`~PIL.Image.Image`類,在模塊中定義,具有相同的名稱。您可以通過多種方式創建此類的實例; 通過從文件加載圖像,處理其他圖像或從頭開始創建圖像。

要從文件加載圖像,請在:py:mod:`~PIL.Image`模塊中使用:py:func:`~PIL.Image.open`函數:

>>>來自PIL導入圖片
>>> im = Image.open(“hopper.ppm”)

如果成功,則此函數返回:py:class:`~PIL.Image.Image`對象。您現在可以使用實例屬性來檢查文件內容:

>>>來自__future__ import print_function
>>> print(im.format,im.size,im.mode)
PPM(512,512)RGB

:吡啶:ATTR:`〜PIL.Image.Image.format`屬性標識的圖像的源。如果未從文件中讀取圖像,則將其設置爲“無”。size屬性是一個包含寬度和高度(以像素爲單位)的2元組。的 :吡啶:ATTR:`〜PIL.Image.Image.mode`屬性定義的數量和圖像中的頻帶的名字,並且還像素類型和深度。常見模式是灰度圖像的“L”(亮度),真彩色圖像的“RGB”和印前圖像的“CMYK”。

如果無法打開文件,則會引發:py:exc:`IOError`異常。

獲得:py:class:`~PIL.Image.Image`類的實例後,可以使用此類定義的方法來處理和操作圖像。例如,讓我們顯示剛剛加載的圖像:

>>> im.show()

注意

標準版:py:meth:`~PIL.Image.Image.show`效率不高,因爲它將圖像保存到臨時文件並調用 :command:`xv`實用程序來顯示圖像。如果您沒有:command:`xv` 安裝,它甚至不起作用。當它工作時,它非常方便調試和測試。

以下部分概述了此庫中提供的不同功能。

讀寫圖像

Python Imaging Library支持各種圖像文件格式。要從磁盤讀取文件,請在:py:mod:`~PIL.Image`模塊中使用:py:func:`~PIL.Image.open`函數 。您無需知道打開文件的文件格式。庫根據文件內容自動確定格式。

要保存文件,請使用:py:class:`~PIL.Image.Image`類的:py:meth:`~PIL.Image.Image.save`方法 。保存文件時,名稱變得很重要。除非指定格式,否則庫使用文件擴展名來發現要使用的文件存儲格式。

將文件轉換爲JPEG

來自__future__ import print_function
import os,sys
來自PIL導入圖片

對於infile in sys.argv [1:]:
    f,e = os.path.splitext(infile)
    outfile = f +“.jpg”
    如果infile!= outfile:
        嘗試:
            Image.open(INFILE).save(OUTFILE)
        除了IOError:
            打印(“無法轉換”,infile)

第二個參數可以提供給:py:meth:`~PIL.Image.Image.save` 方法,該方法明確指定文件格式。如果使用非標準擴展,則必須始終以這種方式指定格式:

創建JPEG縮略圖

來自__future__ import print_function
import os,sys
來自PIL導入圖片

size =(128,128)

對於infile in sys.argv [1:]:
    outfile = os.path.splitext(infile)[0] +“。thumbnail”
    如果infile!= outfile:
        嘗試:
            im = Image.open(infile)
            im.thumbnail(大小)
            im.save(outfile,“JPEG”)
        除了IOError:
            打印(“無法創建縮略圖”,infile)

重要的是要注意,除非確實需要,否則庫不會解碼或加載柵格數據。當您打開文件時,將讀取文件頭以確定文件格式並提取解碼文件所需的模式,大小和其他屬性等內容,但文件的其餘部分直到稍後纔會處理。

這意味着打開圖像文件是一種快速操作,它與文件大小和壓縮類型無關。這是一個快速識別一組圖像文件的簡單腳本:

識別圖像文件

來自__future__ import print_function
導入系統
來自PIL導入圖片

對於infile in sys.argv [1:]:
    嘗試:
        使用Image.open(infile)作爲im:
            print(infile,im.format,“%dx%d”%im.size,im.mode)
    除了IOError:
        通過

剪切,粘貼和合並圖像

:潘岳:類:`〜PIL.Image.Image`類包含讓您在圖像內操作區域的方法。要從圖像中提取子矩形,請使用:py:meth:`~PIL.Image.Image.crop`方法。

從圖像複製子矩形

box =(100,100,400,400)
region = im.crop(方框)

該區域由4元組定義,其中座標爲(左,上,右,下)。Python Imaging Library使用左上角帶有(0,0)的座標系。另請注意,座標是指像素之間的位置,因此上例中的區域恰好是300x300像素。

現在可以以某種方式處理該區域並粘貼回來。

處理子矩形並將其粘貼回來

region = region.transpose(Image.ROTATE_180)
im.paste(地區,盒子)

將區域粘貼回來時,區域的大小必須與給定區域完全匹配。此外,該區域不能延伸到圖像之外。但是,原始圖像和區域的模式不需要匹配。如果沒有,則在粘貼之前自動轉換該區域( 有關詳細信息,請參閱下面的參考:ref:`color-transforms`部分)。

這是另一個例子:

滾動圖像

def roll(圖像,delta):
    “”將圖像側身翻滾。“”
    xsize,ysize = image.size

    delta = delta%xsize
    如果delta == 0:返回圖像

    part1 = image.crop((0,0,delta,ysize))
    part2 = image.crop((delta,0,xsize,ysize))
    part1.load()
    part2.load()
    image.paste(part2,(0,0,xsize-delta,ysize))
    image.paste(part1,(xsize-delta,0,xsize,ysize))

    返回圖片

注意,當從:py:meth:`~PIL.Image.Image.crop` 操作粘貼它時,首先調用:py:meth:`~PIL.Image.Image.load`。這是因爲裁剪是一種懶惰的操作。如果:py:meth:`~PIL.Image.Image.load`未被調用,則在粘貼命令中使用圖像之前不會執行裁剪操作。這意味着part1將從image第一個粘貼已修改的版本中裁剪掉。

對於更高級的技巧,粘貼方法也可以將透明蒙版作爲可選參數。在此掩碼中,值255表示粘貼的圖像在該位置是不透明的(也就是說,粘貼的圖像應該按原樣使用)。值0表示粘貼的圖像完全透明。介於兩者之間的值表示不同的透明度。例如,粘貼RGBA圖像並將其用作蒙版將粘貼圖像的不透明部分,但不粘貼其透明背景。

Python Imaging Library還允許您處理多波段圖像的各個波段,例如RGB圖像。分割方法創建一組新圖像,每個圖像包含來自原始多波段圖像的一個波段。合併功能採用圖像的模式和元組,並將它們組合成新圖像。以下示例交換RGB圖像的三個波段:

拆分和合並樂隊

r,g,b = im.split()
im = Image.merge(“RGB”,(b,g,r))

請注意,對於單波段圖像,:py:meth:`~PIL.Image.Image.split`返回圖像本身。要處理單個色帶,您可能需要先將圖像轉換爲“RGB”。

幾何變換

:吡啶:類:`PIL.Image.Image`類包含的方法 :PY:甲基:`〜PIL.Image.Image.resize`:吡啶:甲基:`〜PIL.Image.Image.rotate`圖像。前者採用一個元組給出新的大小,後者採用逆時針方向的角度。

簡單的幾何變換

out = im.resize((128,128))
out = im.rotate(45)逆時針方向#度

要以90度的步長旋轉圖像,您可以使用 :py:meth:`~PIL.Image.Image.rotate`方法或 :py:meth:`~PIL.Image.Image.transpose`方法。後者也可用於圍繞其水平軸或垂直軸翻轉圖像。

轉置圖像

out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)

transpose(ROTATE)如果expand標誌爲true,則可以使用:py:meth:`~PIL.Image.Image.rotate`操作以相同的方式執行 操作,以對圖像的大小提供相同的更改。

可以通過:py:meth:`~PIL.Image.Image.transform`方法執行更一般的圖像轉換形式 。

顏色變換

Python Imaging Library允許您使用:py:meth:`~PIL.Image.Image.convert`方法在不同像素表示之間轉換圖像。

在模式之間轉換

來自PIL導入圖片
im = Image.open(“hopper.ppm”)。convert(“L”)

該庫支持每種支持模式與“L”和“RGB”模式之間的轉換。要在其他模式之間進行轉換,您可能必須使用中間圖像(通常爲“RGB”圖像)。

圖像增強

Python Imaging Library提供了許多可用於增強圖像的方法和模塊。

過濾器

:吡啶:MOD:`〜PIL.ImageFilter`模塊包含一些預先定義的增強濾波器可以與被使用 :吡啶:甲基:`〜PIL.Image.Image.filter`方法。

應用過濾器

來自PIL導入ImageFilter
out = im.filter(ImageFilter.DETAIL)

點操作

:吡啶:甲基:`〜PIL.Image.Image.point`方法可用於轉換的圖像(例如圖像對比度操縱)的像素值。在大多數情況下,可以將期望一個參數的函數對象傳遞給此方法。根據該功能處理每個像素:

應用點變換

#將每個像素乘以1.2
out = im.point(lambda i:i * 1.2)

使用上述技術,您可以快速將任何簡單表達式應用於圖像。您還可以組合:py:meth:`~PIL.Image.Image.point`和 :py:meth:`~PIL.Image.Image.paste`方法來有選擇地修改圖像:

處理個別樂隊

#將圖像分割成單獨的波段
source = im.split()

R,G,B = 0,1,2

#選擇紅色小於100的區域
mask = source [R] .point(lambda i:i <100和255)

#處理綠色樂隊
out = source [G] .point(lambda i:i * 0.7)

#將已處理的條帶粘貼回來,但僅限於紅色<100的情況
來源[G] .paste(out,None,mask)

#構建一個新的多波段圖像
im = Image.merge(im.mode,source)

請注意用於創建掩碼的語法:

imout = im.point(lambda i:表達式和255)

Python僅在確定結果時評估邏輯表達式的部分,並返回作爲表達式結果檢查的最後一個值。因此,如果上面的表達式爲false(0),Python不會查看第二個操作數,因此返回0.否則返回255。

增強

對於更高級的圖像增強,您可以使用 :py:mod:`~PIL.ImageEnhance`模塊中的類。從圖像創建後,可以使用增強對象快速嘗試不同的設置。

您可以通過這種方式調整對比度,亮度,色彩平衡和清晰度。

增強圖像

來自PIL導入ImageEnhance

enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show(“對比度提高30%”)

圖像序列

Python Imaging Library包含對圖像序列(也稱爲動畫格式)的一些基本支持。支持的序列格式包括FLI / FLC,GIF和一些實驗格式。TIFF文件還可以包含多個幀。

打開序列文件時,PIL會自動加載序列中的第一幀。您可以使用seek和tell方法在不同的幀之間移動:

閱讀序列

來自PIL導入圖片

im = Image.open(“animation.gif”)
im.seek(1)#跳到第二幀

嘗試:
    而1:
        im.seek(im.tell()+ 1)
        #做點什麼
除了EOFError:
    傳遞#序列結束

如本例所示,當序列結束時,你會得到一個:py:exc:`EOFError`異常。

請注意,當前版本的庫中的大多數驅動程序只允許您搜索下一幀(如上例所示)。要回放文件,您可能必須重新打開它。

以下類允許您使用for語句循環遍歷序列:

使用ImageSequence Iterator類

來自PIL導入ImageSequence
for ImageSequence.Iterator(im)中的幀:
    #...做一些框架......

後記打印

Python Imaging Library包含在Postscript打印機上打印圖像,文本和圖形的功能。這是一個簡單的例子:

繪製Postscript

來自PIL導入圖片
來自PIL import PSDraw

im = Image.open(“hopper.ppm”)
title =“hopper”
box =(1 * 72,2 * 72,7 * 72,10 * 72)#in points

ps = PSDraw.PSDraw()#default是sys.stdout
ps.begin_document(標題)

#繪製圖像(75 dpi)
ps.image(box,im,75)
ps.rectangle(盒)

#draw title
ps.setfont(“HelveticaNarrow-Bold”,36)
ps.text((3 * 72,4 * 72),標題)

ps.end_document()

更多關於閱讀圖像

如前所述,:py:mod:`~PIL.Image`模塊的:py:func:`~PIL.Image.open`函數 用於打開圖像文件。在大多數情況下,您只需將文件名作爲參數傳遞:

來自PIL導入圖片
im = Image.open(“hopper.ppm”)

如果一切順利,結果是:py:class:`PIL.Image.Image`對象。否則,引發:exc:`IOError`異常。

您可以使用類似文件的對象而不是文件名。該對象必須實現:py:meth:`~file.read`:py:meth:`~file.seek`和 :py:meth:`~file.tell`方法,並以二進制模式打開。

從打開的文件中讀取

來自PIL導入圖片
打開(“hopper.ppm”,“rb”)爲fp:
    im = Image.open(fp)

要從字符串數據中讀取圖像,請使用:py:class:`~StringIO.StringIO` 類:

從字符串中讀取

import StringIO

im = Image.open(StringIO.StringIO(buffer))

請注意,庫seek(0)在讀取圖像標題之前會對文件進行倒帶(使用)。此外,當讀取圖像數據時(通過加載方法)也將使用搜索。如果圖像文件嵌入在較大的文件中,例如tar文件,則可以使用:py:class:`~PIL.ContainerIO`或 :py:class:`~PIL.TarIO`模塊來訪問它。

從tar檔案中讀取

來自PIL import Image,TarIO

fp = TarIO.TarIO(“Tests / images / hopper.tar”,“hopper.jpg”)
im = Image.open(fp)

控制解碼器

某些解碼器允許您在從文件中讀取圖像時操作圖像。這通常可用於在創建縮略圖時(當速度通常比質量更重要時)加速解碼並打印到單色激光打印機(當只需要圖像的灰度版本時)。

:吡啶:甲基:`〜PIL.Image.Image.draft`方法操縱打開但還沒有加載的圖像,因此給定的模式和大小儘可能地匹配。這是通過重新配置圖像解碼器來完成的。

閱讀草稿模式

這僅適用於JPEG和MPO文件。

來自PIL導入圖片
來自__future__ import print_function
im = Image.open(文件)
print(“original =”,im.mode,im.size)

im.draft(“L”,(100,100))
print(“draft =”,im.mode,im.size)

這打印像:

原始= RGB(512,512)
吃水= L(128,128)

請注意,生成的圖像可能與請求的模式和大小不完全匹配。要確保圖像不大於給定大小,請改用縮略圖方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章