写点什么

Python 案例分析|使用 Python 图像处理库 Pillow 处理图像文件

作者:TiAmo
  • 2023-07-19
    江苏
  • 本文字数:3705 字

    阅读完需:约 12 分钟

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用 Python 图像处理库 Pillow,帮助大家进一步了解 Python 的基本概念:模块、对象、方法和函数的使用使用 Python 语言解决实际问题时,往往需要使用由第三方开发的开源 Python 软件库。本案例使用图像处理库 Pillow 中的模块、对象来处理图像:实现读取图像、获取图像信息、调整图像大小、旋转图像、平滑图像、剪切图像等基本图像处理任务。

01、安装

PillowPillow 是 Python 中的图像处理库(PIL,Python Image Library),提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。Pillow 位于 Python 包索引(PyPI)中,可以使用 pip 来安装。注意,Anaconda 包含了 Pillow 库。【例 1】使用 pip 安装 Pillow 库。以管理员身份运行命令行提示符,输入命令 pip3 install Pillow,安装 Pillow 库。如图 1 所示。


■ 图 1 使用 pip 安装 Pillow 库

02、打开和显示图像

Pillow 库包含几十个模块,组织在名为 PIL 的包中。PIL 包中的一个模块是 Image。PIL.Image 提供了一些包括从文件中加载图像和创建新图像的函数,其中的 Image 用于表示图像对象。

【例 2】打开和显示图像。

使用 PIL.Image 模块的 open()函数可以打开一个图像,返回一个图像对象,然后调用图像对象的 show()方法,可以在屏幕上显示图像。

>>> import PIL; from PIL import Image>>> im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg")>>> im.show()>>> print(im.format, im.size, im.mode) #显示图像的格式、大小和模式信息JPEG (298, 298) RGB
复制代码

说明/

(1)im.format 返回包含图像格式的字符串(JPEG、GIF、TIFF、BMP、PNG、…)。

(2)im.size 返回包含图像宽度和高度的元组,单位为像素。与每个像素相关的是一对坐标(i, j),用于标识像素的列 i 和行 j。列从左到右编号,从 0 开始;行从上到下编号,也从 0 开始。

(3)im.mode 返回包含图像模式的字符串(RGB、CYMK、Grayscale、…)。

03、图像的基本操作

图像对象的 copy()方法用于拷贝图像;crop()方法用于剪裁图像;paste()方法用于将一个图像粘贴(覆盖)在另一个图像上面;resize()方法用于调整图像大小;rotate()方法用于旋转和翻转图像;filter()方法用于图像过滤。

Pillow 提供的图像处理工具包括其它众多模块。有关 Pillow 的更多信息,请查阅在线文档http://pillow.readthedocs.org。

使用 PIL.Image 模块中的函数 new()可以创建一个给定模式和大小的新图像对象。例如,创建一个新的大小为 800×600 的 RGB 图像的代码如下:

>>> im2 = PIL.Image.new('RGB', (800,600))
复制代码

【例 3】图像的基本操作示例。

把一幅图像的 4 个副本排列成 2×2 网格:在左上方的副本是原始图像,而画面右上方、左下方、右下方则分别使用模块 PIL.ImageFilter 中定义的内置过滤器 CONTOUR、EMBOSS、FIND_EDGES 进行过滤。

#模块:c:\pythonpa\cs\image_test.py#命令行:python image_test.py c:\pythonpa\cs\img\mandrill.jpg#功能:把c:\pythonpa\cs\img\mandrill.jpg的4个副本排列成2×2网格并显示import sysimport osimport PIL.Imageimport PIL.ImageFilterim = PIL.Image.open(sys.argv[1])width, height = im.size# 创建新图像,大小为原始图像的4倍res = PIL.Image.new(im.mode, (2*width, 2*height))# 把原始图像放置在左上角res.paste(im, (0, 0, width, height))# 把轮廓过滤CONTOUR的图像放置在右上角contour = im.filter(PIL.ImageFilter.CONTOUR)res.paste(contour, (width, 0, 2*width, height))# 把浮雕过滤EMBOSS的图像放置在左下角emboss = im.filter(PIL.ImageFilter.EMBOSS)res.paste(emboss, (0, height, width, 2*height))# 把边缘过滤FIND_EDGES的图像放置在右下角edges = im.filter(PIL.ImageFilter.FIND_EDGES)res.paste(edges, (width, height, 2*width, 2*height))# 显示结果图像res.show()
复制代码

04、批量图像格式转换

使用 PIL.Image 模块的 open()函数打开磁盘图像文件时,会根据文件内容自动确定文件格式。使用 Image 对象的 save()方法保存图像时,可以指定格式,从而实现格式转换。

【例 4】批量图像格式转换。

#模块:c:\pythonpa\cs\image_convert.py#命令行:python image_convert.py c:\pythonpa\cs\img jpg png#功能:把c:\pythonpa\cs\img下的所有jpg文件转换为png文件import sysimport globimport osimport PIL.Imageimg_path = sys.argv[1] + "/*." + sys.argv[2]for infile in glob.glob(img_path):    f,e = os.path.splitext(infile)    outfile = f + "." + sys.argv[3]    PIL.Image.open(infile).save(outfile)
复制代码

