AD

Python_PIL_Image模块全解

0x01 Python--Image 模块概述


Image 模块提供了同名的类用来表示PIL的图像。Image模块还提供了许多工厂(factory)函数,包块从文件加载图像的函数,以及创建新图像的函数。

0x02代码实例

初始化图片操作

所有的图片操作必须有一个操作对象,Pil提供open(filename)进行这个过程
下面的丫头脚本加载了一个图像,并把它旋转了45度,然后调用外部的查看器(通常在U丫头nix下是xvWindows下是paint)。
打开,旋转,和显示图像(使用默认的查看器)
from PIL import Image
im = Image.open("bride.jpg")
im.rotate(45).show()
调用im.show()会在图片查看工具中显示当前操作的image对象,这个跟个人的系统有关系,我系统中默认是用Windows Picture and Fax Viewer打开的。这个方法用来查看临时的图片效果。

读写图片

pil中转换图片格式非常简单(转换图片模式是另一个概念,不要混淆),只需要调用img.save(filename)即可比如有一个bmp(位图)图片,使用img = Image.open('file.bmp')打开后,只需要img.save('file.jpg')即可转换。不过一般情况下,save(filename)是不用做这个用途的,通常,save用以保存一个临时的image对象到硬盘。而转换工作由一个功能更为强大的convert()方法来完成。

拷贝,粘贴,合并

1.  box = (100,100,500,500)#设置要拷贝的区域  
2.    
3.  #im表示的图片对象拷贝到region中,大小为(400*400)像素。这个region可以用来后续的操作(region其实就是一个Image对象)box变量是一个四元组(左,上,右,下)  
4.  region = im.crop(box)  
5.    
6.  region = region.transpose(Image.ROTATE_180)#从字面上就可以看出,先把region中的Image反转180度,然后再放回到region中。  
7.  im.paste(region, box)#粘贴box大小的region到原先的图片对象中。  
前面说过,每一个RGB都是由三个通道的灰度图叠加的,所以pil提供了将这三个通道分离的方法
1.  r,g,b = im.split()#分割成三个通道  
2.  r.show()  
3.  g.show()  
4.  b.show()  
5.  im = Image.merge("RGB", (b, g, r))#b,r两个通道进行翻转。  

几何转变

几何转变提供resize,rotate等方法,用以重定义图片大小,对图片进行旋转等操作,在实际应用中比较广泛。
1.  out = img.resize((128, 128))#resize128*128像素大小。  
2.  out = img.rotate(45)#逆时针旋转45  
逆时针45
镜面效果,左右翻转
transpose()方法预定义了一些旋转方式,如左右反转,上下翻转,逆时针旋转(90,180,270)度等,非常方便,rotate()transpose()方法在表现上没有任何不同。

图片加强

滤镜

ImageFilter模块提供了很多预定义的图片加强滤镜。比如一个常用的滤镜,细节(detail滤镜)
1.  import ImageFilter  
2.  out = im.filter(ImageFilter.DETAIL)  

直接操作像素点

不但可以对每个像素点进行操作,而且,每一个通道都可以独立的进行操作。比如,将每个像素点的亮度(不知道有没有更专业的词)增大20
1.  out = img.point(lambda i : i * 1.2)#注意这里用到一个匿名函数(那个可以把i1.2倍返回的函数)  
对每个点都做20%的增强
       如上边的那个例子,我们可以将一个RGB模式的图分离成三个通道的层
1.  r,g,b = img.split()#神奇而又强大的python语法  
然后对一个通道进行加强或减弱操作,完成后我们又可以使用Merge将通道合并,从而改变图片的色调(冷暖色调的互换)等。
更高级的图片加强,可以使用ImageEnhance模块,其中包含了大量的预定义的图片加强方式
1.  import ImageEnhance  
2.  enh = ImageEnhance.Contrast(im)  
3.  enh.ehhance(1.5).show("50% more contrast")  

读写图片的更多方式

