我可以在不将图像完全加载到内存的情况下裁剪图像吗?

我可以在不将图像完全加载到内存的情况下裁剪图像吗?

我设法生成了一个带有分形的 PNG 图像。

该图像高 65,536 像素,宽 65,536 像素。它太大了,无法解码到内存中并显示。它可能在边界附近有很多未使用的空间,我想修剪它以显着减少它的面积。

我尝试了 GIMP 和 GraphicsMagick,但是 GIMP 冻结了我的计算机,而 GraphicsMagick 无法为图像分配足够的内存。

我使用 Linux,有 16GB RAM。压缩后的图像大小为 6.2MB。

我不将图像完全加载到内存中就可以修剪边框吗?

不管怎样,我最终使用了学校的服务器,但我仍然想知道答案。

答案1

您已经知道图像的笛卡尔定义。

考虑一些 Python 代码来以合理大小的缓冲区负载读取文件 - 每个缓冲区选择一行或多行图像像素,但就内存可用性而言足够少。

在大多数像素线上,最左边和最右边的“边界”像素可以被丢弃。前几条和最后几条“边界”线也同样如此。

根据定义,输出文件的缓冲区大小可以与输入文件的缓冲区大小不同。

答案2

ImageMagick 的“裁剪”过滤器应该能够有效地做到这一点。

https://www.imagemagick.org/Usage/crop/

理论上来说,你想要实现的目标肯定是可以实现的。问题只是找到一个可以真正做到这一点的应用程序。

请记住,尺寸为 65536 x 65536、具有 24 位色彩的图像将消耗大约 12Gb 的 RAM - 因此实际上它可以装入内存中。

如果是 32 位颜色,则大约需要 17Gb,但即便如此,您也可以将整个图像加载到 RAM 中 - Linux 会将内存溢出到 sawp 文件中。这很慢,性能也不会很好,但实际上不会失败 - 除非您用完了交换空间,否则它只会慢慢成功。

相关内容