🖼️

image、imghdrクレートで間違った拡張子の画像を開く

2023/10/17に公開

画像の拡張子と実際のファイル形式が違っていると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 で画像のリサイズをやってみたメモ(サムネイルを作るやつ)
https://r9.hateblo.jp/entry/2022/05/13/222702

Discussion