通常,我们使用open方法进行图片的打开操作。但是这不是唯一的方式。完全可以跟pythonIO整合起来。如
1.  fp = open("file.jpg""rb")  
2.  im = Image.open(fp)  
甚至,你可以从一个字符串中读出图片数据来(python真是神奇啊)
1.  import StringIO  
2.  img = Image.open(StringIO.StringIO(buffer))  

创建缩略图

下面的脚本为当前目录下所以的JPEG图像创建128x128的缩略图。
from PIL import Image
import glob, os

size = 128, 128

for infile in glob.glob("*.jpg"):
    file, ext = os.path.splitext(infile)
    im = Image.open(infile)
    im.thumbnail(size, Image.ANTIALIAS)
    im.save(file + ".thumbnail", "JPEG")
函数new
Image.new(mode, size) => image

Image.new(mode, size, color) => image

以指定的模式和大小创建一个新图像。大小以2元元组的形式给出。给colour赋单个值,表示要创建单波段图像,元组表示创建多波段图像(每个波段一个值)。如果忽略colour参数,图像将以黑色填充。如果colour设为None,图像不会被初始化。
open
Image.open(infile) => image
Image.open(infile, mode) => image
打开并识别给定图像文件。这是一个偷懒的操作;真正的图像数据只有到处理的时候才会被读入(调用load函数强制加载)。如果给出了模式(mode)参数,它必须设为“r”。
要打开图像,即可以使用字符串(表示文件名)也可以使用文件对象。对后一种情况,文件对象必须实现了readseek,和 tell 方法,并以二进制模式打开。

blend(层叠图片)

Image.blend(image1, image2, alpha) => image
通过使用alpha常量,在图像进行差值操作,创建新图像。两个图像必须具有相同的大小和模式。
out = image1 * (1.0 - alpha) + image2 * alpha (注:没有成功)
如果设置alpha0.1,将返回第一个图像的拷贝。如果设置alpha1.0,将返回第二个图像的拷贝。对alpha的值没有限制。必要的话,结果会被剪裁,以适合允许的输出范围。
层叠两个图片,img2img2,alpha是一个介于[0,1]的浮点数,如果为0,效果为img1,如果为1.0,效果为img2。当然img1img2的尺寸和模式必须相同。

composite (遮罩层)

Image.composite(image1, image2, mask) => image
使用蒙板/遮罩层(mask)作为alpha,通过在两个图像之间进行插值来创建一个新图像。遮罩图像的模式可以是“1”,“L”,或者“RGBA”。所有的图像的大小必须有相同。
       可以使用另外一个图片作为蒙板(mask),所有的这三张图片必须具备相同的尺寸,mask图片的模式可以为“1”,“L”,“RGBA

eval(像素函数)

Image.eval_r(image, function) => image
把函数(function)(应该接收一个参数)应用到所给图像的每一个像素。如果图像有多个波段,相同的函数会应用到每一个波段。注意,该函数对每一个可能的像素值只计算一次,所有不能使用随机组件(components)或者其它发生器(generators)。

frombuffer(图像内存)

Image.frombuffer(mode, size, data) => image
       (PIL1.1.4添加)。使用标准的“raw”解码器,把来自字符串或者缓冲区(buffer)对象的图像数据创建为一个图像内存(image memory)。对于某些模式,图像内存会和原来的缓冲区共享内存(这意味着对原始缓冲区对象的修改会影响图像)。不是所有的模式都能共享内存;支持共享内存的模式包括:“L”,“RGBX”,“RGBA”和“CMYK”。对其其它模式,这个函数的作用与fromstring函数类似。
注意:1.1.6版中,默认的方向与fromstring的不同。这些可能会在未来的版本中发生变化,所以为了最大的兼容性,建议在使用“raw”解码器的时候给出所有的参数。
im = Image.frombuffer(mode, size, data, "raw", mode, 0, 1)Image.frombuffer(mode, size, data, decoder, parameters) => image 与调用fromstring 相同。

fromstring(解码器)

