002.00 图片处理

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

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!