judge_framework/frontend/
diff.rs

1use image::GenericImageView;
2use pixelmatch::pixelmatch;
3
4use super::{Error, Result};
5
6pub async fn diff(user_image: &[u8], answer_image: &[u8]) -> Result<f32> {
7    let (width, height) = image::load_from_memory(user_image)?.dimensions();
8    let _buffer: Option<&mut Vec<u8>> = None;
9
10    let diff = pixelmatch(
11        user_image,
12        answer_image,
13        _buffer,
14        Some(width),
15        Some(height),
16        Some(pixelmatch::Options {
17            threshold: 0.1,
18            ..Default::default()
19        }),
20    )
21    .map_err(|error| Error::DiffFailed(error.to_string()))?;
22
23    let match_percent = 1. - (diff as f32) / ((width * height) as f32);
24
25    Ok(match_percent)
26}