python - 如何仅使用标准库在 Python 中读取任意图像文件格式(PNG、JPEG、TIFF、BMP)?
问题描述
我是一位经验丰富的 Python 程序员,拥有丰富的图像处理和计算机视觉经验。我非常熟悉所有标准工具,例如PIL
、Pillow
、opencv
、numpy
和scikit-image
。
如果我只有标准库可以使用,我将如何将图像读入 Python 数据格式,如嵌套列表、字节数组或类似格式?
我意识到不同的图像格式有不同的规格。我的问题是我什至如何开始构建一个读取任何给定格式的函数。
注意Python 2.6jpeg
在标准库中有一个模块,该模块已被弃用。我们不讨论它,因为它不受支持。
解决方案
如果您询问如何“从头开始”实现这些格式(因为标准库不这样做),那么格式规范就是一个很好的起点。
对于 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比较棘手。该文件不存储像素,而是将“小波”转换为您在屏幕上看到的像素图。要阅读此格式,您需要实现此转换功能。
推荐阅读
- java - 键盘出现时使整个布局变小
- c# - 以 xamarin 形式捕获照片
- android - 在 Android Studio 3.5.3 中构建时仅生成 -debug.apk 文件
- c++ - constexpr 指向 C++17 中的 constexpr 静态成员的指针
- flutter - 带有 Flutter 包的 Web 功能:mapbox_gl
- arrays - Flutter如何在堆栈中显示图像
- gnu-make - 使用 gnu make 的给定项目的最佳并行性
- objective-c - 使用(Apple 登录)获取用户的照片 URL
- python-3.x - 赋值操作 Python
- python - 如何从python中的连接字符串中提取有意义和频繁的单词?