judge_framework/frontend/
diff.rs1use 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}