![我可以在不将图像完全加载到内存的情况下裁剪图像吗?](https://linux22.com/image/1588129/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%B8%8D%E5%B0%86%E5%9B%BE%E5%83%8F%E5%AE%8C%E5%85%A8%E5%8A%A0%E8%BD%BD%E5%88%B0%E5%86%85%E5%AD%98%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%A3%81%E5%89%AA%E5%9B%BE%E5%83%8F%E5%90%97%EF%BC%9F.png)
我设法生成了一个带有分形的 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 文件中。这很慢,性能也不会很好,但实际上不会失败 - 除非您用完了交换空间,否则它只会慢慢成功。