002.00 圖片處理

Jason990420發表於2019-08-11

002.00 圖片處理

  建檔日期: 2019/08/10

  更新日期: None

  語言: Python 3.7.4, PIL Pillow 6.1.0

  系統: Win10 Ver. 10.0.17763 繁體中文版(TW)

  主題: 002.00 圖片處理

1. 座標系統

  a. 左上角(x, y)為(0, 0), 事實上是(0.5, 0.5), 水平向右及垂直向下為正值.

  b. 引數的引用多為tuple, 單位為點(pixel)

  c. 點: (x, y) , 通常預設值為(0, 0)

  d. 尺寸: (寛度width, 高度height)

  e. 區域: (x1, y1, x2, y2), (x1, y1)為左上角, (x2, y2)為右下角,

   如果只有(x1, y1), 沒有給(x2, y2), 通常視為到圖片的最右下角; 預設視為整個區域.

2. 相關說明

  以下這些內容將提到PIL (Python Imaging Library)中Image模組使用上的大部份相關資訊,

  這些資訊很重要, 熟悉其內容, 才能更清楚的函式庫/方法庫的應用.

  a. fp圖檔的表示方式, 共分以下三種

    (1) 直接或相對路徑的檔名字串, 如: 'pic1.jpg', '.\pic1.jpg', 'd:\working.jpg'.

    (2) 具有read()/seek()/tell()三項方法, 且以二進位制檔案方式開啟的檔案物件 (略)

    (3) pathlib.Path物件 (略)

  b. format檔案型別: 圖檔因為儲存的方式或表示的方式不一樣, 有各種不同的型別,

   目前支援BMP, DIB, GIF, JPEG, PNG, PPM, TIFF, 不同的檔案型別或不同的圖片資料,

   都要不同的處理方法, 因此Pillow所是供的庫, 不可能作到都是一樣的處理方式, 因此會

   有很多所謂的特例, 在應用時, 一不小心就會出錯.

  c. extension檔案附屬檔名: 目前支援apng, bmp, dib, gif, jfif, jpe, jpeg, jpg, pbm, pgm, png,

   pnm, ppm, tif, tiff.

  d. 圖片, 基本上可分為以下各結構:

    (1) frame: 多幀的圖片.

    (2) Channel: 每個點的顏色組成一個圖層 (1 ~ 4個)

    (3) Alpha channel (mask): 每個點的透明度組成一個遮蔽

    (4) palette: 調色盤

  e. 絶大多數的圖片處理已經可以符合一般的需求, 特別的要求也可以自行設計處理.

  f. f_mode: 檔案開啟的讀寫模式, 如'r', 'w', 'b', 't', ....等, 通常只讀為'rb', 只寫為'wb'

  g. ImageObj: Class Image定義下的物件, 相關的引數, 函式及方法幾乎含蓋所有Pillow的內容.

  h. 函式或方法, 呼叫的物件可能會改變或不會改變, 而且不一定有返回值, 要注意使用. 如果呼

   叫的物件會被改動, 又需要保留, 必須預先複製一份, 再以複製的物件來呼叫. 另外, 沒有返回

   值的函式或方法, 被指定到新的變數, 其結果就是None, 因而常常出錯.

  i. 函式及方法常用引數

    (1) size: 2-tuple, 尺寸值 (寛度, 高度)

    (2) mode: string, 圖片模式代表圖片圖點的儲存方式. 不同模式的圖片有不同的函式, 方法,

      處理方式, 不是都可適用的. 使用上要先確認檔案型別或圖片模式, 圖片內容有多少圖層,

      有沒有遮蔽層, 調色盤, 還有多少幀. 下面列出常用的模式:

      (a) "1" - 二值影象1層(L), 1位元組/畫素, 只有黑白, 值0/1.

      (b) "L" - 灰度影象1層(L), 1位元組/畫素, 只有亮度, 值0~255.

      (c) "P" - 彩色影象1層(L) , 1位元組/畫素, 使用256色的調色盤

      (d) "RGB" - 彩色影象3層(L) , 3位元組/畫素, 真彩色

      (e) "RGBA" - 彩色影象4層(L) , 4位元組/畫素, 使用mask的真彩色

      (f) "CMYK" - 彩色影象4層(L) , 4位元組/畫素, 分色

      (g) "YCbCr" - 彩色影象3層(L) , 3位元組/畫素, 3x8點, 彩色視訊

      (h) "I" - 彩色影象1層(I), 32位有符號整數畫素

      (i) "F" - 彩色影象1層(F), 32位浮點畫素

      (j) "LA" - 彩色影象2層(L), L/alpha (略)

      (k) "RGBX" - 彩色影象4層(L), 帶填充的真彩色

      (l) "RGBa" - 彩色影象4層(L), 帶有預乘alpha的真彩色

      (m) "LAB" - 彩色影象3層(L), (略)

      (n) "HSV" - 彩色影象3層(L), Hue/Sat./Value or Brightness (略)

    (3) alpha: integer/float, 透明度是指一張圖片的透明度,影響其與另一張圖片(或背景)

      重迭的效果, 255為完全不透明, 0為完全透明, 其他的值按計算得出其結果; 也有用0

      到1的數值來表示.

    (4) mask: ImageObj單層的遮蔽, 其作用如alpha一樣, 不過要具有與圖片相同大小的內容,

      以利於分別處理每一個圖點的透明度, 所以模式只能是1, L或RBGA.

    (5) ImageObj_1, ImageObj_2 如果作對等處理時, 必須尺寸及模式要相同.

    (6) function: 函式作為引數時, 函式結果是預先計算的, 所以不可使用結果會變的函式, 如

      隨機數生成器. (系統預先計算函式的結果, 建立一個256或65536的表, 再按圖點值對

      應得到結果.)

    (7) box: 2-tuple或4-tuple; 方形區域.

    (8) xy: 2-tuple; 點座標值.

    (9) array: np.asarray(im)所產生的物件. (略)

    (10) data: 帶有未處理過的位元組串或緩衝區物件.

    (11) band: 層別數字(0~N), 或層名稱, 如"R", "G", "B", 預設或None, 指所有的圖層.

    (12) bands: tuple, 單圖層圖片的tuple.

    (13) filter: ImageFilter濾波器, 有線性, 非線性等, 計演算法式各有不同, 目前提供以下十種

      作法, 使用時要先from PIL import ImageFilter, 後面的那一串數字是濾波器計算時所

      用的取樣範本, 比重及偏移值.

      (a) ImageFilter.BLUR: 模糊化 (5,5),(1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,) ,16,0

      (b) ImageFilter.CONTOUR: 輪廓化 (3,3),(-1,-1,-1,-1,8,-1,-1,-1,-1,) ,1,255

      (c) ImageFilter.DETAIL: 細部化 (3,3),(0,-1,0,-1,10,-1,0,-1,0,) ,6,0

      (d) ImageFilter.EDGE_ENHANCE:邊緣化 (3,3),(-1,-1,-1,-1,10,-1,-1,-1,-1,) ,2,0

      (e) ImageFilter.EDGE_ENHANCE_MORE:更邊緣化 (3,3),(-1,-1,-1,-1,9,-1,-1,-1,-1,) ,1,0

      (f) ImageFilter.EMBOSS: 浮雕化 (3,3),(-1,0,0,0,1,0,0,0,0,) ,1,128

      (g) ImageFilter.FIND_EDGES: 輪廓化 (3,3),(-1,-1,-1,-1,8,-1,-1,-1,-1,) ,1,0

      (h) ImageFilter.SMOOTH: 平滑化 (3,3),(1,1,1,1,5,1,1,1,1,) ,13,0

      (i) ImageFilter.SMOOTH_MORE: 更平滑化(5,5), (1,1,1,1,1,1,5,5,5,1,1,5,44,5,1,1,

       5,5,5,1,1,1,1,1,1,) ,100,0

      (j) ImageFilter.SHARPEN: 銳化 (3,3),(-2,-2,-2,-2,32,-2,-2,-2,-2,) ,16,0

      (k) 以上各項濾波器可以自定義引數, 作不同的處理

        。 引數ImageFilter.Kernel((n,n),(nxn個比重引數),scale, offset)

        。 n=只能是3或5; scale算完要再除的比重, offset是要再加的偏移量

        。 一般scale為比重引數的總和, 如果是0, 就改為1

        。 比如EMBOSS就等同Kernel((3,3),(-1,0,0,0,1,0,0,0,0),1,128)

    (14) palette: 調色盤; 在mode 'P'下, 每一點真正的色彩是用調色盤來表示;

      (a) Image.WEB調色盤只有00, 33, 66, 99, CC, FF這6種RGB色值,

        所以總共有6**3=216種顏色. (內定值)

      (b) Image.ADAPTIVE是從所有顏色中提取的系列色彩, 是被使用得最多的調色盤,

        可以使用最少的顏色實現較好的效果。

    (15) rawmode: 調色盤的模式, 有L, LA, RGB和RGBA四種. (To be confirmed)

    (16) color: 單圖層使用int或float來表示顏色, 多圖層則使用tuple, 每一層一個顏色, 也可

      以如以下方式來表示:

      (a) RGB: "#RRGGBB", "rgb(R, G, B)", "rgb(R%, G%, B%)"

      (b) HSL: 色調(0~360, 0紅, 120綠, 240藍)/飽和度(0%~100%, 0%灰, 100%全綵)/

        亮度(0%~100%, 0%黑, 50%一般, 100%白), "hsl(h%,s%,l%)"

      (c) HTML: 有140種顏色名, 大小寫相同, 如Red, White, Cyan, Silver, Blue, Gray,

        Grey, DarkBlue, Black, LightBlue, Orange, Purple, Brown, Yellow ,Maroon,

        Lime, Green, Magenta, .... , etc.

    (17) resample重新取樣濾波器的方法, 當影象的二維關係改變時, 沒有新位置的圖點值,

      必須採取某些方式來取得新值.

      (a) 0 - Image.NEAREST: 按最近的點來當新值, 速度最快, 但放大縮小最差.

      (b) 1 - Image.LANCZOS或Image.ANTIALIAS : 使用截斷sinc函式, 以及可能有助於

        新點值的所有的點, 來計算新點值. 速度最慢, 放大最好, 縮小最好. (只能用在

        resize及thumbnail方法中)

      (c) 2 - Image.BILINEAR或LINEAR: 使用上下左右四點(2x2), 以線性計算新點值,

        速度快, 放大較差, 縮小較差.

      (d) 3 - Image.BICUBIC或CUBIC: 使用上下左右十六點(4x4), 以三次方計算新點值.

        速度慢, 放大好, 縮小好.

      (e) 4 - Image.BOX: 速度較快, 放大不行, 縮小較差.

      (f) 5 - Image.HAMMING: 速度快, 放大不行, 縮小尚可.

      (g) 其中ANTIALIAS較適用於大圖變小圖, BILINEAR/BICUBIC較適用於尺寸不變

        或小圖變大圖.

    (18) transpose轉置方法: 映象及旋轉, 這裡的旋轉引數不能用在rotate(), 因為它們不是角度值.

      (a) 0 - Image.FLIP_LEFT_RIGHT: 左右相反

      (b) 1 - Image.FLIP_TOP_BOTTOM: 上下顛倒

      (c) 2 - Image.ROTATE_90: 逆時針轉90度

      (d) 3 - Image.ROTATE_180: 逆時針轉180度

      (e) 4 - Image.ROTATE_270: 逆時針轉270度

      (f) 5 - Image.TRANSPOSE: ROTATE_90 + FLIP_TOP_BOTTOM

      (g) 6 - Image.TRANSVERSE: FLIP_TOP_BOTTOM+ ROTATE_90

    (19) transforms轉換方法:

      (a) 0 - Image.AFFINE: 仿射轉換, data: (a, b, c, d, e, f), 新點值為(ax+by+c, dx+ey+f)

      (b) 1 - Image.EXTENT: 切一塊區域, data: (x0, y0, z1, y1) 對應到 (0, 0, size_x, size_y)

      (c) 2 - Image.PERSPECTIVE: 透視轉換data為(a, b, c, d, e, f, g, h),

        新點值為(ax+by+c)/(gx+hy+1), (dx+ey+f)/(gx+hy+1)

      (d) 3 - Image.QUAD: 四邊形對映到矩形data:(x0,y0,x1,y1,x2,y2,x3,y3)

        (左上角, 左下角, 右下角, 右上角)

      (e) 4 - Image.MESH: 在一次操作中對映多個源四邊形

    (20) quantize量化方法: 當某些顏色值要分類, 以縮減顏色數時, 如何分群以達到影象的接近度.

      (a) 0 - Median Cut中值切割演算法, 按所有顏色值最大範圍的中間值來切割成兩群,

        重複動作直到所需的顏色(群)數.

      (b) 1 - Maximum Coverage (略)

      (c) 2 - Fast Octree快速八叉樹顏色量化 (略)

      (d) 3 - LibImageQuant (略)

    (21) dither 遞色方法

      (a) 0 - Image.NEAREST或NONE

      (b) 1 - Image.ORDERED = 1 (還沒有建立該功能)

      (c) 2 - Image.RASTERIZE = 2 (還沒有建立該功能)

      (d) 3 - Image.FLOYDSTEINBERG (預設)(略)

    (22) categories: (略)

    (23) decoder譯碼器, 只對圖片點資料有效, 如果是完整的圖片在string中, 就必須使用

      BytesIO來處理, 再用Image.open()開啟, 常用的為'raw', 用來處理那些沒有壓縮的

      檔案格式; 新的格式可能要自建decoder.

    (24) im指已啟或建立的ImageObj物件

    (25) alpha透明度的計算, 基本上為以下三種方式

      (a) 方法1 (alpha-1), 用在兩圖片各有各的遮蔽

        。 假設圖1點(r1, g1, b1, a1), 圖2點(r2, g2, b2, a2), 新圖點(r3, b3, g3, a3)

        。 factor_pixel = a2/(a2 + a1 * (1.0 - a2/255))

        。 r3 = r2 factor_pixel + r1 (1 - factor_pixel)

        。 factor_alpha = 1.0 - a2/255

        。 a3 = a2 + a1 * factor_alpha

        。 g3和b3的計算方法同r3

      (b) 方法2 (alpha-2), 用在不管圖1圖2有沒有遮蔽, 另外給單一的alpha值來作處理.

        。 假設: 圖1點r1, 圖2點r2, 新圖點pixel, alpha = 0 ~ 1

        。 r3 = r1 (1.0 - alpha) + r2 alpha

        。 g3和b3的計算方法同r3

      (c) 方法3 (alpha-3)

        。 假設: 圖1點r1, 圖2點r2, 另外有遮蔽的alpha, 新圖點pixel

        。 r3 = r1 (255- alpha) + r2 alpha

        。 g3和b3的計算方法同r3

    (26) ImageFilter濾波器 (略)

      (a) Kernel(size, kernel, scale=None, offset=0): size (3,3)或(5,5); kernel一串9或25個

        數值; scale除值(內定為kernel總和); offset加值.

      (b) RankFilter(size, rank): 在(size, size)周圍取點排序, 取第rank個值為新值.

      (c) MinFilter(size=3): 在(size, size)周圍取點, 值最小的為新值.

      (d) MedianFilter(size=3): 在(size, size)周圍取點, 中間值的為新值.

      (e) MaxFilter(size=3): 在(size, size)周圍取點, 值最大的為新值.

      (f) ModeFilter(size=3): (size, size)周圍取點, 值最常用的為新值, 沒有就使用原值.

