Buffer
方法将 Vec<u8>
类型从 nokhwa板条箱解码为预先分配的
decode_image_to_buffer
。到目前为止,这是我的代码:
use nokhwa::{
pixel_format::{RgbFormat},
utils::{
yuyv422_predicted_size,
},
Buffer,
};
// buffer is an instance of the nokhwa::Buffer struct
// frame_buffer is a Vec<u8>
frame_buffer.resize(yuyv422_predicted_size(buffer.buffer().len(), true), 0);
buffer.decode_image_to_buffer::<RgbAFormat>(&mut frame_buffer)
.unwrap();
此代码在 linux 上完美运行。但是当我尝试在 Windows 上运行时,出现以下错误:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value:
ProcessFrameError { src: MJPEG, destination: "RGB888",
error: "Bad decoded buffer size" }', src\main.rs:86:75
mozjpeg
板条箱。 nokhwa
使用它来实现 decode_image_to_buffer
方法。更具体地说,我认为错误来自this call to the jpeg_start_decompress
function.
我不知道这是我的代码还是我使用的依赖项中的错误。我走到了死胡同。请帮助。
没关系,我解决了这个问题。结果是
nokhwa
的 yuyv422_predicted_size
函数没有返回缓冲区大小的正确值。为了解决这个问题,我在我的mozjpeg
中添加了
Cargo.toml
作为依赖项:
[dependencies]
mozjpeg = "0.9.4"
并直接用它来执行解码。
use mozjpeg::{Decompress, ColorSpace};
let decompress = Decompress::new_mem(buffer.buffer()).unwrap();
let mut decompress = decompress.rgba().unwrap();
let num_components = match decompress.color_space() {
ColorSpace::JCS_UNKNOWN => 0,
ColorSpace::JCS_GRAYSCALE => 1,
ColorSpace::JCS_RGB => 3,
ColorSpace::JCS_YCbCr => 3,
ColorSpace::JCS_CMYK => 4,
ColorSpace::JCS_YCCK => 4,
ColorSpace::JCS_EXT_RGB => 3,
ColorSpace::JCS_EXT_RGBX => 4,
ColorSpace::JCS_EXT_BGR => 3,
ColorSpace::JCS_EXT_BGRX => 4,
ColorSpace::JCS_EXT_XBGR => 4,
ColorSpace::JCS_EXT_XRGB => 4,
ColorSpace::JCS_EXT_RGBA => 4,
ColorSpace::JCS_EXT_BGRA => 4,
ColorSpace::JCS_EXT_ABGR => 4,
ColorSpace::JCS_EXT_ARGB => 4,
ColorSpace::JCS_RGB565 => 3,
};
frame_buffer.resize(decompress.width() * decompress.height() * num_components, 0);
decompress.read_scanlines_flat_into(&mut frame_buffer);
编辑:
更简单。
Decompress
有一个 min_flat_buffer_size
方法。这可用于计算所需的缓冲区大小。即
frame_buffer.resize(decompress.min_flat_buffer_size(), 0);