使用 rust 的 png 库读取文件,然后不做修改地再次保存,发现跟原图不一样,为什么会产生这种问题呢?我缺少了什么步骤导致这种问题!(不仅是 png 库,image、lodepng 库同样是这样,我是否缺了什么关键步骤,请大佬们不吝赐教)
使用 js 实现读取后直接写入却不会丢失!
这是我进行尝试的 demo
fn demo() -> Result<(), String> {
// 加载图片
let decoder = png::Decoder::new(File::open("path/optimize/fruit.png").unwrap());
let mut reader = decoder.read_info().unwrap();
// Allocate the output buffer.
let mut buf = vec![0; reader.output_buffer_size()];
// Read the next frame. An APNG might contain multiple frames.
let info = reader.next_frame(&mut buf).unwrap();
// save
let output_file = File::create("path/optimize/fruit-test.png").unwrap();
let w = std::io::BufWriter::new(output_file);
let mut encoder = png::Encoder::new(w, info.width, info.height);
encoder.set_depth(info.bit_depth);
encoder.set_color(info.color_type);
let mut writer = encoder.write_header().unwrap();
writer.write_image_data(&buf).unwrap();
Ok(())
}
得到以下图片,左边是原图,右边我感觉色彩有丢失的感觉,没了左边的鲜艳
很奇怪的是,我在 js 中通过 input 标签获取图片然后保存,却没事
const handleChange = async (event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0] as File;
const bitmap = await createImageBitmap(file);
const { width, height } = bitmap;
// 使用普通的 canvas
const canvas2 = document.createElement("canvas");
canvas2.width = width;
canvas2.height = height;
const context2 = canvas2.getContext("2d")!;
context2.drawImage(bitmap, 0, 0, width, height);
canvas2.toBlob((blob) => {
const testEle = document.getElementById("test") as HTMLImageElement;
testEle.src = URL.createObjectURL(blob as Blob);
}, "image/png");
};