lcs_image_diff/
lib.rs

1extern crate base64;
2extern crate image;
3extern crate lcs_diff;
4
5mod diff;
6mod image_creator;
7
8use diff::*;
9use image_creator::*;
10use image::*;
11pub use base64::DecodeError;
12
13/// Accepts two mutable references to `image::DynamicImage` and rate.
14/// Returns diff `image::DynamicImage` and marks removed and added
15/// parts on input images.
16///
17/// # Examples
18///
19/// ```no_run
20/// extern crate image;
21/// # use std::error::Error;
22/// # fn main() -> Result<(), Box<Error>> {
23/// use lcs_image_diff::compare;
24///
25/// let mut before = image::open("before.png")?;
26/// let mut after = image::open("after.png")?;
27///
28/// let diff = compare(&mut before, &mut after, 100.0 / 256.0)?;
29///
30/// before.save("marked_before.png")?;
31/// after.save("marked_after.png")?;
32/// diff.save("diff.png")?;
33/// # Ok(())
34/// # }
35/// ```
36pub fn compare(
37    before: &mut DynamicImage,
38    after: &mut DynamicImage,
39    rate: f32
40) -> Result<DynamicImage, DecodeError> {
41    let compare_before = CompareImage::new(before.dimensions(), before.raw_pixels());
42    let compare_after = CompareImage::new(after.dimensions(), after.raw_pixels());
43    let result = diff(compare_before, compare_after);
44
45    let mut added: Vec<usize> = Vec::new();
46    let mut removed: Vec<usize> = Vec::new();
47    for d in result.iter() {
48        match d {
49            &lcs_diff::DiffResult::Added(ref a) => added.push(a.new_index.unwrap()),
50            &lcs_diff::DiffResult::Removed(ref r) => removed.push(r.old_index.unwrap()),
51            _ => (),
52        }
53    }
54
55    mark_org_image(before, RED, rate, &removed);
56    mark_org_image(after, GREEN, rate, &added);
57
58    get_diff_image(before.dimensions().0, after.dimensions().0, &result, rate)
59}