我正在处理一个 JPEG 压缩的大型多页 TIFF 文件,我需要从中删除一页。我正在使用 tifffile Python 包来处理 TIFF,并且我已经根据与该页面关联的元数据标签知道要删除哪个页面。我当前的方法是读取所有页面,修改目标页面(通过跳过或替换它),然后将其余部分写回新的 TIFF 文件。
这是我迄今为止尝试过的:
import tifffile
with tifffile.TiffFile('file') as tif:
for i, page in enumerate(tif.pages):
if some condition with tags is true:
# Skip the page to delete or replace with a dummy page
image_data = page.asarray(memmap=True) # Memory-mapped access to the page's data
# Write the page to the output file
writer.write(
image_data,
compression='jpeg',
photometric=page.photometric,
metadata=page.tags,
)
但是,这种方法有几个问题:
内存使用:处理大文件会消耗几乎所有可用内存(我有32GB RAM,但它最多使用28GB),这使得处理大文件不可行。
压缩问题:LZW、ZSTD 和 JPEG 等不同的压缩方法会创建大小截然不同的文件,有些比原始文件大得多。
性能:使用条带或分块等方法会导致处理速度非常慢,删除单个页面需要很长时间。
输出文件大小:使用不同的压缩方法时输出文件的大小太大了! (JPEG 上 3GB 输入到 LZW 上 50GB+ 输出)
Python 有没有什么方法可以有效地从大型多页 TIFF 文件中删除单个页面,而不消耗太多内存或花费很长时间?我见过一些 .NET 包可以就地删除页面——Python 有类似的解决方案吗?
我创建了一个 Python 包来处理它。虽然它可以变得更具可扩展性,但它可以有效地解决问题,而无需将所有图像数据加载到内存中。
核心理念:
该软件包的工作原理是:
安装: 您可以直接从 PyPI 安装该软件包:
pip install tiff-wsi-label-removal
用途: 安装后,您可以使用
remove-label
命令行工具从 TIFF 文件中删除标签:
bash
remove-label <input_tiff_file> <output_tiff_file>
当前的局限性和未来的工作:
该软件包功能齐全,但仍有改进的空间,包括使其更具可扩展性。
来自此处评论的建议和其他计划的功能正在包的 PyPI 页面的描述中进行跟踪。
欢迎任何反馈!