Image.fromstring(mode, size, data) => image
使用标准的“raw”解码器从来自字符串的像素数据创建一个图像内存。
Image.fromstring(mode, size, data, decoder, parameters) => image
也一样,但是允许你使用PIL支持的任何像素解码器。关于可用解码器的更多信息,参见Writing Your Own File Decoder
注意,这个函数只对像素数据解码,而不是整个图像。如果字符串中包含了一个完整的图像文件,可以使用StringIO对象对它进行处理,并使用open函数加载图像。

merge (通道/波段)

Image.merge(mode, bands) => image
从几个单波段图像创建一个新图像。bands参数是包含图像的元组或列表,一个图像对应模式中描述的一个波段。所有波段的图像必须有相同的大小。
       方法:一个Image类的实例具有下列方法。除非另外指出,所有的方法都返回一个新的Image类的实例,包含处理过的图像数据。

convert(转换)

im.convert(mode) => image 返回图像转换后的副本,该函数可以用来将图像转换为不同色彩模式。
这个方法可以将图片在不同的模式间进行转换,在将灰度图转换成二值图时,所有的非零值被设置为255(白色)
如果原始图像是调色板图像,这个函数通过调色板转换像素。忽略mode参数,会自动选择一个模式,以保证所有的图像信息和调色板信息在没有调色板的时候也能表示出来。
从彩色图像转换到黑白图像时,图像库使用ITU-R 601-2 luma转换:
    L = R * 299/1000 + G * 587/1000 + B * 114/1000在把图像转换为二值图(bilevel image)(模式“1”)时,源图像首先被转换为黑白图。然后在结果中,值大于127的像素点被设置为白色,图像抖动(and the image is dithered)。使用point方法可以改变阈值。
im.convert(mode, matrix) => image
使用转换矩阵,把一个 "RGB" 图像转换为 "L" 或者 "RGB" 图像。其中矩阵是一个4元或16元元组。
下面的例子把一个RGB图像转换(根据ITU-R 709进行线性校正,using the D65 luminant)CIE XYZ颜色空间:
Convert RGB to XYZ

    rgb2xyz = (
        0.412453, 0.357580, 0.180423, 0,
        0.212671, 0.715160, 0.072169, 0,
        0.019334, 0.119193, 0.950227, 0 )
    out = im.convert("RGB", rgb2xyz)

copy
im.copy() => image

crop(截取/切割图片)

im.crop(box) => image
返回当前图像的一个矩形区域。box参数是一个定义了左,上,右,下像素坐标的4元元组。 起始点的横坐标,起始点的纵坐标,宽度,高度。
这是一个投篮操作。改变源图像可能会也可能不会影响剪裁的图像。要得到一个单独的拷贝,可以在剪裁的副本上应用load函数。

draft(图像加载器)

im.draft(mode, size)
配置图像文件加载器,使它返回一个与给定模式和大小尽可能匹配的图像。比如,你可以在加载的时候,把一个彩色的JPEG图像转换为一个灰度图,或者从一个PCD文件中提取出一个128x192的版本。
注意这个方法在适当的时候修改图像对象。如果图像已经加载了,这个方法可能无效。

filter(过滤器)

im.filter(filter) => image

       返回一个使用指定过滤器进行过滤后的图片,过滤器列表请查看ImageFilter模块。

fromstring(过滤器)

im.fromstring(data)

im.fromstring(data, decoder, parameters) fromstring 方法一样,但是可以将数据加载到当前运行的图。

getbands(获取通道名称)

im.getbands() => tuple of strings

       返回一个元组,包含每一个通道的名称。例如对一个RGB模式的图片执行getbands(),会返回("R", "G", "B")

getbbox(非零区域边界划分)

im.getbbox() => 4-tuple or None

       计算图像中非零区域的边界框。边界框是一个包含4个元素的元组,定义了左、上、右、下四个坐标。如果这个图片是空白的,则返回None
