如何使用 Rust Image crate 避免 "InsufficientMemory" 解码错误?

How to avoid "InsufficientMemory" decoding error using Rust Image crate?

我正在尝试使用 Rust 读取 8K 32 位 OpenEXR HDR 文件。 使用 Image crate 读取文件:

use image::io::Reader as ImageReader;

let img = ImageReader::open(r"C:\Users\Marko\Desktop\HDR_Big.exr")
    .expect("File Error")
    .decode()
    .expect("Decode ERROR");

这导致 Decode ERROR: Limits(LimitError { kind: InsufficientMemory })

读取 4K 或更小的文件工作正常。

我认为缓冲会有帮助,所以我尝试了:

use image::io::Reader as ImageReader;
use std::io::BufReader;
use std::fs::File;

let f = File::open(r"C:\Users\Marko\Desktop\HDR_Big.exr").expect("File Error");
let reader = BufReader::new(f);
let img_reader = ImageReader::new(reader)
    .with_guessed_format()
    .expect("Reader Error");
let img = img_reader.decode().expect("Decode ERROR");

但是同样的错误结果。 这是图片箱本身的问题吗?可以避免吗?

如果在解码图像后对解决方案有任何影响,我使用这样的原始数据:

let data: Vec<f32> = img.to_rgb32f().into_raw();

谢谢!

默认情况下,image::io::Reader 要求解码器根据 the documentation. It's possible to disable this limitation, using, e.g., Reader::no_limits.

将解码过程放入 512 MiB 内存中

But the same error results. Is this a problem with the image crate itself? Can it be avoided?

不,因为这不是问题,是的,它是可以避免的。

当图像库面向开放网络时,DOS 整个服务或廉价耗尽其库相对容易,因为通常可以以非常低的成本请求大图像(例如 44KB PNG 可以解压缩到 1GB full-color 缓冲区,而 megabyte-scale jpeg 可以达到 GB-scale 缓冲区大小)。

因此,现代图像库倾向于默认设置限制,以限制用户的“默认”责任。

That is the case of image-rs,默认情况下它不设置任何宽度或高度限制,但它确实请求分配器将自身限制为 512MB。

如果您希望有更高的限制或没有限制,您可以配置解码器以匹配。

所有这些都可以通过简单地搜索错误名称和库来显示(“InsufficientMemory image-rs”和“LimitError image-rs”都会显示信息)