说明/

(1)glob 模块可以使用通配符匹配文件名。例如 glob.glob("c:\tmp*.jpg"),可以返回 c:\tmp 下的所有后缀为 jpg 的文件列表。

(2)os.path.splitext(p)可以拆分文件名和后缀。

05、批量创建缩略图

缩略图是网络开发或图像软件预览常用的一种基本技术,使用 Python 的 Pillow 图像库中 Image 模块中的 Image 对象的 thumbnail()方法,可以很方便地建立缩略图。

【例 5】批量创建缩略图。

#模块:c:\pythonpa\cs\ image_thumbnail.py#命令行:python image_thumbnail.py c:\pythonpa\cs\img jpg#功能:把c:\pythonpa\cs\img下的所有*.jpg文件转换为*_s.jpg缩略图import sysimport osimport globimport PIL.Imageimg_path = sys.argv[1] + "/*." + sys.argv[2]size = (128,128)for infile in glob.glob(img_path):    f,e = os.path.splitext(infile)    outfile = f + "_s." + sys.argv[2]    img = PIL.Image.open(infile)    img.thumbnail(size, PIL.Image.ANTIALIAS)    img.save(outfile)
复制代码

说明/

(1)glob 模块可以使用通配符匹配文件名。例如 glob.glob("c:\tmp*.jpg"),可以返回 c:/tmp 下的所有后缀为 jpg 的文件列表。

(2)os.path.splitext(p)可以拆分文件名和后缀。

06、批量图像加文字水印

图片加水印是防止盗版的有效方式之一。首先使用 Python 的 Pillow 图像库中的 Image 模块的 new 函数可以创建水印图像对象,并使用 ImageDraw 模块在水印图像上绘制文字,最后通过 Image 模块的 composite 函数合成水印图像和原图像。

【例 6】批量图像加文字水印。

#模块:c:\pythonpa\cs\image_watermark1.py#命令行:python image_watermark1.py c:\pythonpa\cs\img jpg "Python"#功能:把c:\pythonpa\cs\img下的所有*.jpg文件加"Python"水印并另存为*_w.jpgimport sysimport osimport globfrom PIL import Image, ImageDraw, ImageFontimg_path = sys.argv[1] + "/*." + sys.argv[2]img_suffix = sys.argv[2]txt_log = sys.argv[3]for infile in glob.glob(img_path):    f, e = os.path.splitext(infile)    outfile = f + "_w." + img_suffix    im = Image.open(infile)    im_log = Image.new('RGBA', im.size)    fnt = ImageFont.truetype("c:/Windows/fonts/Tahoma.ttf", 20)    d = ImageDraw.ImageDraw(im_log)    d.text((0, 0), txt_log, font = fnt)    im_out = Image.composite(im_log, im, im_log)    im_out.save(outfile)
复制代码

07、批量图像加图片水印

加图片水印的原理和加文字水印相同,首先使用 Python 的 Pillow 图像库中的 Image 模块的 new 函数可以创建水印图像对象,并使用图像对象的 paste 方法把 log 图像粘贴到水印图像,最后通过 Image 模块的 composite 函数合成水印图像和原图像。

【例 7】批量图像加图片水印。

#模块:c:\pythonpa\cs\image_watermark2.py#命令行:python image_watermark2.py c:\pythonpa\cs\img jpg c:\pythonpa\cs\img\python-logo.png#功能:把c:\pythonpa\cs\img下的所有*.jpg文件加水印python-logo.png并另存为*_w.jpgimport sysimport osimport globfrom PIL import Image, ImageDraw, ImageFontimg_path = sys.argv[1] + "/*." + sys.argv[2]img_suffix = sys.argv[2]log_file = sys.argv[3]for infile in glob.glob(img_path):    f, e = os.path.splitext(infile)    outfile = f + "_w." + img_suffix    im = Image.open(infile)    im_log = Image.open(log_file)    im_mark = Image.new('RGBA', im.size)    im_mark.paste(im_log, (0, 0))    im_out = Image.composite(im_mark, im, im_mark)    im_out.save(outfile)
复制代码

08、批量调整图像大小

调整图像大小也是网络开发或图像软件预览常用的一种基本技术。使用 Image 对象的 resize()方法可以调整图像大小。

【例 8】批量调整图像大小。

#模块:c:\pythonpa\cs\image_resize.py#命令行:python image_resize.py c:\pythonpa\cs\img jpg 640 480#功能:把c:\pythonpa\cs\img下的所有*.jpg文件大小调整为640*480并另存为*_640.jpgimport sysimport osimport globimport PIL.Imageimg_path = sys.argv[1] + "/*." + sys.argv[2]img_suffix = sys.argv[2]img_size_width = int(sys.argv[3])img_size_height = int(sys.argv[4])for infile in glob.glob(img_path):    f, e = os.path.splitext(infile)    outfile = f + "_" + str(img_size_width) + "." + img_suffix    im = PIL.Image.open(infile)    im_out = im.resize((img_size_width, img_size_height))    im_out.save(outfile)
复制代码


发布于: 刚刚阅读数: 5
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;

评论

发布
暂无评论
Python案例分析|使用Python图像处理库Pillow处理图像文件_Python_TiAmo_InfoQ写作社区