python - img2pdf AlphaChannelError:删除 alphachannel 的最佳方法是什么
问题描述
我有一组图像,我通过以下代码从中创建 pdf
with io.BytesIO() as tmp_io:
tmp_io.write(img2pdf.convert(img_file_paths))
result_bytes = tmp_io.getvalue()
其中一个文件包含 alpha 通道,我得到了
raise AlphaChannelError("拒绝处理带有 alpha 通道的图像")
删除 alpha 通道并保存到 pdf rgb 通道的最简单方法是什么?
解决方案
这是我自己的有点丑陋的解决方案
def remove_alpha_from_image(image_path):
im = Image.open(image_path)
im.load()
try:
background = Image.new("RGB", im.size, (255, 255, 255))
background.paste(im, mask=im.split()[3]) # 3 is the alpha channel
im = background
except IndexError: # img is not RGBA
pass
name_hash_md5 = md5(bytes(image_path, encoding="utf-8")) # noqa: S303
name = name_hash_md5.hexdigest()
if not os.path.exists(TMP_DIR):
os.makedirs(TMP_DIR)
path = f"{TMP_DIR}{name}.pdf"
im.save(path, "PNG", resolution=100.0)
return path
with io.BytesIO() as tmp_io:
try:
tmp_io.write(img2pdf.convert(file_paths))
except img2pdf.AlphaChannelError:
tmp_io.write(img2pdf.convert([remove_alpha_from_image(path) for path in file_paths]))
result_bytes = tmp_io.getvalue()
推荐阅读
- mysql - 如何在 laravel 中使用 FIND_IN_SET 获取最后更新的记录?
- functional-programming - 使用 lodash(或 ramda)拆分/嵌套 _.flow
- java - 如何将平面 JSON 转换为分层 java 类?
- ios - 如何在 Swift 中从 SKScene 呈现 UiView
- html - 百分比填充不响应浏览器宽度
- matlab - 更改鼠标单击滚动的滑块跳跃大小
- c# - 是否应该在 Web 应用程序中禁用实体框架延迟加载?
- amazon-web-services - 如何修复漂移的 AWS CloudFormation 堆栈?
- reactjs - 处理来自 GraphQL 查询(带有片段)响应的数据?
- sql-server - 计算带有条件的大型 SQL Server 表中总行数的最快方法是什么