3. 常用引數

  a. Image.info: dictionary; 非圖片的一些相關資料, 非標準化, 所以沒什麼用.

  b. Image.format: string; 為檔案格式名, 如"BMP", 非來自檔案則為None.

  c. Image.mode: string; 圖片格式名, 如"RGB", 字串為灰階圖片(L), 真彩色圖片(RGB),

   印前圖片(CMYK).

  d. Image.palette: class ImagePalette; 'P'模式的顏色調色盤表格, 不是'P'模式則為None.

  e. Image.size: 2-tuple; 圖片寛度及高度 tuple.

  f. Image.width: int; 圖片寛度.

  g. Image.height: int; 圖片高度.

4. 圖片處理

  a. 檔案相關

    (1) 檔案開啟Image.open(filename[, f_mode='r'])

      (a) Return: ImageObj;

      (b) file_mode: "r" (事實上就是"rb", 二進位制檔案只讀模式)

    (2) 檔案關閉im.close()

      (a) Return: None / Exception / ValueError, 呼叫物件: 被改變, 將不存在.

    (3) 檔案存檔im.save(fp, format=None, **params)

      (a) Return: None / IOError

      (b) **params: 額外引數供圖檔寫入.參考

        https://pillow.readthedocs.io/en/5.1.x/han...

  b. 直接產生新圖

    (1) 建立新圖Image.new(mode, size[, color=0])

      (a) Return: ImageObj / IOError.

      (b) color: 預設為0(黑色), None則不動作.

    (2) 複製圖片im.copy()

      (a) Return: ImageOBJ

    (3) 曼德布洛特圖Image.effect_mandelbrot(size, extent, quality)

      (a) Return: ImageObj; 一張曼德布洛特-加龍省圖的圖片

      (b) extent: 4-tuple, 指c值的範圍 (待確認), 參考值(-2, -2, 1, 1)

      (c) quality: 質量指數, 越大越細, 當然這和圖的大小也有關.

      (d) 曼德布洛特-加龍省複數集合 [z, f(z), f(f(z)), f(f(f(z))), .....], 集合中元素不會延伸

        到無窮大, 會在有限半徑的盤內, 不會變成無窮大的點, 其中f(z)=z**2+c.

    (4) 高斯噪聲圖Image.effect_noise(size, sigma)

      (a) Return: ImageObj;

      (b) sigma: 整數或浮點數, 為高斯噪聲的標準偏差, 值越大, 當然圖片就越花.

    (5) 線性黑白漸層圖Image.linear_gradient(mode)

      (a) Return: ImageObj;

      (b) 256x256大小, 由上而下, 由黑而白, 漸層的圖片

      (c) mode只能為"L"或"P".

      (d) 圓形黑白漸層圖Image.radial_gradient(mode)

      (e) Return: ImageObj;

      (f) 256x256大小, 由內黑而外白, 漸層的圖片

      (g) mode只能為"L"或"P".

    (6) 矩陣轉圖片Image.fromarray(array, mode=None)

      (a) Return: ImageObj;

      (b) 如果mode是None, 則由array type決定.

      (c) 借用frombuffer

    (7) 緩衝轉圖片Image.frombuffer(mode, size, data[, decoder_name='raw', *args])

      (a) Return: ImageObj;

      (b) mode為L/RGBX/RGBA/CMYK, 圖片會和buffer共享記憶體, 其他的不會共享.

      (c) 引數群只供decoder使用 ,如果decoder為"raw", 必須提供完整的引數群, 否則

        可能會出錯; 最好是frombuffer(mode, size, data, "raw", mode, 0, 1).

      (d) 借用Image.frombytes

    (8) 位元組轉圖片Image.frombytes(mode, size, data, decoder_name="raw", *args)

      (a) Return: ImageObj;

      (b) 最好只用前三項引數: mode, size, data, 其他省略.

    (9) 取單一的圖層im.getchannel(channel)

      (a) Return: ImageOBJ 模式為L的圖片

      (b) channel: integer或string, 如RGBA, R層為0, 或alpha層'A'

    (10) 取所有的圖層im.split()

      (a) Return: tuple 圖片各圖層

    (11) 多圖層轉圖片Image.merge(mode, bands)

      (a) Return: ImageObj;

      (b) 該mode的圖片層數必須等於bands數

    (12) 截圖crop([box=None])

      (a) Return: ImageOBJ

      (b) box:省略則如copy()一樣.

  c. 圖片重迭

    (1) 圖迭圖Image.alpha_composite(ImageObj_1, ImageObj_2)

      (a) Return: ImageObj; 使用mask/alpha計演算法, 圖2迭加到圖1

      (b) ImageObj_1, ImageObj_2: 必須是RGBA, 模式不同, 可以直接使用putalpha()改變

        alpha值, 也會改成RGBA, 再來作alpha_composite().

      (c) 使用mask/alpha計演算法.

    (2) 單值alpha圖迭圖Image.blend(ImageObj_1, ImageObj_2, alpha)

      (a) Return: ImageObj; 使用定值alpha-2計演算法.

      (b) alpha: 0到1的整數或浮點數, 0為ImageObj_1, 1為ImageObj_2.

    (3) 遮蔽圖迭圖Image.composite(ImageObj _1, ImageObj _2, mask)

      (a) Return: ImageObj; 圖1迭加到圖2

      (b) 借用方法paste(image1, None, mask), 使用alpha-3計演算法.

      (c) 這個函式演算法及對像圖片和alpha_composite()是不一樣的

    (4) 分割槽圖迭圖im.alpha_composite(ImageObj, dest, source)

      (a) Return: None; 呼叫物件為被貼圖, 內容會被改變.

      (b) dest: 2-tuple, 呼叫物件的位置座標值可以是負的, 指圖被貼的位置.

      (c) source: 2-tuple, ImageObj的截圖位置, 或是4-tuple截圖區域

      (d) 迭加方法: alpha-1計演算法

      (e) 被貼圖也可以是含有圖片素值的integer或tuple; 如果被貼圖的模式不同於原圖

        模式, 系統會自行轉換; 除了圖片被整合外, alpha層也會被整合在原圖上.

    (5) 貼圖im.paste(ImageObj | color, box=None, mask=None)

      (a) Return: None. 呼叫物件: Changed. 貼圖於原圖上

      (b) 除了圖片被整合外, alpha層也會被整合在原圖上.

      (c) 迭加方法: 使用alpha-3計演算法.

  d. 圖片處理

    (1) 函式圖點全處理Image.eval(ImageObj, function)

      (a) Return: ImageObj;

      (b) 借用point()

    (2) 圖片轉模式Image.convert(mode=None, matrix=None, dither=None, palette=0,

      colors=256)

      (a) Return: ImageObj;

      (b) mode: 目標模式. ImageObj為非P模式時, 如果省略mode, 則直接複製不作轉換;

        否則轉為RGB.

      (c) matrix: 4/12 float tuple, 可省略. 只供L及RGB模式使用.

      (d) dither: RGB to P, RGB to 1, RGB to L所使用的Dither方法(NONE或內定的

        FLOYDSTEINBERG. 如果有matrix, 將不用此方法; 如果dither是None,

        轉黑白的方法是255 if pixel > 128 else 0.

      (e) colors: ADAPTIVE調色盤所使用的顏色數目.

      (f) 彩色轉灰階: L = R 299/1000 + G 587/1000 + B * 114/1000

      (g) 彩色/灰階轉黑白: 使用Floyd-Steinberg dither轉換成"1".

      (h) 如果dither為NONE, >0的值都會變為255, 不同的臨界值請使用point(). dither

        只用在RGB>P, RGB>1, L>1.

      (i) 如果沒有調色盤, 轉為P模式時, alpha都設為255 (不透明)

      (j) RGB轉為CMYK, (c, m, y) = 255 - (r, g, b), k=0 顏色會有點失真.

      (k) RGB轉為YCbCr, (Y, Cb, Cr) = (0.257R+0.504G+0.098B+16,

        -0.148
R-0.291G+0.439B+128, 0.439R-0.368G-0.071*B+128)

    (3) 濾波器圖片處理im.filter(filter)

      (a) Return: ImageOBJ

    (4) 表格圖點全處理im.point(lut | function, mode=None)

      (a) Return: ImageObj

      (b) lut: Loopup Table, 表格. 一個圖層一個256或65536(I或L模式下)大小的表格.

      (c) mode: 輸出圖的模式, 僅適用於L>1, P>1或I>L模式轉換.

    (5) alpha層增加或修改im.putalpha(alpha | mask)

      (a) Return: None, 如果沒有alpha層, 模式會轉換成LA或RGBA

      (b) 僅適用RBGA模式

    (6) 圖片單點修改im.putpixel(xy, value)

      (a) Return: None

      (b) value: integer (單圖層) / tuple (多圖層) / RGB或RGA tuples (P模式)

      (c) 一點一點的處理, 速度會變的很慢.

    (7) 量化成P圖片im.quantize(colors=256, method=None, kmeans=0, palette=None, dither=1)

      (a) Return: ImageObj

      (b) colors: tutple, 需求的顏色數, 必須小於等256.

      (c) method: Integer, 預設下, 如果RGBA模式為2, 否則為0. RBGA必須使用2或3

      (d) kmeans: Integer, K方法採用多少顏色來代表圖片, 不用給顏色. (按距離自動分群)

      (e) palette: ImageObj, 要量化成的調色盤, 盤色盤的mode只能是P; 圖片的模式必須

        是RGB或L, 有調色盤就呼叫convert("P", dither, palette), 沒有則參考colors,

        method及kmeans作量化.

      (f) dither: Integer, NONE 或 FLOYDSTEINBERG (default), 僅用於RGB > P, RGB > 1

        或 L > 1的轉換.

    (8) 圖片尺寸變更im.resize(size, resample=NEAREST, box=None)

      (a) Return: ImageObj, 不同尺寸的圖片

      (b) resample: 6種方法都可以用, 如果原圖模式為1或P, 則會被設為NEAREST

    (9) 逆時針旋轉圖片im.rotate(angle, resample=NEAREST, expand=0, center=None,

      translate=None, fillcolor=None)

      (a) Return: Imageobj

      (b) angle: 逆時針旋轉角度以度為單位. 0度copy(); 類似ROTATE_90這引數不能用,

        因為它僅代表2 !

      (c) resample: resampling Filter (LANCZOS 1, BOX 4, HAMMING 5不可用)

      (d) expand: False/True, False圖片尺寸不變, 旋轉後有部份的內容會被截掉; True

        圖片會變大, 包容新的圖片. 預設為False.

      (e) center: 2-tuple, 旋轉中心點, 預設為圖片中心點.

      (f) translate: 2-tuple, 旋轉後位移, 預設為(0, 0)

      (g) fillcolor: 整數(單層圖片)或tuple(多層圖片)的顏色值, 預設為0(黑色), 指圖片外

        多出來部份填入的顏色.

    (10) 變為縮圖im.thumbnail(size, resample=BICUBIC)

      (a) Return: None. 原圖片會被修改成縮圖, 要保留原圖請複製一份再處理.

      (b) size: 2-tuple, 縮圖尺寸. 為了保持原比例, 結果可能比要求的縮圖尺寸更小一點.

      (c) 呼叫Image.draft來完成工作.

    (11) "1"圖轉"X11點陣圖" im.tobitmap(name="image")

      (a) Return: string, X11 bitmap的字串

      (b) name: bitmap變數前置字串, 預設為image

    (12) 鏡射圖片im.transform(size, method, data=None, resample=NEAREST, fill=1,

      fillcolor=None)

      (a) Return: ImageObj.

      (b) data: 供method使用的資料

      (c) resample: NEAREST/BILINEAR/BICUBIC, 預設或模式1或P, 則為NEAREST

      (d) fill: 供ImageTransformHandler使用的資料

      (e) fillcolor: 超出部份填色

    (13) 旋轉或映像圖片im.transpose(method)

      (a) Return: ImagIbj

    (14) 去黑框im.getbbox()

      (a) Return: box, 如果全是黑的, 返回值為None.

      (b) 要取得圖片, 可以用crop().

    (15) 轉圖im.draft(mode, size)

      (a) Return: None, 原圖被修改, 尺寸會略有不同

      (b) 只有JPEG和PCD能用, 而且已載入就沒用了.

  e. 讀取資料或資訊

    (1) 讀取各圖層名稱Image.getmodebandnames(mode)

      (a) Return: Tuple, 各圖層的名稱.

    (2) 讀取圖片基本模式Image.getmodebase(mode)

      (a) Return: "L" (灰階圖片) 或 "RGB" (彩色圖片)

    (3) 讀取圖層數Image.getmodebands(mode)

      (a) Return: 該模式下, 圖片的圖層數

    (4) 讀取單層的模式Image.getmodetype(mode)

      (a) Return: "L", "I" 或 "F"

    (5) 讀取合法的附屬檔名Image.registered_extensions()

      (a) Return: Dictionary, 如{'.bmp': 'BMP', '.dib': 'DIB', ... , '.apng': 'PNG'}

    (6) 讀取各圖層名稱im.getbands()

      (a) Return: Tuple, 如RGB的("R", "G", "B")

    (7) 統計圖片各顏色用量im.getcolors(maxcolors=256)

      (a) Return: list. Q該顏色數量, m圖層數, n各圖層顏色組合總數, 不一定按順序排列.

      (b) 單圖層 [[Q1, C1], [Q2, C2], ...,[Qn, Cm]]

      (c) 多圖層 [[Q1, (c11,c12,..c1m)], [Q1, (c21,c22,..c2m)], ..., [Q1, (cm1,cm2,..cnm)]]

      (d) maxcolors: 如果有顏色超過, 返回None. 多層顏色很有可能會超過256. 比如

        RGB就可能有256x256x256種顏色.

    (8) 圖片轉資料im.getdata(band=None)

      (a) Return: dataObj, 必須特殊操作才能直接使用, 不可作為ImageObj使用.

      (b) 可用list()轉為list使用.

    (9) 圖片顏色取極值im.getextrema()

      (a) Return: 2-tuple 或 N-(2-tuple), 前為最小值, 後為最大值

    (10) 取出調色盤im.getpalette()

      (a) Return: list, 無調色盤則為None.

    (11) 取圖點值im.getpixel(xy)

      (a) Return: interger (單圖層) 或 tuple (多圖層)

    (12) 圖片顏色統計im.histogram(mask=None, extrema=None)

      (a) Return: tuple (各層顏色值統計表, 顏色值從0開始統計, 各層分開在接在後面.

      (b) mask:maskObj, 只有非零的才統計, 省略則不用. 只能有1和L模式的.

      (c) extrema: 2-tuple, 顏色的最小值和最大值, 在兩者之間的顏色值將被分為256個區域,

        僅I和F模式可用.

    (13) 載入圖片im.load()

      (a) Return: PyAccessObj, 通常不用. (略)

      (b) 通常不需要作這個動作, 因為系統會在開啟時先載入, 除非是多幀圖片.

  f. 寫入資料

    (1) 圖片轉資料im.putdata(data, scale=1.0, offset=0.0)

      (a) Return: None, 原圖被修改

      (b) data: SequenceObj, 序列物件存有圖片資料

      (c) data = data * scale + offset

    (2) 加入調色盤im.putpalette(data, rawmode="RGB")

      (a) Return: None, 原圖調色盤被修改

      (b) data: SequenceObj, 序列物件存有調色盤資料, 可以是string或list, 必須要有

        768的值, 每三個值對應到R,G,B的顏色值, 也可以8位的字串.

      (c) rawmode: 調色盤的模式, 必須是

      (d) 圖片必須是P, PA, L或LA模式

  g. 其他圖片相關

    (1) 找到第幾幀圖片im.seek(frame)

      (a) Return: None | EOFError

      (b) frame: integer, 第幾幀

    (2) 目前位置在幾幀im.tell()

      (a) Return: Integer, 第幾幀

    (3) 顯示圖片im.show(title=None, command=None)

      (a) Return: None, 暫存檔為PPM檔(Unix), PNG檔(macOS), BMP檔(WIN).

      (b) title: string, 視窗標題

      (c) command: 顯示圖片的命令, 借用外部軟體, 因為主要是用來除錯的.

<<< The End >>>

Jason Yang

相關文章