赞
踩
PIL库全称为Python Imaging Library,即Python图像处理库,是一个在Python中用于处理图像的非常流行的库。
这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。
核心图像库旨在快速访问存储在几种基本像素格式中的数据。为通用图像处理工具提供坚实的基础。
官网地址: https://pillow.readthedocs.io/en/stable/installation/index.html
PIL库中最重要的类就是Image类,它定义在同名模块中。可以通过几种方式创建此类的实例;要么从文件加载图像,处理其他图像,或者从头开始创建图像。从文件加载图像时,使用 Image 模块中的 open() 函数
源码:
def open(fp, mode="r", formats=None): """ Opens and identifies the given image file. This is a lazy operation; this function identifies the file, but the file remains open and the actual image data is not read from the file until you try to process the data (or call the :py:meth:`~PIL.Image.Image.load` method). See :py:func:`~PIL.Image.new`. See :ref:`file-handling`. :param fp: A filename (string), pathlib.Path object or a file object. The file object must implement ``file.read``, ``file.seek``, and ``file.tell`` methods, and be opened in binary mode. :param mode: The mode. If given, this argument must be "r". :param formats: A list or tuple of formats to attempt to load the file in. This can be used to restrict the set of formats checked. Pass ``None`` to try all supported formats. You can print the set of available formats by running ``python3 -m PIL`` or using the :py:func:`PIL.features.pilinfo` function. :returns: An :py:class:`~PIL.Image.Image` object. :exception FileNotFoundError: If the file cannot be found. :exception PIL.UnidentifiedImageError: If the image cannot be opened and identified. :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` instance is used for ``fp``. :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. """
参数说明:
fp: 文件名(字符串)、pathlib.Path对象或文件对象。file.read、file.seek和file.tell方法,并且必须以二进制模式打开。
mode: 模式。如果给出,此参数必须为"r"。
formats: 尝试加载文件的一系列格式列表或元组。这可用于限制检查的格式集合。传递None以尝试所有受支持的格式。
from PIL import Image
im = Image.open("./images/img.png")
print(im.format, im.size, im.mode)
# 此函数将返回一个Image对象。可以使用实例属性来检查文件内容:
# PNG (640, 464) RGBA
如果文件无法打开,则会触发OSError异常。
一旦拥有Image类的实例,就可以使用此类定义的方法来处理和操作图像。例如,加载图像:
注意:标准版本的show()效率不是很高,因为它会将图像保存到临时文件并调用实用程序来显示图像。
im.show())
Python Imaging Library 支持多种图像文件格式。要从磁盘读取文件,使用Image 模块中的open()函数。无需知道文件格式即可打开文件。库将根据文件内容自动确定格式。
要保存文件,使用Image类的save()方法。在保存文件时,名称变得重要。除非指定格式,否则库将使用文件扩展名来确定要使用哪种文件存储格式。
from PIL import Image
im = Image.open("./images/word_image1.png")
# 文件转为jpge
im.save('./images/img.jpg')
save() 方法可以提供第二个参数,明确指定文件格式。
from PIL import Image
im = Image.open("./images/word_image1.png")
im.thumbnail((128,128))
im.save('./images/img.thumbnail', "JPEG")
注意: 除非需要,否则库不会对光栅数据进行解码或加载。当打开文件时,会读取文件头以确定文件格式并提取诸如模式、大小以及其他所需的属性,但直到稍后才处理其余的文件。
这意味着打开图像文件是一个快速操作,与文件大小和压缩类型无关。
from PIL import Image
im = Image.open("./images/word_image1.png")
# 识别图像
with im as img:
print('./images/word_image1.png', img.format, f"{img.size}x{img.mode}")
# ./images/word_image1.png PNG (2218, 582)xRGB
Image 类包含允许操作图像内区域的方法。要从图像中提取子矩形,使用copy()方法。
box = (100, 100, 400, 400)
region = im.crop(box)
该区域由一个元组定义,其中坐标为 (左,上,右,下)。Python Imaging Library 使用的坐标系统以 (0, 0) 在左上角。坐标指的是像素之间的位置,因此上述示例中的区域正好是 300x300 像素。
该区域可以以某种方式进行处理并粘贴回去。
region = region.transpose(Image.Transpose.ROTATE_180)
im.paste(region, box)
粘贴区域回去时,区域的大小必须与给定区域完全匹配。此外,区域不能超出图像范围。然而,原始图像和区域的模式无需匹配。如果它们不匹配,区域将在粘贴前自动转换。
def roll(im, delta): "横向滚动图像。" xsize, ysize = im.size delta = delta % xsize if delta == 0: return im part1 = im.crop((0, 0, delta, ysize)) part2 = im.crop((delta, 0, xsize, ysize)) im.paste(part1, (xsize - delta, 0, xsize, ysize)) im.paste(part2, (0, 0, xsize - delta, ysize)) return im im.show() im1 = roll(im, 200) im1.show()
def merge(im1, im2):
w = im1.size[0] + im2.size[0]
h = max(im1.size[1], im2.size[1])
im = Image.new("RGBA", (w, h))
im.paste(im1)
im.paste(im2, (im1.size[0], 0))
return im
im = Image.open("./images/img.png")
im2 = Image.open('./images/img_1.png')
merge_img = merge(im, im2)
merge_img.show()
对于更高级的技巧,paste()方法还可以接受一个透明度蒙版作为可选参数。在这个蒙版中,值 255 表示粘贴的图像在该位置是不透明的(即,应使用粘贴的图像)。值 0 表示粘贴的图像完全透明。中间值表示不同程度的透明度。例如,粘贴一个 RGBA 图像并同时使用它作为蒙版会粘贴图像的不透明部分,但不包括其透明背景。
Python Imaging Library 还允许使用多波段图像的各个波段,例如 RGB 图像。split()方法创建一组新图像,每个图像包含原始多波段图像的一个波段。merge 函数采用一个模式和图像元组,并将它们合并成一张新图像。以下示例交换了一个 RGB 图像的三个波段:
r, g, b, a = im.split()
im = Image.merge("RGBA", (b, g, r, a))
im.show()
对于单波段图像,split() 返回图像本身。要使用单独的颜色波段,需要先将图像转换为“RGB”。
PIL.Image.Image 类包含 resize() 和 rotate() 图像的方法。前者接受一个元组,给出新的大小,后者是逆时针角度。
out = im.resize((128, 128))
out = im.rotate(45) # 逆时针度数
要以 90 度的步长旋转图像,可以使用rotate()方法或transpose() 方法。后者也可以用来围绕图像的水平或垂直轴翻转图像。
out = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
out = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
out = im.transpose(Image.Transpose.ROTATE_90)
out = im.transpose(Image.Transpose.ROTATE_180)
out = im.transpose(Image.Transpose.ROTATE_270)
其中值的含义:
transpose(ROTATE) 操作也可以通过rotate() 操作以相同的方式执行,前提是 expand标志为 true,以提供对图像大小的相同更改。
可以通过transform() 方法执行更通用的图像转换。
除了在调整大小时计算新图像的大小外,还可以选择相对于给定大小进行调整大小。
size = (100, 150)
with im as im:
ImageOps.contain(im, size).save("./images/imageops_contain.png")
ImageOps.fit(im, size).save("./images/imageops_fit.png")
ImageOps.pad(im, size, color="#f00").save("./images/imageops_pad.png")
ImageOps的方法:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。