Python有什么方法可以直接从图像(如果可能的话压缩格式)中直接获取(只获取,不修改)单个像素(以获取其RGB颜色),而无需将其加载到RAM中或处理它(以节省CPU )?
更多细节:
我的应用程序有一个庞大的图像数据库,而且只有图像。
所以我选择的是直接将图像存储在硬盘上,这样可以避免 DBMS 的额外工作量。
但是我想进行更多优化,我想知道是否有一种方法可以直接访问图像中的单个像素(我的应用程序对图像执行的唯一操作),而无需将其加载到内存中。
PIL 像素访问是否允许这样做?还是有其他方法?
图像的编码是我自己的选择,所以我可以随时更改。目前我正在使用PNG或JPG。我也可以以原始格式存储,但如果可能的话,我更愿意将图像压缩一点。但我认为硬盘驱动器比 CPU 和 RAM 便宜,所以即使图像必须保持 RAW 才能做到这一点,我认为它仍然是一个更好的选择。
谢谢你。
更新
因此,正如我所担心的那样,似乎不可能使用可变压缩格式,例如 PNG。
我想完善我的问题:
- 是否有一个恒定的压缩格式(不一定特定于图像格式,我将以编程方式访问它),它允许通过读取标题来访问任何部分?
- 从技术上讲,如何使用 Python 有效地(阅读:快速且非阻塞)访问文件中的字节?
解决方案
多亏了大家,我已经成功地实现了我描述的功能,方法是在每一行上使用游程编码,并将每一行填充到与最大行相同的长度。
这样,通过为每行准备一个描述固定列数的标题,我可以先使用 file.readline() 轻松访问该行以获取标题数据,然后使用 file.seek(headersize + fixedsize*y, 0 ) 其中 y 是当前选定的行。
文件被压缩,在内存中我只获取一行,我的应用程序甚至不需要解压缩它,因为我可以通过迭代每个 RLE 值来计算像素的确切位置。所以在 CPU 周期上也很容易。