如何仅使用标准库以Python读取任意图像文件格式(PNG,JPEG,TIFF,BMP)?

时间:2018-08-25 15:26:53

标签: python computer-vision

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

对于BMP,这有点容易,因为该文件已经包含未压缩的像素数据,并且您只需要知道如何查找大小和偏移量即可;一些格式定义在Wikipedia(https://en.wikipedia.org/wiki/BMP_file_format)上,在这里:http://www.digicamsoft.com/bmp/bmp.html

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