PIL—Image Module
题目:Image 模块
Image模块提供了一个同名的类,用来表示PIL图像。该模块还提供了许多工厂函数,包括从文件加载图像和创建新图像的功能。
例子
下面的脚本加载一个图像,将其旋转45度,然后使用外部查看器显示它(通常在Unix上是xv,在Windows上是paint程序)
from PIL import Image
im = Image.open("bride.jpg")
im.rotate(45).show(
创建一个缩略图
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)
im.save(file + ".thumbnail", "JPEG")
缩略图函数:
im.thumbnail(size)
构造函数
PIL.Image.new(mode, size, color=0):根据给定参数创建一个图片
参数:
- mode:使用的模式。
- size:一个二维元组,包含宽和高。
- colar:图像应该使用什么颜色。默认是黑色的。如果给定,这应该是一个单带模式的整数或浮点值,以及一个多带模式的元组(每个带一个值)。在创建RGB图像时,还可以使用ImageColor模块支持的颜色字符串。如果颜色为None,则不初始化图像。
**PIL.Image.fromarray(obj, mode=None)?*从导出数组接口的对象(使用缓冲区协议)创建图像内存。
如果obj不是连续的,则调用tobytes方法并使用frombuffer()。
- obj 对象的数组接口
- mode 模式
*PIL.Image.frombytes(mode, size, data, decoder_name=‘raw’, args):
从缓冲区中的像素数据创建图像内存的副本。
在其最简单的形式中,这个函数接受三个参数(模式、大小和未打包的像素数据)。
你也可以使用PIL支持的任何像素解码器。有关可用解码器的更多信息,请参见编写自己的文件解码器一节。
注意,这个函数只解码像素数据,而不是整个图像。如果字符串中有一个完整的图像,请将其包装在BytesIO对象中,并使用open()加载它。
- mode – 模式。
- size – 大小。
- data – 一个字节缓冲区给定了对于该模式的原始数据。
- decoder_name – 使用什么解码器。
- args – 给解码器用的参数。
其他:
PIL.Image.fromstring(*args, **kw)
PIL.Image.frombuffer(mode, size, data, decoder_name=‘raw’, *args)
Modes(模式,Image创建中用到的)
- 1 (1位,黑白)
- L (8位,黑白)
- P (8位像素,使用调色板映射到任何其他模式))
- RGB (3x8彩色, 真彩色)
- RGBA (4x8位, 真彩色+透明度)
- CMYK (4x8位,颜色分隔)
- YCbCr (3x8-位, 视频颜色格式)
- LAB (3x8位, Lab 颜色空间)
- HSV (3x8位, 色调,饱和度,值颜色空间)
- I (32位符号整数)
- F (32位浮点数)
PIL也为一些特殊的模式提供有限的支持,包括LA (L with alpha), RGBX (true color with padding)和RGBa (true color with premultiply alpha)。但是PIL不支持用户自定义模式;如果要处理上面没有列出的波段组合,请使用图像对象序列。
**您可以通过mode属性读取图像的模式。**这是一个包含上述值之一的字符串。
常用函数
PIL.Image.open(fp, mode=‘r’)
这是一个惰性操作;这个函数标识文件,但是文件仍然是打开的,在尝试处理数据(或调用load()方法)之前,不会从文件中读取实际的图像数据。
参数:
- fp 一个文件名(字符串),路径库。路径对象或文件对象。file对象必须实现read()、seek()和tell()方法,并以二进制模式打开。
- mode 必须给出r。
**返回值:**一个Image对象
抛出: IOError——如果找不到文件,或者无法打开和标识图像。
注意:为了防止由“解压炸弹”(即恶意文件,这些文件被解压成大量数据,并被设计成崩溃或使用大量内存造成破坏)引起的潜在DOS攻击,Pillow会在图像超过一定限度时发出解压炸弹警告。如果需要,警告可以转换为带有警告的错误。简单过滤器(“错误”,image . decompressionbomb警告)或完全抑制与警告。simplefilter(“忽略”,Image.DecompressionBombWarning)。还请参阅日志文档,以便将警告输出到日志工具而不是stderr。
Image.resize(size, resample=0)
返回此图像的调整大小的副本。
参数:
- size(width,height)
- resample 一个可选的重采样过滤器。
返回值: Image对象。
其中:
PIL.Image.NEAREST:最低质量
PIL.Image.BILINEAR:双线性
PIL.Image.BICUBIC:三次样条插值
PIL.Image.ANTIALIAS:最高质量
Image.putpixel(xy, value):
修改给定位置的像素。对于单波段图像,颜色是一个数值,对于多波段图像,颜色是一个元组。
注意,这个方法相对比较慢。要进行更广泛的更改,可以使用paste()或ImageDraw模块。
- xy: 坐标
- value :要修改的值。
图像处理
有关图像合并/融合:
- PIL.Image.alpha_composite(im1, im2)
- PIL.Image.blend(im1, im2, alpha)
- PIL.Image.composite(image1, image2, mask)
- PIL.Image.eval(image, *args)
- PIL.Image.merge(mode, bands)
补充:关于glob——Unix风格的路径名模式expansio
glob模块根据Unix shell使用的规则查找与指定模式匹配的所有路径名,虽然返回的结果顺序是任意的。不做波浪线扩展,但是*、?和用[]表示的字符范围将正确匹配。这是通过同时使用os.listdir()和fnmatch.fnmatch()函数来实现的,而不是通过实际调用子shell来实现的。注意,与fnmatch.fnmatch()不同,glob将以点(.)开头的文件名视为特殊情况。(对于tilde和shell变量展开,使用os.path.expanduser()和os.path.expandvars()。)
对于文字匹配,将元字符括在括号中。例如,“[?]“匹配字符”?
glob.glob(pathname)返回匹配的路径名。路径名可以是绝对的(如/usr/src/ python -1.5/ makefile),也可以是相对的(如…/…/Tools//.gif),并且可以包含shell样式的通配符。断开的符号链接包含在结果中(与shell中一样)。
glob.iglob:返回一个迭代器,该迭代器生成与glob()相同的值,而不需要同时存储它们。
假设只包含1.gif, 2.txt, and card.gif。
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
如果目录包含.开头的文件。默认情况下不会匹配它们。例如,考虑一个包含card.gif和.card.gif的目录:
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
补充os.paht——常见的路径名操作
这个模块在路径名上实现了一些有用的函数。要读取或写入文件,请参阅open(),要访问文件系统,请参阅os模块。路径参数可以作为字符串或字节传递。鼓励应用程序将文件名表示为(Unicode)字符串。不幸的是,有些文件名在Unix上可能无法表示为字符串,因此需要支持Unix上任意文件名的应用程序应该使用字节对象来表示路径名。反之,使用字节对象不能表示Windows上的所有文件名(在标准的mbcs编码中),因此Windows应用程序应该使用字符串对象来访问所有文件。
与unix shell不同,Python不执行任何自动路径扩展。当应用程序需要类shell路径展开时,可以显式地调用expanduser()和expandvars()等函数。(参见glob模块)。
注意:所有这些函数都只接受字节或字符串对象作为参数。如果返回路径或文件名,则结果是相同类型的对象。
由于不同的操作系统具有不同的路径名称约定,因此标准库中有几个版本的此模块。os.path模块始终是适合运行Python的操作系统的路径模块,因此可以用于本地路径。不过,如果希望操作始终以不同格式之一显示的路径,还可以导入和使用各个模块。它们都有相同的界面:
用于unix样式路径的posixpath
ntpath用于Windows路径
macpath用于老式MacOS路径
函数
os.path.abspath(path)
返回路径名路径的规范化绝对版本。在大多数平台上,这相当于按如下方式调用函数normpath(): normpath(join(os.getcwd(), path))。
os.path.basename(path)
返回路径名路径的基本名称。这是通过将路径传递给函数split()返回的对的第二个元素。注意,这个函数的结果与Unix basename程序不同;当’/foo/bar/'的basename返回’bar’时,basename()函数返回一个空字符串(")。
os.path.commonpath(paths)
返回序列路径中每个路径名的最长公共子路径。如果路径同时包含绝对和相对路径名,或者路径为空,则引发ValueError。与commonprefix()不同,它返回一个有效的路径。
os.path.commonprefix(list):返回最长路径前缀(逐个字符获取),它是列表中所有路径的前缀。如果列表为空,返回空字符串(")
注意:此函数可能返回无效路径,因为它一次处理一个字符。要获得有效路径,请参见
如:
commonpath()。
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
os.path.dirname(path):返回目录名。
os.path.exists(path):该地址是否存在文件。对符号链接文件返回False。
**os.path.lexists(path)?*如果path引用现有路径,则返回True。对于断开的符号链接返回True。在缺少os.lstat()的平台上等效exists()。
os.path.expanduser(path)???‘
os.path.expandvars(path) 返回展开环境变量的参数。表单
n
a
m
e
或
name或
name或{name}的子字符串被环境变量name的值替换。格式不正确的变量名和对不存在变量的引用保持不变。
在Windows上,除了
n
a
m
e
和
name和
name和{name}之外,还支持%name%扩展。
**os.path.getatime(path)**返回路径最后一次访问的时间。返回值是一个浮点数,给出从历元开始的秒数(参见时间模块)。如果文件不存在或无法访问,则引发OSError。
**os.path.getmtime(path):**返回路径上次修改的时间。返回值是一个浮点数,给出从历元开始的秒数(参见时间模块)。如果文件不存在或无法访问,则引发OSError。
**os.path.getctime(path):**返回系统的ctime,在某些系统(如Unix)上,ctime是最后一次元数据更改的时间,在其他系统(如Windows)上,ctime是path的创建时间。返回值是一个数字,给出从历元开始的秒数(参见时间模块)。如果文件不存在或无法访问,则引发OSError。
**os.path.getsize(path):**返回路径文件大小。
os.path.isabs(path)
如果path是绝对路径名,则返回True。在Unix上,这意味着它以斜杠开头;在Windows上,它以反斜杠开头,在截断一个可能的驱动器字母之后。
os.path.isfile(path)
如果path是一个现有的常规文件,则返回True。这遵循符号链接,因此islink()和isfile()对于同一路径都可以为真。
os.path.isdir(path)
如果path是现有目录,则返回True。这遵循符号链接,因此islink()和isdir()对于同一路径都可以为真。
os.path.islink(path)
如果path引用的是一个符号链接,则返回True。如果Python运行时不支持符号链接,则始终为False。
**os.path.ismount(path)**链接多个path成员。
os.path.normcase(path)
将路径名的大小写规范化。在Unix和Mac OS X上,这将返回未更改的路径;在不区分大小写的文件系统上,它将路径转换为小写。在Windows上,它还将前斜杠转换为后斜杠。如果路径类型不是str或字节(直接或间接通过操作系统),则引发类型错误。PathLike接口)。
os.path.normpath(path)
通过折叠冗余分隔符和上层引用来规范化路径名,以便a //B、a /B/、a /。/ B和A / foo / . ./B都变成了A/B。此字符串操作可能会更改包含符号链接的路径的含义。在Windows上,它将前斜杠转换为后斜杠。若要规范化大小写,请使用normcase()。
os.path.realpath(path)
返回指定文件名的规范路径,消除路径中遇到的任何符号链接(如果操作系统支持这些符号链接)。
os.path.relpath(path, start=os.curdir)
从当前目录或可选的开始目录返回到路径的相对文件路径。这是一个路径计算:没有访问文件系统来确认路径或启动的存在性或本质。start defaults to os.curdir.
os.path.samefile(path1, path2)
如果两个路径名参数都指向同一个文件或目录,则返回True。这是由设备号和i-node号决定的,如果对任一路径名的os.stat()调用失败,就会引发异常。
os.path.sameopenfile(fp1, fp2)
如果文件描述符fp1和fp2指向同一个文件,则返回True。
os.path.samestat(stat1, stat2)
如果stat元组stat1和stat2引用同一个文件,则返回True。这些结构可能由os.fstat()、os.lstat()或os.stat()返回。此函数实现samefile()和sameopenfile()使用的底层比较。
os.path.split(path)
将路径名路径分割成一对(head, tail), tail是最后一个路径名组件,head是指向该组件的所有内容。尾部永远不会包含斜线;如果路径以斜线结束,则tail为空。如果路径中没有斜杠,则磁头为空。如果路径是空的,那么头和尾都是空的。尾斜杠从头部移除,除非它是根(只有一个或多个斜杠)。在所有情况下,join(head, tail)都返回与path相同位置的路径(但是字符串可能不同)。还请参见函数dirname()和basename()。
os.path.splitdrive(path)
将路径名路径拆分为一对(驱动器、tail),其中驱动器要么是挂载点,要么是空字符串。在不使用驱动器规范的系统上,驱动器总是空字符串。在所有情况下,drive + tail将与path相同。
在Windows上,将路径名拆分为驱动器/UNC sharepoint和相对路径。
如果路径包含一个驱动器字母,驱动器将包含到冒号之前的所有内容。例如:splitdrive(“c:/dir”)返回(“c:”, “/dir”)
如果路径包含UNC路径,驱动器将包含主机名和共享,直到但不包括第四个分隔符。例如:splitdrive("//host/computer/dir")返回("//host/computer", “/dir”)
os.path.splitext(path)
将路径名路径拆分为一对(root, ext),这样root + ext == path和ext为空,或者以句点开头,最多包含一个句点。基本名上的前导周期被忽略;splitext (。cshrc文件中)返回(“。cshrc’,”)。
os.path.supports_unicode_filenames
如果任意Unicode字符串可以用作文件名(在文件系统施加的限制范围内),则为真。