首页 > 解决方案 > 如何仅使用标准库在 Python 中读取任意图像文件格式(PNG、JPEG、TIFF、BMP)?

问题描述

我是一位经验丰富的 Python 程序员,拥有丰富的图像处理和计算机视觉经验。我非常熟悉所有标准工具,例如PILPillowopencvnumpyscikit-image

如果我只有标准库可以使用,我将如何将图像读入 Python 数据格式,如嵌套列表、字节数组或类似格式?

我意识到不同的图像格式有不同的规格。我的问题是我什至如何开始构建一个读取任何给定格式的函数。

注意Python 2.6jpeg在标准库中有一个模块,该模块已被弃用。我们不讨论它,因为它不受支持。

标签: pythoncomputer-vision

解决方案


如果您询问如何“从头开始”实现这些格式(因为标准库不这样做),那么格式规范就是一个很好的起点。

对于 PNG,这是https://www.w3.org/TR/2003/REC-PNG-20031110/。它定义了 PNG 流的组成,由签名(8 个字节,8950 4e47 0d0a 1a0a,将文件标识为 PNG 图像)和一些包含元数据、调色板信息和图像本身的数据块组成。(如果你真的不想使用现有的库,这肯定是一个需要承担的重大项目,但也不过分。)

对于 BMP,它更容易一些,因为文件已经包含未压缩的像素数据,您只需要知道如何找到大小和偏移量;一些格式定义在维基百科(https://en.wikipedia.org/wiki/BMP_file_format)和这里:http ://www.digicamsoft.com/bmp/bmp.html

JPG比较棘手。该文件不存储像素,而是将“小波”转换为您在屏幕上看到的像素图。要阅读此格式,您需要实现此转换功能。


推荐阅读