Files

73 lines
3.0 KiB
Rust
Raw Permalink Normal View History

2026-07-09 02:59:53 +03:00
//! 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);
}
}