Calculates the bounding box of the non-zero regions in the image. The bounding box is returned as a 4-tuple defining the left, upper, right, and lower pixel coordinate. If the image is completely empty, this method returns None.

getcolors(颜色信息及数量)

im.getcolors() => a list of (count, color) tuples or None
返回结果是一个元祖,每个元素的格式如下: (44, (72, 64, 55, 255)),其中(72,64,55,255)表示RGBA颜色,A就是透明度,44表示这张图片中包含了44个这种颜色。
im.getcolors(maxcolors) => a list of (count, color) tuples or None

getdata(图片内容序列)

im.getdata() => sequence 返回一个序列
返回一个序列,该序列为图像的内容的序列值。下一行的值跟在上一行后面。

getextrema(最大最小值)

im.getextrema() => 2-tuple

返回一个包括图片最大值和最小值2个元素的元组,当前只支持一个通道的图片。

getpixel(像素点)

im.getpixel(xy) => value or tuple
img.getpixel((4,4)) getpixel得到图片img的坐标为(4,4)的像素点。必须两个括号
       返回指定位置的像素值,如果是一个多通道的图片,会返回一个元组。
       注意,这个方法执行很缓慢,如果要处理较大的图片,最好使用load()或者getdata()方法。

histogram(直方图)

im.histogram() => list
       返回一个图片的直方图,直方图返回一个像素数,图片中每一个像素的值。如果图片是多通道的,则会包含所有的通道。例如,要给RGB模式的图片,直方图包含有768个值。
       在这个方法中,将"1"模式的图片当作"L"模式的图片处理。

im.histogram(mask) => list
       返回一个遮罩图层为非零部分图像的直方图。这个遮罩层必须和原图片大小相同,不论是“1“模式,还是”L”模式。

load(强制载入)

im.load()
       从文件中载入图片,并为图片分配存储空间。正常情况下,不需要使用该方法,因为第一次访问一个图片是,image类有自动加载器。
       1.1.6中,该方法可以返回一个可以读取/修改像素的像素访问对象,访问对象是一个二维数组,可以如下操作:
pix = im.load()
print pix[x, y]
pix[x, y] = value
该对象效率比etpixel putpixel快很多。

offset(图片偏移)

im.offset(xoffset, yoffset) => image
       该方法已经取消了,请使用ImageChops模块的图片偏移功能。

paste(粘贴)

im.paste(image, box)
       将另一个图像粘贴到这个图像上。box参数可以是一个2元组(给定的左上角),或者一个4元组(左、上、右下),或者NONE。如果是4元组,要粘贴的图像大小必须匹配原图像大小。如果两者图片模式不匹配,则要粘贴的图片模式如何和被张贴图片不一致,则会被转换成对应的模式。

im.paste(colour, box)
       使用单一颜色填充box指定的区域。颜色是一个通道的一个单独的数值,如果要对多通道图像进行填充,需要使用一个元组。

im.paste(image, box, mask)
       只更新原图片中被蒙版标识的区域。

im.paste(colour, box, mask)

       使用单一颜色填充原图片中被蒙版标识的区域。

point(点操作)

im.point(table) => image
im.point(function) => image
       接受一个参数,且对图片中的每一个点执行这个函数,这个函数是一个匿名函数,在python之类的函数式编程语言中,可以使用lambda表达式来完成。例如:out = img.point(lambda i : i*1.2)#对每个点进行20%的加强
       如果图片是“I”或者“F”模式,那么这个lambda必须使用这样的形式
argument * scale + offset 
e.g
out = img.point(lambda i: i*1.2 + 10) 
Returns a copy of the image where each pixel has been mapped through the given table. The table should contains 256 values per band in the image. If a function is used instead, it should take a single argument. The function is called once for each possible pixel value, and the resulting table is applied to all bands of the image.

If the image has mode "I" (integer) or "F" (floating point), you must use a function, and it must have the following format:
    argument * scale + offsetExample:
    out = im.point(lambda i: i * 1.2 + 10)You can leave out either the scale or the offset.
