🖼️
image、imghdrクレートで間違った拡張子の画像を開く
画像の拡張子と実際のファイル形式が違っているとimageクレートで開けなかったので、imghdrクレートでファイル形式を確認してから、その形式を指定して開いてます。
自分はRust初心者なので、参考程度に。
ファイル形式の確認には簡単な、imghdrクレートを使い、
image::load()で形式を指定して読み込みます。
// img_path 元画像
// img_save 保存名
let img_tmp = std::fs::File::open(img_path).unwrap(); //ファイルを開く
let img_buf = std::io::BufReader::new(img_tmp); //BufReaderに変換
let mut img_wrap: Option<DynamicImage> = None;//判定用
//判定して開く
match imghdr::from_file(img_path) {
Ok(Some(imghdr::Type::Png)) => img_wrap = Some(image::load(img_buf, image::ImageFormat::Png).unwrap()),
Ok(Some(imghdr::Type::Jpeg)) => img_wrap = Some(image::load(img_buf, image::ImageFormat::Jpeg).unwrap()),
Ok(Some(imghdr::Type::Gif)) => img_wrap = Some(image::load(img_buf, image::ImageFormat::Gif).unwrap()),
Ok(..) => println!("Other format"),
Err(e) => println!("Some error happened: {:?}", e),
}
//リサイズ処理等
if img_wrap != None {
let img = img_wrap.unwrap();
let nwidth: u32 = 400; //横幅400
let nheight: u32 = img.height();
let resized_img = img.resize(nwidth, nheight, FilterType::Lanczos3);
resized_img.save(save_path).unwrap(); //保存
}
ただJPEGだけ、認識されない場合がたまにある。
参考元様
Rust で画像のリサイズをやってみたメモ(サムネイルを作るやつ)
Discussion