73 lines
3.0 KiB
Rust
73 lines
3.0 KiB
Rust
|
|
//! Compare merged image and layer pixels between original and saved PSD.
|
||
|
|
|
||
|
|
fn main() {
|
||
|
|
let args: Vec<String> = std::env::args().collect();
|
||
|
|
let orig_path = args.get(1).map(|s| s.as_str()).unwrap_or("_images/_test_images/example3/Example3-mini.psd");
|
||
|
|
let saved_path = args.get(2).map(|s| s.as_str()).unwrap_or("_images/_test_images/example3/Example3-mini-hcie.psd");
|
||
|
|
|
||
|
|
let orig = std::fs::read(orig_path).expect("read orig");
|
||
|
|
let saved = std::fs::read(saved_path).expect("read saved");
|
||
|
|
|
||
|
|
let orig_psd = hcie_psd::Psd::from_bytes(&orig).expect("parse orig");
|
||
|
|
let saved_psd = hcie_psd::Psd::from_bytes(&saved).expect("parse saved");
|
||
|
|
|
||
|
|
println!("=== Merged Image ===");
|
||
|
|
let o_rgba = orig_psd.rgba();
|
||
|
|
let s_rgba = saved_psd.rgba();
|
||
|
|
println!(" orig: {} bytes ({}x{}x4)", o_rgba.len(), orig_psd.width(), orig_psd.height());
|
||
|
|
println!(" saved: {} bytes ({}x{}x4)", s_rgba.len(), saved_psd.width(), saved_psd.height());
|
||
|
|
|
||
|
|
if o_rgba.len() == s_rgba.len() {
|
||
|
|
let mut diff_count = 0usize;
|
||
|
|
let mut max_diff = 0u8;
|
||
|
|
let mut sum_diff = 0u64;
|
||
|
|
for i in 0..o_rgba.len() {
|
||
|
|
let d = (o_rgba[i] as i16 - s_rgba[i] as i16).abs() as u8;
|
||
|
|
if d > 0 {
|
||
|
|
diff_count += 1;
|
||
|
|
max_diff = max_diff.max(d);
|
||
|
|
sum_diff += d as u64;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
let total = o_rgba.len();
|
||
|
|
println!(" pixel diffs: {}/{} ({:.1}%)", diff_count, total, diff_count as f64 / total as f64 * 100.0);
|
||
|
|
println!(" max diff: {}", max_diff);
|
||
|
|
if diff_count > 0 {
|
||
|
|
println!(" avg diff: {:.2}", sum_diff as f64 / diff_count as f64);
|
||
|
|
}
|
||
|
|
|
||
|
|
if diff_count > 0 && diff_count < 20 {
|
||
|
|
for i in 0..total {
|
||
|
|
if o_rgba[i] != s_rgba[i] {
|
||
|
|
let pixel = i / 4;
|
||
|
|
let ch = i % 4;
|
||
|
|
let ch_name = ["R", "G", "B", "A"][ch];
|
||
|
|
let x = pixel % orig_psd.width() as usize;
|
||
|
|
let y = pixel / orig_psd.width() as usize;
|
||
|
|
println!(" pixel ({},{}) {}: orig={} saved={}", x, y, ch_name, o_rgba[i], s_rgba[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
println!("\n=== Layer Comparison ===");
|
||
|
|
let o_layers = orig_psd.layers();
|
||
|
|
let s_layers = saved_psd.layers();
|
||
|
|
println!(" orig layers: {}, saved layers: {}", o_layers.len(), s_layers.len());
|
||
|
|
|
||
|
|
for i in 0..o_layers.len().min(s_layers.len()) {
|
||
|
|
let ol = &o_layers[i];
|
||
|
|
let sl = &s_layers[i];
|
||
|
|
let o_px = ol.rgba();
|
||
|
|
let s_px = sl.rgba();
|
||
|
|
let mut diff = 0usize;
|
||
|
|
let mut max_d = 0u8;
|
||
|
|
for j in 0..o_px.len().min(s_px.len()) {
|
||
|
|
let d = (o_px[j] as i16 - s_px[j] as i16).abs() as u8;
|
||
|
|
if d > 0 { diff += 1; max_d = max_d.max(d); }
|
||
|
|
}
|
||
|
|
let status = if diff == 0 { "MATCH" } else { "DIFF" };
|
||
|
|
println!(" [{}] '{}' {}x{}: {} diff pixels (max={}) [{}]", i, ol.name(), ol.width(), ol.height(), diff, max_d, status);
|
||
|
|
}
|
||
|
|
}
|