im.point(table, mode) => image
im.point(function, mode) => image
Map the image through table, and convert it on fly. This can be used to convert "L" and "P" images to "1" in one step, e.g. to threshold an image.

(New in 1.1.5) This form can also be used to convert "L" images to "I" or "F", and to convert "I" images with 16-bit data to "L". In the last case, you must use a 65536-item lookup table.

putalpha(透明通道相关)

im.putalpha(band)
       这个方法是一个神奇的方法,你可以将一个图片(与原图尺寸相同)写入到原图片的透明通道中,而不影响原图片的正常显示,可以用于信息隐藏哦。当然,前提是原始图片有透明通道。不过就算不是也没有多大关系,因为有PIL提供的convert功能,可以把一个图片先转换成RGBA模式,然后把要隐藏的信息文件转成“L”或者“1”模式,最后使用这个putalpha将其叠加。而在图片的使用方,只需要简单的抽取其中的透明通道就可以看到隐藏信息了。
       拷贝指定的图片通道到一个现在运行的alpha图层。这个图片必须是一个RGBA模式的图片,这个通道必须是”L”模式或者”1”模式。
       PIL1.1.5中,可以对其他模式图片使用putalpha,图片会被转换到当前的模式,并且附加一个A图层通道,例如"LA" "RGBA"。这个通道参数可以是一个图片或者一个单一的颜色值。

putdata(使用序列改变图片的像素)

im.putdata(data)

im.putdata(data, scale, offset)
       从一个序列中获取像素点值,写入图片中,从左上角(0, 0)坐标开始写入,比例 /尺度或者偏移值用于调整序列值。
pixel = value * scale + offsetIf
尺度/比例如果省略,则默认为1.0,如果偏移省略,默认为1.0.

putpalette(调色板)

im.putpalette(sequence)
       现将green.png转成灰度图,然后自定义一个随机调色板着色,可以看到这个效果。可能有人在想这个图形处理的作用,其实作用还是比较大的,做模式识别,人脸检测等等操作事,真彩的图片往往很难处理,一个解决方案就是处理成灰度图或者二值图,一来可以去掉部分干扰,二来可以减少需要处理的数据量(提高效率)
附加一个调色板到一个"P" "L"图像,调色板序列包含768个整数值,其中每组3个值,代表对应的RGB的值。也可以使用一个8bit的字符串代替给整数序列。

putpixel(给某个像素赋值)

im.putpixel(xy, colour)
img.putpixel((4,4),(255,0,0)) putpixel将坐标为(4,4)的像素点变为(255,0,0)颜色,即红色。
       修改给定位置的像素值,一个单通道/图层的颜色值由一个数值觉得,如果是一个多通道/图层的图片,则使用元组制定。
       这个方法效率比较低,执行较慢,在1.1.6中,使用load的像素访问对象比较快。如果要生产/创建一个完整图片,可以使用list/列表,并 使用putdata将列表拷贝至图片。其他图片变化,也可以使用paste方法或者ImageDraw替代。
      
    im.load()
    putpixel = im.im.putpixel
    for i in range(n):
       ...
       putpixel((x, y), value)
1.1.6, 下列代码更优美:
    pix = im.load()
    for i in range(n):
        ...
        pix[x, y] = value

resize(调整图片大小)

im.resize(size) => image
       返回一个指定大小的图片副本,图片大小由一个2个元素(图片的宽和高)元组制定。
im.resize(size, filter) => image
       过滤器参数可以是NEAREST(最临近插值算法)、BILINEAR(双线性内插值算法)、BICUBIC(双三次插值算法/双三次卷积模板算法,在4x4中,使用三次样条插值)、ANTIALIAS(高品质采样过滤器)

rotate(旋转)

im.rotate(angle) => image

im.rotate(angle, filter=NEAREST, expand=0) => image
       返回一个以指定度数进行中心旋转的图片副本。

save(保存)

im.save(outfile, options...)

im.save(outfile, format, options...)
       按照给定的文件名称及路径写入保持图片,如果发生异常 ,会抛出一个IOError错误。

