在 C 中,我習慣于使用 stb_image 將影像資料加載到 RAM 和從 RAM 加載。
我正在撰寫一個 rust 程式,我在其中加載了一些 PNG 和 JPEG 作為原始二進制資料。
我正在嘗試使用影像板條箱來讀取光線位元組資料并將其解壓縮為資料和元資料(即影像尺寸和原始像素位元組資料)。然后我需要重新壓縮資料 sa png 并將其列印到磁盤,以確保資料正常(稍后我將使用原始緩沖區)。
為此,我有這個
let image_data = image::load_from_memory(bytes).unwrap();
bytes原始影像資料在哪里。
問題 n1,這似乎為 jpegs 創建了一個 3 通道影像,我需要一個用于 png 和 jpegs 的 4 通道影像。所以對于 jpeg,我需要影像箱來添加填充。但是,如果我嘗試使用它進行投射,as_rgba8我將無法再獲得影像的寬度和高度。
然后我試圖將資料讀入自定義結構,如下所示:
let mut raw_data = Vec::<u8>::new();
let width = image_data.width() as usize;
let height = image_data.height() as usize;
raw_data.extend_from_slice(image_data.as_bytes());
println!("{}", image_data.width());
println!("{}", image_data.height());
println!("{}", image_data.height() * image_data.width() * 3);
println!("{}", raw_data.len());
let texture =
Texture
{
width,
height,
channel_num : 4,
format : ImageFormat::RGBA8,
data : raw_data,
};
這部分似乎有效,接下來我嘗試重新壓縮資料 dn 列印到磁盤:
let tmp = RgbaImage::from_raw(
texture.width as u32,
texture.height as u32,
texture.data.as_bytes().to_vec()).unwrap();
tmp.save("tmp.png");
在這種情況下,我None在嘗試展開時遇到錯誤。我不明白為什么由于位元組緩沖區確實有足夠的資料來包含完整的影像,它實際上是由該影像創建的。
我有些失落。
uj5u.com熱心網友回復:
[...] 這似乎為 jpegs 創建了一個 3 通道影像,我需要一個用于 png 和 jpegs 的 4 通道影像。[...] 但是,如果我嘗試使用 as_rgba8 進行投射,我將無法再獲得影像的寬度和高度。
您想要轉換底層影像緩沖區,而不是投射影像。這是通過 中to_*的方法族完成的DynamicImage。無論動態影像是從檔案還是從記憶體(兩者都open回傳load_from_memorya DynamicImage)獲得的,這都有效。
use image::{RgbaImage, open}; // 0.24.3
let img = open("example.jpg")?;
println!(
"Before: {}x{} {:?} ({} channels)",
img.width(),
img.height(),
img.color(),
img.color().channel_count()
);
let img: RgbaImage = img.to_rgba8();
println!(
"After: {}x{} ({} channels)",
img.width(),
img.height(),
img.sample_layout().channels
);
請注意,第二個img在編譯時是如何已知為 RGBA 影像的。作為影像緩沖區,您可以自由檢索您希望的任何屬性或像素資料。
可能的輸出:
Before: 2864x2480 Rgb8 (3 channels)
After: 2864x2480 (4 channels)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505700.html
上一篇:是否可以使用立體影像(或任何其他方法)找到物件內部點的深度?
下一篇:如何根據自定義蒙版裁剪影像
