一、PIL的基本概念:
PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。
1、通道
每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。
以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。
对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()
是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。
Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
方法getbands()的使用如下:
from PIL import Image im = Image.open("xiao.png") print(im.getbands()) 输出: ('R', 'G', 'B')
2、模式
图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。 L:8位像素,表示黑和白。 P:8位像素,使用调色板映射到其他模式。 RGB:3x8位像素,为真彩色。 RGBA:4x8位像素,有透明通道的真彩色。 CMYK:4x8位像素,颜色分离。 YCbCr:3x8位像素,彩色视频格式。 I:32位整型像素。 F:32位浮点型像素。 PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。
属性mode的使用如下:
from PIL import Image im = Image.open("xiao.png") print(im.mode) 输出: 'RGB'
3、尺寸
通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。
属性mode的使用如下:
from PIL import Image im = Image.open("xiao.png") print(im.size) 输出: (670, 502)
4、坐标系统
PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。
坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。
5、调色板
调色板模式("P")使用一个颜色调色板为每个像素定义具体的颜色值
6、信息
使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。
属性info的使用如下:
from PIL import Image im = Image.open("xiao.png") print(im.info) 输出: {}
7、滤波器
对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:
NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。
Image模块中的方法resize()和thumbnail()用到了滤波器。
方法resize()的使用如下:
方法resize()的定义为:resize(size, filter=None)=> imagefrom PIL import Image im = Image.open("xiao.png") print(im.size)im_resize = im.resize((256,256))print(im_resize.size)输出:(670, 502)(256,256)
对参数filter不赋值的话,方法resize()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
from PIL import Image im = Image.open("xiao.png") print(im.size) im_resize0 = im.resize((256,256), Image.BILINEAR) print(im_resize0.size)im_resize1 = im.resize((256,256), Image.BICUBIC) print(im_resize1.size)im_resize2 = im.resize((256,256), Image.ANTIALIAS) print(im_resize2.size) 输出:(670, 502)(256,256)(256,256)(256,256)
二、Image模块:
Image模块是PIL中最重要的模块,它有一个类叫做image,与模块名称相同。Image类有很多函数、方法及属性,接下来将依次对image类的属性、函数和方法进行介绍。
一、Image类的属性
1、Format
定义:im.format "xiao.png") print(im.format) 输出: 'png'
2、Mode
定义:im.mode "htmlcode">
定义:im.palette "jing.jpg") print(im.mode) print(im.palette) 输出: RGB None5、Info
定义:im.info "htmlcode">
定义:Image.new(mode,size) "RGB", (128, 128), "#FF0000") im.save("test1.png") #图像im为128x128大小的红色图像。 im= Image.new("RGB", (128, 128)) #图像im为128x128大小的黑色图像,因为变量color不赋值的话,图像内容被设置为0,即黑色。 im.save("test2.png")im= Image.new("RGB", (128, 128), "red") #图像im为128x128大小的红色图像。im.save("test3.png")2、Open
定义:Image.open(file) "xiao.png")3、Blend
定义:Image.blend(image1,image2, alpha) "jing.jpg") im2 = Image.open("wu.jpg") im = Image.blend(im1,im2,0.5) im.save("he.jpg")4、Composite
定义:Image.composite(image1,image2, mask) "jing.jpg") im2 = Image.open("wu.jpg") r,g,b = im1.split() print(g.mode) im = Image.composite(im1,im2,b) im.save("he.jpg") b.save("he1.jpg")5、Eval
定义:Image.eval(image,function) "jing.jpg") def deffun(c): return c*0.89 #改变了亮度 im_eval = Image.eval(im,deffun) im_eval.save("gai.jpg")注:图像im_eval与im01比较,其像素值均为im01的一半,则其亮度自然也会比im01暗一些。6、Frombuffer
定义:Image.frombuffer(mode,size, data) "raw", mode, 0, 1)
函数Image.frombuffer(mode,size, data, decoder, parameters)与函数fromstring()的调用一致。7、Fromstring
定义:Image.fromstring(mode,size, data) "htmlcode">
定义:Image.merge(mode,bands) "jing.jpg") im2 = Image.open("wu.jpg") r1,g1,b1 = im1.split() r2,g2,b2 = im2.split() imgs =[r1,g2,b2] im_merge = Image.merge("RGB",imgs) im_merge.save("he.jpg")三、Image类的方法
除非另作说明,Image类的所有方法都将返回一个Image类的新实例,这个实例对应于结果图像。
1、Convert
定义1:im.convert(mode)"jing.jpg") print(im1.mode) im_c = im1.convert("1") im_c.save("he.jpg") print(im_c.mode) 输出:1 注:将“RGB”模式的im01图像,转换为“1”模式的im_c图像。 定义2:im.convert(“P”,**options) "jing.jpg") im1.mode rgb2xyz = ( 0.412453, 0.357580, 0.180423, 0, 0.212671, 0.715160, 0.072169, 0, 0.019334, 0.119193, 0.950227, 0 ) im_c3 = im1.convert("L", rgb2xyz) im_c3.save("he.jpg") print(im_c3.mode)输出:L2、Copy
定义:im.copy() "jing.jpg") im2 = im1.copy() im2.save("he.jpg") 注:图像im_copy和im01完全一样。3、Crop
定义:im.crop(box) "jing.jpg") print(im1.size) box = [0,0,650,400] #650(长)400(高) im_crop = im1.crop(box) im_crop.save("he.jpg")4、Draft
定义:im.draft(mode,size) 含义:配置图像文件加载器,使得返回一个与给定的模式和尺寸尽可能匹配的图像的版本。例如,用户可以使用这个方法,在加载一个彩色JPEG图像时将其转换为灰色图像,或者从一个PCD文件中提取一个128x192的版本。 注意:这个方法会适时地修改图像对象(精确地说,它会重新配置文件的读取器)。如果图像已经被加载,那这个方法就没有作用了。 例子: from PIL import Image im1 = Image.open("jing.jpg") im_draft = im1.draft("L",(500,500)) print(im_draft.size) im_draft.save("he.jpg") 输出: (650, 650)5、 Filter
定义:im.filter(filter) "jing.jpg") im_filter = im1.filter(ImageFilter.BLUR) im_filter.save("he.jpg") 注:图像im_filter比im01变得有些模糊了。6、 Fromstring
定义:im.fromstring(data)
im.fromstring(data, decoder,parameters)
含义:与函数fromstring()一样,但是这个方法会将data加载到当前的图像中。7、 Getbands
定义:im.getbands()"htmlcode">
定义:im.getbbox() "jing.jpg") print(im1.getbbox()) 输出: (0, 0, 650, 650)9、Getcolors
定义:im.getcolors() "test.png") print(im1.getcolors(8888888))输出:[(2, (255, 255, 255, 233)), (9, (0, 0, 0, 136)), (1, (0, 0, 0, 64)), (2, (0, 0, 0, 24)), (5, (0, 0, 0, 56)).......10、 Getdata
定义:im.getdata() "jing.jpg") seq = im1.getdata() print(seq[0]) seq0 = list(seq) print(seq0[0]) print(len(seq0)) 输出: (41, 183, 197) (41, 183, 197) #这个值是长和高之积 注:Sequence对象的每一个元素对应一个像素点的R、G和B三个值。11、 Getextrema
定义:im.getextrema() "jing.jpg") print(im1.getextrema()) 输出: ((0, 255), (0,255), (0, 255)) 该方法返回了R/G/B三个通道的最小和最大值的2元组。12、 Getpixel
定义:im.getpixel(xy) "jing.jpg") print(im1.getpixel((1,1))) print(im1.getpixel((649,649))) 输出: (41, 183, 197) (236, 210, 153)注:im.getpixel(xy)中的X,Y表示坐标,从0开始。13、 Histogram
定义1:im.histogram()"jing.jpg") ls = im1.histogram() print(len(ls)) print(ls[767]) 输出: 147114、 Load
定义:im.load() 含义:为图像分配内存并从文件中加载它(或者从源图像,对于懒操作)。正常情况下,用户不需要调用这个方法,因为在第一次访问图像时,Image类会自动地加载打开的图像。 (New in 1.1.6)在1.1.6及以后的版本,方法load()返回一个用于读取和修改像素的像素访问对象。这个访问对象像一个二维队列,如: pix = im.load() print pix[x, y] pix[x, y] =value 通过这个对象访问比方法getpixel()和putpixel()快很多。 例子: from PIL import Image im1 = Image.open("jing.jpg") lm_load = im1.load() print(lm_load[649,649]) 输出: (236, 210, 153)15、Paste
定义1:im.paste(image,box) 含义1:将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。 如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。 例子1: from PIL import Image im1 = Image.open("jing.jpg") box = [0,0,200,200] im_crop = im1.crop(box) im1.paste(im_crop,(200,200,400,400)) #等价于im1.paste(im_crop,(200,200)) im1.save("he.jpg") 定义2:im.paste(colour,box) 含义2:它与定义1一样,但是它使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。 例子2: from PIL import Image im1 = Image.open("jing.jpg") im1.paste((256,256,256),(200,100,500,200)) im1.save("he.jpg") 注:图像im1的(200,100)位置将出现一个300x100的白色方块,对于多通道的图像,如果变量colour只给定一个数值,将只会应用于图像的第一个通道。如果是“RGB”模式的图像,将应用于红色通道。 定义3:im.paste(image,box, mask) 含义3:与定义1一样,但是它使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。 如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合。 注意:如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像。 例子3: from PIL import Image im1 = Image.open("jing.jpg") box = [100,100,200,200] im_crop = im1.crop(box) r,g,b = im_crop.split() im1.paste(im_crop,(200,100,300,200),b) im1.save("he.jpg") 注:在图像im1的(0,0)位置将出现一个半透明的100x100的方块。 定义4:im.paste(colour,box, mask) 含义4:与定义3一样,只是使用变量colour对应的单色来填充区域。 例子4: from PIL import Image im1 = Image.open("jing.jpg") box = [100,100,200,200] im_crop = im1.crop(box) r,g,b = im_crop.split() im1.paste((0,256,0),(200,100,300,200),b) im1.save("he.jpg") 注:在图像im1的(0,0)位置将出现一个100x100的绿色方块。总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?