seek(搜索/寻找帧)

im.seek(frame)
       在一个指定的序列中寻找一个特定的图片帧,如果查找超过了给定序列尾部,则会抛出EOFError错误,但一个序列被打开时,默认从0开始查找。

show(显示/展示)

im.show()
       调用本机默认图片查看器进行图片展示。主要是为了调试。
       unix系统中,会将文件保存为PPM格式,在win系统中,会保存为BMP个格式。

split(分离通道)

im.split() => sequence

分割通道,如果是RGBA,分割后就有四个通道。
       bands=img.split()
bands[0]bands[1]bands[2]bands[3]分别代表了R(red)G(green)B(blue)A(alpha)四个通道。

tell(帧号码)

im.tell() => integer
       返回当前帧的号码

thumbnail(缩略图)

im.thumbnail(size)

im.thumbnail(size, filter)
       返回一个图片的缩略图,该缩略图不能超过给定的大小。

tobitmap(位图转换)

im.tobitmap() => string
       将图片转换为X11的位图,并返回。

tostring(像素字符串)

im.tostring() => string
       使用raw编码器,返回一个字符串,该字符串包含像素数据。

im.tostring(encoder, parameters) => string
       使用给定的编码方式,返回包含像素数据的字符串。

transform(图片转换(扭曲,映射)

Im.transform(size, method, data) => image
im.transform(size, method, data, filter) => image
method参数:
EXTENT 剪一个矩形出来(用以剪切,拉伸,压缩等操作)
AFFINE  几何防射转换
QUAD    将一个四边形映射到一个矩形
MESH    将多个四边形映射到一个操作
EXTENT参数的情况下,data是一个四元组(x0,y0,x1,y1),表示输入图片中需要处理的区域,size为新图片的尺寸,是一个二元组(width, height)用途:剪贴,拉伸,压缩等操作
AFFINE参数的情况下,data是一个六元组(a,b,c, d,e,f),其中包含affine转置矩阵的前两行。对于输出图片的每个像素(x,y),会被新值(ax+by+c, dx+ey+f)替换。用途:反转,旋转,剪切等
QUAD参数的情况下,data是一个八元组(x0,y0,x1,y1,x2,y2,x3,y3)表示源四边形的四个定点的坐标值。MESH方式跟QUAD的效果相当,不过是对多个四边形进行映射操作.

Creates a new image with the given size, and the same mode as the original, and copies data to the new image using the given transform.
In the current version of PIL, the method argument can be EXTENT (cut out a rectangular subregion), AFFINE (affine transform), QUAD (map a quadrilateral to a rectangle), or MESH (map a number of source quadrilaterals in one operation). The various methods are described below.

The filter argument defines how to filter pixels from the source image. In the current version, it can be NEAREST (use nearest neighbour), BILINEAR (linear interpolation in a 2x2 environment), or BICUBIC (cubic spline interpolation in a 4x4 environment). If omitted, or if the image has mode "1" or "P", it is set to NEAREST.

im.transform(size, EXTENT, data) => image
im.transform(size, EXTENT, data, filter) => image

Extracts a subregion from the image.

Data is a 4-tuple (x0, y0, x1, y1) which specifies two points in the input image's coordinate system. The resulting image will contain data sampled from between these two points, such that (x0, y0) in the input image will end up at (0,0) in the output image, and (x1, y1) at size.

This method can be used to crop, stretch, shrink, or mirror an arbitrary rectangle in the current image. It is slightly slower than crop, but about as fast as a corresponding resize operation.

im.transform(size, AFFINE, data) => image

im.transform(size, AFFINE, data, filter) => image

Applies an affine transform to the image, and places the result in a new image with the given size.

Data is a 6-tuple (a, b, c, d, e, f) which contain the first two rows from an affine transform matrix. For each pixel (x, y) in the output image, the new value is taken from a position (a x + b y + c, d x + e y + f) in the input image, rounded to nearest pixel.

This function can be used to scale, translate, rotate, and shear the original image.

im.transform(size, QUAD, data) => image

im.transform(size, QUAD, data, filter) => image

Maps a quadrilateral (a region defined by four corners) from the image to a rectangle with the given size.

Data is an 8-tuple (x0, y0, x1, y1, x2, y2, y3, y3) which contain the upper left, lower left, lower right, and upper right corner of the source quadrilateral.

im.transform(size, MESH, data) image => image

im.transform(size, MESH, data, filter) image => image

Similar to QUAD, but data is a list of target rectangles and corresponding source quadrilaterals.

transpose(旋转)

im.transpose(method) => image
       FLIP_LEFT_RIGHT       左右倒置
FLIP_TOP_BOTTOM    上下倒置
ROTATE_90   旋转90(逆时针)
ROTATE_180 旋转180(逆时针)
ROTATE_270 旋转270(逆时针)

Returns a flipped or rotated copy of an image.
Method can be one of the following: FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, or ROTATE_270.

verify(验证图片)

im.verify()
       验证图片是否被破坏。

Attributes(属性)

Image的类实例具有以下属性:
format
im.format => string or None
       返回源文件的文件格式。

mode(图片模式)

im.mode => string
       返回图片采用的模式,一般返回"1", "L", "RGB", "CMYK."

size(图片大小)

im.size => (width, height)

返回一个图片的大小,一个元组,有2个元素,宽和高。

palette(调色板)

im.palette => palette or None

返回一个颜色调色板

info(图片信息 )

im.info => dictionary
       返回一个字典,该字典有关于图片的数据。

merge(合并通道)

使用Image.merge("RGBA",(rIm,gIm,bIm,aIm))将通道合成为一个图片,"RGBA"格式的图片通道分为R(red)G(green)B(blue)A(alpha)rIm,gIm,bIm,aIm分别为自定义的RGBA

0x03图片处理基础

pil能处理的图片类型

pil可以处理光栅图片(像素数据组成的的块)

通道

一个图片可以包含一到多个数据通道,如果这些通道具有相同的维数和深度,Pil允许将这些通道进行叠加。
图像通道,在RGB色彩模式下就是指那单独的红色、绿色、蓝色部分。也就是说,一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图像。
      

模式

图片可以有以下几种模式:
1
 1位像素,黑和白,存成8位的像素
L
 8位像素,黑白
P
 8位像素,使用调色板映射到任何其他模式
RGB
 3×8位像素,真彩
RGBA
 4×8位像素,真彩+透明通道
CMYK
 4×8位像素,颜色隔离
YCbCr
 3×8位像素,彩色视频格式
I
 32位整型像素
F
 32位浮点型像素

尺寸

通过图片对象的size属性可以得到图片的尺寸,结果这是一个二元组,包含水平和垂直方向上的像素数。

坐标

Pil采取左上角为(0,0)的坐标系统,坐标系统的原点(0, 0)是左上角

调色板

mode("P")为每个像素定义具体的颜色值

图片信息

可以通过info属性读取一张图片的附加信息,这个与图片的格式有关。

滤镜

在对图片的几何操作中可能会将多个输入像素映射到单个的输出像素,pil提供4种不同的采样滤镜(在目前的版本中,后续的版本可能支持更多)
 NEAREST
最近
BILINEAR
双线型
BICUBIC
双三次插值
ANTIALIAS
平滑
       RGB模式下,每个图片由三个通道叠加而成,每个模式下为一个灰度图,当有一个调色板来调色的时候,这三张灰度图的叠加即可合成3*8(每个像素)的一个真彩图片。pil库中,图片之间的模式(mode)可以转化。下面给出一些简单的例子,例子中的所有图片均来自于国家地理的官网,为了使得文档比较短小,每个图片均使用Pil缩放成1/2大小,如有侵权嫌疑,请尽快联系,我会删除这些图片。

0x04附录



评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

Ubiquiti_Networks_UniFi_Cloud_Key_authed_rce