ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

thumbor 的 strip_exif 过滤器:按需移除输出图片 EXIF 元数据

thumbor 的 strip_exif 过滤器:按需移除输出图片 EXIF 元数据 后端图像处理【免费下载链接】thumborthumbor is an open-source photo thumbnail service by globo.com项目地址https://gitcode.com/gh_mirrors/th/thumbor点击查看免费下载导读strip_exif是 thumbor 内置图片过滤器之一用于在图片处理管线中移除最终输出图片携带的全部 Exif 元数据拍摄参数、GPS、设备信息等同时支持通过配置单独保留版权信息。本文基于 docs/strip_exif.rst 展开结合过滤器实现、PIL 引擎源码与测试用例说明其用法、调用链、与PRESERVE_EXIF_INFO/PRESERVE_EXIF_COPYRIGHT_INFO两个配置项的配合逻辑以及如何在 URL 中与其他过滤器组合使用。过滤器概述用途Usage该过滤器在请求 URL 中以strip_exif()形式调用不需要任何参数strip_exif()它的作用是移除输出结果图片中的任何 Exif 信息。在 thumbor/filters/strip_exif.py 中过滤器实现非常简洁——核心逻辑只是把调用转发给当前引擎from thumbor.filters import BaseFilter, filter_method class Filter(BaseFilter): filter_method() async def strip_exif(self): self.engine.strip_exif()这里的filter_method()装饰器负责将类方法注册为可通过 URL 调用的过滤器动作因此 URL 中写filters:strip_exif()时thumbor 会解析出strip_exif并异步执行该方法。它定义于 thumbor/filters/init.py 的BUILTIN_FILTERS内置过滤器列表中开箱即用无需额外加载。典型应用场景隐私保护Exif 中常含 GPS 位置、相机序列号、拍摄时间等敏感信息缩略图对外分发前需要剔除减小体积Exif 块会占用若干 KB 的空间thumbor/config.py 中PRESERVE_EXIF_INFO的说明明确指出保留 Exif 会增加图片体积KB 级请谨慎使用对大量小图标、头像场景移除 Exif 有助于瘦身覆盖全局配置若服务端已开启PRESERVE_EXIF_INFO True希望全局保留 Exif但某些路径例如图标仍希望去除可在该 URL 上单独追加filters:strip_exif()覆盖全局行为这正是文档强调的使用价值。与全局配置的配合版权信息的保留文档明确指出若想保留版权信息需要将配置PRESERVE_EXIF_COPYRIGHT_INFO设为True。这一行为在两个配置项配合下生效均在 thumbor/config.py 中定义默认值均为False配置项默认值说明PRESERVE_EXIF_INFOFalse在生成的图片中保留完整的 Exif 信息会增加图片体积KB 级谨慎使用PRESERVE_EXIF_COPYRIGHT_INFOFalse在生成的图片中保留 Exif 版权信息对应的注释也出现在官方默认配置模板 thumbor/thumbor.conf 中## Preserves exif information in generated images. Increases image size in ## kbytes, use with caution. PRESERVE_EXIF_INFO False保存时的实际判定逻辑源码级要理解strip_exif()与这两个配置项的关系需要看图片保存环节的实现。在 PIL 引擎 thumbor/engines/pil.py 的保存流程中if self.icc_profile is not None: options[icc_profile] self.icc_profile if ( self.context.config.PRESERVE_EXIF_COPYRIGHT_INFO is True and self.image.info.get(exif) is not None ): exif_copyright self.get_exif_copyright() if exif_copyright is not None: options[exif] exif_copyright if self.context.config.PRESERVE_EXIF_INFO: if self.exif is not None: options[exif] self.exif也就是说thumbor 在保存输出图片时根据两个配置项决定是否向编码器传入exif选项PRESERVE_EXIF_COPYRIGHT_INFO True且原图带有 Exif 时仅提取版权字段写入输出通过get_exif_copyright()/extract_copyright_from_exif()见 thumbor/engines/pil.py其内部使用piexif解析并抽取版权标签PRESERVE_EXIF_INFO True时则把引擎内存中缓存的完整 Exifself.exif写回输出。而strip_exif()的作用正是把引擎内缓存的 Exif 置空见 thumbor/engines/pil.pydef strip_exif(self): self.exif None引擎在create_image()加载原图时会把img.info.get(exif)缓存到self.exifthumbor/engines/pil.py。调用strip_exif()后该缓存被清空于是即便开启了PRESERVE_EXIF_INFO True保存时self.exif is not None的判断也会失败完整 Exif 不再写回——这正是全局保留、局部剔除的实现原理。版权信息为何还能保留因为版权信息的写入依据是self.image.info.get(exif)原图对象仍持有 Exif而非引擎缓存的self.exif所以strip_exif()清空的是引擎缓存而版权提取走的是另一条数据路径。因此仅PRESERVE_EXIF_COPYRIGHT_INFO True时filters:strip_exif()会剔除其余 Exif但版权标签仍被保留仅PRESERVE_EXIF_INFO True时filters:strip_exif()会剔除全部 Exif包括版权两个配置同时开启时PRESERVE_EXIF_INFO分支写完整 Exif与PRESERVE_EXIF_COPYRIGHT_INFO分支写版权会先后执行后写者覆盖前者最终结果由配置优先级与执行顺序决定实际使用时建议按需求只开启其一。测试用例佐证仓库中 tests/handlers/test_base_handler_keeping_exif_copyright_tags.py 用真实请求验证了这套行为PRESERVE_EXIF_COPYRIGHT_INFO False、PRESERVE_EXIF_INFO False时请求/unsafe/filters:strip_exif()/thumbor-exif.png最终输出图片的exif信息为null对应test_should_not_return_exif_copyright_tags_with_copyright_tagsPRESERVE_EXIF_COPYRIGHT_INFO True时同样 URL 请求最终输出图片仍带有exif 版权信息对应test_should_return_exif_copyright_tags无版权标签的普通图片/unsafe/20x20.jpg即使开启保留版权配置输出也没有 Exif对应test_should_not_return_exif_copyright_tags。这组用例以端到端方式印证了文档描述strip_exif()移除 Exif而版权信息是否幸存取决于PRESERVE_EXIF_COPYRIGHT_INFO配置。另外tests/engines/test_pil.py 等引擎级测试也覆盖了相关元数据剥离逻辑。调用链与多引擎支持strip_exif的完整调用链如下URL: filters:strip_exif() - thumbor.filters.strip_exif.Filter.strip_exif() # [thumbor/filters/strip_exif.py] - engine.strip_exif() # 转发给当前引擎 - PIL 引擎: self.exif None # [thumbor/engines/pil.py#L565-L566]在引擎抽象基类 thumbor/engines/init.py 中strip_exif()被声明为空实现pass说明该能力是引擎可选特性引擎可以不实现不抛异常实现引擎则按各自方式处理。当前仓库的 PIL 引擎将其实现为清空缓存的 Exif。同时JSON 引擎 thumbor/engines/json_engine.py 通过委托模式支持该过滤器def strip_exif(self): return self.engine.strip_exif()这意味着在多引擎组合如 JSON 引擎包装底层真实引擎的场景下strip_exif()也能正常透传到底层引擎执行过滤器无需关心具体引擎实现。使用示例文档给出的完整请求示例基于本地默认端口 8888 的服务http://localhost:8888/unsafe/filters:strip_exif()/http://www.arte.tv/static-epgapi/057460-011-A.jpgURL 结构拆解段含义http://localhost:8888thumbor 服务地址默认端口 8888unsafe未签名模式未配置安全密钥时使用生产环境应改为签名 URLfilters:strip_exif()过滤器声明filters:后跟过滤器名与参数括号http://www.arte.tv/...jpg待处理的原始图片地址HTTP 加载器抓取注意在 RST 源文档docs/strip_exif.rst中示例写作filters:strip\_exif()其中\_是 RST 对下划线的转义实际请求 URL 中应为filters:strip_exif()。由于该过滤器无参数括号内必须为空任何向括号内传参的写法都不会匹配该过滤器的方法签名。与其他过滤器的组合filters:支持在同一 URL 中串联多个过滤器用逗号分隔。例如在去除 Exif 的同时去掉 ICC 色彩配置strip_icc可以写http://localhost:8888/unsafe/filters:strip_exif(),strip_icc()/http://example.com/image.jpgstrip_icc与strip_exif同属内置过滤器见 thumbor/filters/init.py其引擎实现为将self.icc_profile置空thumbor/engines/pil.py。两者配合可用于生成零元数据的最小体积缩略图。过滤器执行顺序即 URL 中书写顺序因此建议把strip_exif()放在靠前位置确保后续处理如重新编码基于已剥离元数据的图片进行。注意事项与最佳实践签名 URL生产环境应使用安全密钥对 URL 签名将unsafe替换为签名串避免过滤器被滥用开发调试可使用unsafe。配置默认值PRESERVE_EXIF_INFO与PRESERVE_EXIF_COPYRIGHT_INFO默认均为False即默认情况下 thumbor 本就不会保留 Exifstrip_exif()更多用于全局开启保留、局部剔除的覆盖场景如文档所述例如用于图标图片。版权信息取舍需要保留作者版权时开启PRESERVE_EXIF_COPYRIGHT_INFO需要彻底清除隐私元数据时确保该配置为False且不开启PRESERVE_EXIF_INFO。体积收益Exif 块常达数 KB批量生成图标、头像时移除 Exif 可减少存储与传输成本对质量敏感的原图缩略场景收益相对有限应按需使用。综上strip_exif()是一个零参数、零依赖的内置过滤器通过一行 URL 即可实现 Exif 元数据的按需剥离并与PRESERVE_EXIF_COPYRIGHT_INFO配置形成剥离全部 / 仅留版权的精细控制能力。赞分享后端图像处理【免费下载链接】thumborthumbor is an open-source photo thumbnail service by globo.com项目地址https://gitcode.com/gh_mirrors/th/thumbor点击查看免费下载相关推荐thumbor quality 过滤器quality filter实战指南JPEG 输出质量的按需控制thumbor quality 过滤器quality filter实战指南JPEG 输出质量的按需控制 导读 thumbor 的 quality 过滤器后端图像处理thumbor format 过滤器通过 URL 强制指定输出图片格式的完整指南thumbor format 过滤器通过 URL 强制指定输出图片格式的完整指南 导读 thumbor 是一款开源的图片缩略服务其过滤器Filter机制后端图像处理thumbor max_bytes 过滤器实战让输出图片体积强制压缩到指定字节数以下thumbor max_bytes 过滤器实战让输出图片体积强制压缩到指定字节数以下 导读 max_bytes 是 thumbor 内置的图片体积控制过滤器后端图像处理上一篇GB/T 7714-2015 参考文献自动化排版全攻略从痛点到落地的完整解决方案下一篇全能解析AcFunDown视频下载工具深度应用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表