rawler 0.8.0

A library to extract images and metadata from camera raw formats
Documentation
use std::io::Cursor;

use crate::common::check_md5_equal;
use rawler::devtools::rawdb::get_rawdb_cache;
use rawler::devtools::rawdb::rawdb_ensure_file;
use rawler::dng::convert::ConvertParams;
use rawler::dng::convert::convert_raw_file;
use rawler::dng::original::extract_original;
use rawler::formats::jfif::Jfif;
use rawler::rawsource::RawSource;
use rawler::{analyze::raw_pixels_digest, decoders::RawDecodeParams};

#[test]
fn dnglab_354_dng_mismatch_tile_dim_vs_ljpeg_sof_dim() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-354", "testfiles/dnglab_354.dng")?;
  let digest = raw_pixels_digest(path, &RawDecodeParams::default())?;
  check_md5_equal(digest, "e5fcd3fd81a3f8e2d9709b92f3b8f546");
  Ok(())
}

#[test]
fn dnglab_366_monochrome_dng_support() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-366", "testfiles/dnglab_366.dng")?;
  let digest = raw_pixels_digest(&path, &RawDecodeParams::default())?;
  check_md5_equal(digest, "f3549fafda97fca90b9993c1278bcd90");
  let mut dng = Cursor::new(Vec::new());
  convert_raw_file(&path, &mut dng, &ConvertParams::default())?;
  Ok(())
}

#[test]
fn dnglab_376_canon_crx_craw_qstep_shl_bug() -> std::result::Result<(), Box<dyn std::error::Error>> {
  {
    let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-376", "testfiles/Canon_EOS_R6M2_CRAW_ISO_25600.CR3")?;

    let digest = raw_pixels_digest(&path, &RawDecodeParams::default())?;
    check_md5_equal(digest, "66c9fcb6541c90bdfb06d876be5984ec");
    let mut dng = Cursor::new(Vec::new());
    convert_raw_file(&path, &mut dng, &ConvertParams::default())?;
  }
  {
    let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-376", "testfiles/_MGC9382.CR3")?;
    let digest = raw_pixels_digest(&path, &RawDecodeParams::default())?;
    check_md5_equal(digest, "aef96546a58e5265fb2f7b9e7498cbd0");
    let mut dng = Cursor::new(Vec::new());
    convert_raw_file(&path, &mut dng, &ConvertParams::default())?;
  }
  Ok(())
}

#[test]
fn dnglab_386_catch_jpeg_exif_tiff_ifd_error() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-386", "testfiles/jpeg_ifd_error.jpg")?;
  let rawfile = RawSource::new(&path)?;
  let jfif = Jfif::new(&rawfile)?;
  assert!(jfif.exif_ifd().is_none());
  Ok(())
}

#[test]
fn dnglab_477_jpeg_quantization_table_with_zero_value() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-477", "testfiles/dnglab_477.jpg")?;
  let image = image::open(&path)?;
  let _ = image.to_rgb8();
  Ok(())
}

#[test]
fn dnglab_619_silverfast_scan_missing_illuminant() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-619", "testfiles/silverfast_scan.dng")?;
  let mut dng = Cursor::new(Vec::new());
  convert_raw_file(&path, &mut dng, &ConvertParams::default())?;
  Ok(())
}

#[test]
fn dnglab_807_extract_embedded_raw_invalid_digest() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "dnglab", "dnglab-issue-807", "testfiles/dnglab-issue-807_embedded_original.dng")?;
  let mut original = Cursor::new(Vec::new());
  let dng = RawSource::new(&path)?;
  let verify_digest = true;
  extract_original(&dng, &mut original, verify_digest)?;
  let plain = original.into_inner();
  let plain_digest = md5::compute(&plain);
  assert_eq!(format!("{:x}", plain_digest), "a968cf0183a84c51ef492c631c6d16b7");
  Ok(())
}

#[test]
fn dnglab_807_digest_calculation() -> std::result::Result<(), Box<dyn std::error::Error>> {
  let path = rawdb_ensure_file(&get_rawdb_cache(), "Canon", "EOS 40D", "raw_modes/Canon EOS 40D_ISO_100_RAW.CR2")?;
  let mut dng = Cursor::new(Vec::new());
  convert_raw_file(&path, &mut dng, &ConvertParams::default().with_embedded(true))?;
  // Now verify
  let inner = dng.into_inner();
  let mut original = Cursor::new(Vec::new());
  let dng = RawSource::new_from_slice(&inner);
  let verify_digest = true;
  extract_original(&dng, &mut original, verify_digest)?;
  let plain = original.into_inner();
  let plain_digest = md5::compute(&plain);
  assert_eq!(format!("{:x}", plain_digest), "a968cf0183a84c51ef492c631c6d16b7");
  Ok(())
}