尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Pillow 8.0.0 迁移指南与新增 API 深度解读:绘图、文本布局与图像处理能力升级

Pillow 8.0.0 迁移指南与新增 API 深度解读:绘图、文本布局与图像处理能力升级 Pillow 8.0.0 迁移指南与新增 API 深度解读绘图、文本布局与图像处理能力升级【免费下载链接】PillowPython Imaging Library (fork)项目地址: https://gitcode.com/gh_mirrors/pi/Pillow导读Pillow 8.0.0 是 Python 影像库Pillow在 2020 年发布的一个重要版本它一方面清理了一批长期废弃的旧接口如fromstring/tostring系列、im.offset标志着 Python 3.5 与 PyPy3 7.1.x 时代正式结束另一方面为ImageDraw文本排版带来了anchor、textlength、textbbox、embedded_color等一批至今仍在使用的核心 API并新增了Image.open(formats...)、ImageOps.autocontrast(mask...)等实用能力。读完本文你将完整掌握从旧接口迁移到 8.0.0 的全部改动清单并能在实际项目中直接使用这些新 API 完成精确文本排版、正多边形绘制与可控的图像对比度增强。一、版本概览一次面向未来兼容性的清理8.0.0 发布说明docs/releasenotes/8.0.0.rst的主体结构分为四块向后不兼容变更Backwards incompatible changes、API 行为变更API changes、新增 APIAPI additions与其他变更Other changes。整体基调是清理旧包袱、夯实文本与绘图能力没有引入新的文件格式而是把ImageDraw的文本布局推向可精确测量、可锚定定位、可渲染彩色字体的成熟状态。支持范围调整告别 Python 3.5 与 PyPy3 7.1.x项目变化Python 3.5停止支持该版本已于 2020-09-13 到达生命周期终点EOLPyPy3 7.1.1停止支持最低兼容版本提升为 2019-10-14 发布的 PyPy3 7.2.0这意味着若你的部署环境仍停留在上述解释器版本升级 Pillow 8.0.0 之前必须先升级 Python 运行时。从 8.0.0 起Pillow 的持续集成与特性开发都建立在 Python 3.6 之上后续版本也延续了跟随上游解释器 EOL 节奏的维护策略。二、向后不兼容变更升级前必须改写的旧接口8.0.0 移除的接口都有一个共同特征早已在新版本中存在等价的、命名更规范的替代 API。迁移本身并不复杂但遗漏会导致AttributeError或ImportError因此建议在升级后用一条全量测试命令如pytest Tests/扫一遍存量代码。1.im.offset()移除im.offset()Image 实例方法已被删除请改用 ImageChops.offset()。两者功能一致按给定像素距离平移图像超出的部分循环回卷到另一侧。from PIL import Image, ImageChops im Image.open(hopper.png) # 旧写法8.0.0 起报 AttributeError # shifted im.offset(20, 10) # 新写法 shifted ImageChops.offset(im, 20, 10)注意ImageChops.offset是模块级函数第一个参数是图像对象本身。2.fromstring/tostring系列移除三个旧接口被一次性清除统一收敛到frombytes/tobytes命名对应源码 Image.py已移除8.0.0 起不可用替代 APIImage.fromstring()Image.frombytes()im.fromstring()Image.frombytes()Image 实例方法im.tostring()Image.tobytes()Image 实例方法from PIL import Image # 旧写法Image.fromstring(mode, size, data) # 新写法 im Image.frombytes(RGB, (128, 128), raw_bytes) # 旧写法im.tostring() # 新写法 raw_bytes im.tobytes()3.ImageCms.CmsProfile属性重命名色彩管理模块ImageCms.py中CmsProfile对象的若干属性被重命名主要动机是旧属性返回的是定宽字节串padded bytes新属性返回去填充的 Unicode 字符串或语义更明确的名称便于直接处理。已移除属性替代属性差异说明color_spacexcolor_space定宽填充 → 去填充pcsconnection_space名称更直白连接空间product_copyrightcopyright字节串 → Unicodeproduct_descprofile_description字节串 → Unicodeproduct_descriptionprofile_description统一为一个属性product_manufacturermanufacturer字节串 → Unicodeproduct_modelmodel字节串 → Unicodefrom PIL import ImageCms profile ImageCms.get_display_profile() # 旧写法profile.product_description # 新写法返回 str可直接打印/比较 print(profile.profile_description)三、API 行为变更文本绘制修正与 MIME 注册1.ImageDraw.text的stroke_width偏移问题修复此前向ImageDraw.text()传入非零stroke_width描边宽度时文本会被整体偏移与该值相同的像素量导致描边文本与预期位置错位。8.0.0 修复了该问题使描边文本与普通文本的基准定位一致。相关实现位于 ImageDraw.py 的text方法中——描边文本与主体文本共用同一套位置计算先以stroke_ink绘制描边层再绘制正常文本层。2.ImageDraw.text的anchor参数正式实现anchor参数此前虽在签名中存在但未被真正实现8.0.0 起可实际使用。它用于控制文本相对指定xy点的对齐方式取值由水平方向left /middle /right与垂直方向ascender /top /middle /baseline /descender组合而成例如la左下角以(x, y)为锚点文本左边缘对齐 x基线对齐 ymm文本中心以(x, y)为锚点rt右上角对齐。from PIL import Image, ImageDraw, ImageFont im Image.new(RGB, (200, 100), white) draw ImageDraw.Draw(im) font ImageFont.truetype(Tests/fonts/FreeMono.ttf, 16) # 以 (100, 50) 为中心绘制文本 draw.text((100, 50), Pillow 8.0, fontfont, anchormm, fillblack)配合下方介绍的textbboxanchor可以实现任意文本的精确居中、右对齐等排版需求其锚点语义在文档中被集中定义为text-anchors一节。3. PSD 插件注册 MIME 类型PsdImagePluginPsdImagePlugin.py的PsdImageFile现在注册了正式 MIME 类型image/vnd.adobe.photoshop。这意味着通过Image.registered_extensions()或依赖 MIME 嗅探的工具链可以正确识别 PSD 文件。四、新增 API更可控的打开、对比度与多边形绘制1.Image.open新增formats参数Image.open()新增第三个参数formats用于限制尝试解码的文件格式集合可显著减少格式嗅探开销并在存在多义文件头时消除歧义源码见 Image.py#L3591-L3640传入列表或元组只在这些格式中尝试打开传入None尝试所有已注册格式默认行为传入其他类型抛出TypeErrorformats must be a list or tuple。from PIL import Image # 只尝试 PNG 与 JPEG避免其他插件参与嗅探 im Image.open(hopper.jpg, formats(PNG, JPEG))查询当前解释器实际可用的全部格式可以运行python3 -m PIL或在代码中调用PIL.features.pilinfo()打印格式清单。2.ImageOps.autocontrast新增mask参数与cutoff元组对比度自动拉伸函数autocontrast源码见 ImageOps.py#L79-L169在本版本获得两项增强1mask参数直方图只统计掩膜mask区域内的像素。默认None时统计整幅图像。其实现位于ImageOps.autocontrast的直方图计算处——image.histogram(mask)直接把掩膜传入底层直方图计算因此掩膜像素值非零的区域才会被计入统计。from PIL import Image, ImageOps im Image.open(hopper.jpg).convert(L) mask Image.new(L, im.size, 0) # 全黑掩膜 draw_mask ImageDraw.Draw(mask) draw_mask.rectangle((30, 30, 98, 98), fill255) # 只统计中心区域 # 基于掩膜区域计算对比度 auto ImageOps.autocontrast(im, maskmask)2cutoff支持(low, high)元组此前cutoff只能是单个数值同时从直方图低端和高端各截掉该百分比现在可以传二元组分别指定两端截断比例。实现上当检测到cutoff不是元组时自动展开为(cutoff, cutoff)随后对直方图低端、高端分别执行逐桶截断见 ImageOps.py#L122-L149# 低端截 2%高端截 5% auto ImageOps.autocontrast(im, cutoff(2, 5))3.ImageDraw.regular_polygon内接正多边形绘制新增的regular_polygon()方法源码见 ImageDraw.py#L367-L378可在给定外接圆内绘制任意边数的正多边形bounding_circle外接圆形式为(x, y, r)或((x, y), r)即圆心坐标加半径n_sides边数如3为三角形、5为五边形、6为六边形rotation可选旋转角度度fill/outline/width与polygon相同的填充、描边与线宽语义。文档中的经典示例draw.regular_polygon(((100, 100), 50), 5)绘制一个以(100, 100)为圆心、多边形外接圆半径50的正五边形。其顶点由模块级辅助函数_compute_regular_polygon_verticesImageDraw.py#L864计算——先按极坐标求出每个顶点的角度再用旋转公式X x·cos(φ) y·sin(φ) centroid_x、Y −x·sin(φ) y·cos(φ) centroid_y围绕质心展开成顶点列表最终复用底层polygon渲染。from PIL import Image, ImageDraw im Image.new(RGB, (200, 200), white) draw ImageDraw.Draw(im) # 正五边形圆心 (100, 100)半径 50 draw.regular_polygon(((100, 100), 50), 5, outlineblack, width3) # 正八边形带 15° 旋转 draw.regular_polygon(((100, 100), 70), 8, rotation15, outlinered) im.show()上图是仓库测试套件中用于校验regular_polygon输出的基准图正八边形示例对应测试见 Tests/test_imagedraw.py。五、文本排版新能力精确测量与彩色内嵌字体8.0.0 对ImageDraw文本体系的增强是本次发布的重头戏共新增三组方法源码均位于 ImageDraw.py字体侧对应 ImageFont.py。1.textlength与FreeTypeFont.getlength1/64 像素精度的文本宽度两个新方法返回文本的精确前进宽度advance width精度为 1/64 像素可替代此前的粗略估算from PIL import Image, ImageDraw, ImageFont im Image.new(RGB, (400, 100), white) draw ImageDraw.Draw(im) font ImageFont.truetype(Tests/fonts/FreeMono.ttf, 24) width draw.textlength(Hello Pillow 8.0, fontfont) print(f文本宽度: {width} 像素) # 逐字符累计实现手动换行 x 0 for ch in Hello Pillow 8.0: draw.text((x, 10), ch, fontfont, fillblack) x draw.textlength(ch, fontfont)ImageFont.FreeTypeFont.getlength是同一能力的字体对象侧入口二者精度一致1/64 像素适合做逐词折行word-wrap或分段渲染。2.textbbox/multiline_textbbox/FreeTypeFont.getbbox文本包围盒三个方法返回渲染文本的包围盒bounding box即(left, top, right, bottom)四元组且接受与text一致的anchor参数box draw.textbbox((100, 50), Pillow 8.0, fontfont, anchormm) print(f包围盒: {box})由此可先测量、后绘制实现围绕文本画矩形框或文本垂直居中等效果。multiline_textbbox与multiline_text配套额外支持spacing与alignleft/center/right。从实现看这些测量方法基于同一个ImageText.Text排版引擎见 ImageDraw.py#L685-L737绘制与测量共用一套字形数据因此返回值与实际渲染结果一致。3.embedded_colorTrue渲染内嵌彩色字体text与multiline_text新增embedded_color参数支持渲染字体文件内嵌的彩色位图数据适用于 emoji 等彩色字体。各字体技术的支持前提取决于构建期 FreeType 版本与 libpng字体技术最低要求CBDTGoogle 彩色位图字体FreeType 2.5 且编译了 libpngSBIXApple 彩色位图字体FreeType 2.5.1 且编译了 libpngCOLR微软彩色矢量字体FreeType 2.10SVG 内嵌彩色字体暂不支持draw.text((10, 10), Pillow , fontcolor_font, embedded_colorTrue)仓库测试资源中即包含 CBDT 与 SBIX 字体样本见 Tests/fonts/CBDTTestFont.ttf、Tests/fonts/chromacheck-sbix.woff 及对应的测试输出图 Tests/images/cbdt.png、Tests/images/chromacheck-sbix.png可用于本地验证。4. 附带修复多行对齐与内嵌位图 TrueType 字体修复了text/multiline_text在部分场景下的意外对齐问题multiline_text的align参数在更多情况下给出正确结果TrueType 字体内嵌的位图embedded bitmaps现在得到支持小字号场景下可直接使用字体自带的位图字形避免矢量缩放导致的模糊。六、椭圆绘制算法改进类 Bresenham 平滑曲线ImageDraw.ellipse的底层算法从绘制 360 边形改为近似 Bresenham 圆算法更快的绘制速度且对小尺寸椭圆产生更平滑的曲线360 边多边形在椭圆较小时会明显呈棱角状。该改动位于底层绘图核心 src/libImaging/Draw.cImageDraw层无需任何改动即自动受益。上图为测试套件中不同尺寸椭圆的渲染参考图Tests/test_imagedraw.py 对应用例可见小尺寸椭圆边缘也更圆润。七、其他变更EXIF、BMP 安全与文档体验1. 支持写入 subIFD如 GPS IFD保存 EXIF 数据时Pillow 现在能正确写入子 IFDsubIFD典型代表是 GPS IFD。当使用图像自带的 EXIF 数据原样保存例如经ImageOps.exif_transpose处理后保存时会自动生效。此前实现存在缺陷子 IFD 的第一个标签的代码值被错误地当作偏移量写入导致 GPS 等元数据损坏。2. BMP 大文件报错改为DecompressionBombError此前 BMP 文件尺寸过大时抛出的是OSError8.0.0 起与 PNG、JPEG 等其他格式保持一致统一抛出DecompressionBombError便于上层用统一的解压炸弹防护逻辑拦截异常输入。这属于安全相关的行为统一相关防护机制可参考 src/PIL/Image.py 中的MAX_IMAGE_PIXELS检查路径。3. 文档深色主题官方文档站启用了prefers-color-schemeCSS 媒体查询当系统请求深色外观时文档自动切换为深色主题无需手动切换。八、升级迁移清单与参考资料升级前检查清单确认解释器版本 ≥ Python 3.6PyPy3 ≥ 7.2.0全文搜索并替换fromstring、tostring、.offset(、product_description等已移除接口若依赖ImageCms.CmsProfile旧属性注意返回值从字节串变为 Unicode 字符串升级后运行pytest Tests/或项目自身测试套件做回归。可继续深入阅读的仓库路径发布说明原文docs/releasenotes/8.0.0.rst后续补丁版 8.0.1.rst、8.0.2.rst 亦记录了本版本的回归修复Image.open(formats...)实现src/PIL/Image.py#L3591-L3640autocontrast(mask, cutoff)实现src/PIL/ImageOps.py#L79-L169regular_polygon/textlength/textbbox/embedded_color实现src/PIL/ImageDraw.py字体测量方法getlength/getbboxsrc/PIL/ImageFont.pyPSD MIME 注册src/PIL/PsdImagePlugin.py文本相关回归测试Tests/test_imagedraw.py、Tests/test_imagefont.py总而言之Pillow 8.0.0 的发布说明覆盖了废弃清理—行为修正—能力新增—底层优化四个维度对存量用户而言迁移集中在少数几个改名接口对文本渲染与绘图用户而言anchor、textlength、textbbox、regular_polygon、embedded_color构成了可精确控制排版与绘图的完整工具箱这些 API 至今仍是 Pillow 文本处理的事实标准接口。【免费下载链接】PillowPython Imaging Library (fork)项目地址: https://gitcode.com/gh_mirrors/pi/Pillow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表