1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#![feature(slice_patterns)]

extern crate image;
#[macro_use] extern crate ndarray;
extern crate string_error;
extern crate getopts;

use std::fs::File;
use std::env;
use getopts::Options;

mod filter;
mod utils;

fn setup_option_parser() -> Options {
    let mut opts = Options::new();
    opts.optopt("s", "blocksize", "set bocksize (default: 32)", "SIZE");
    opts.optopt("i", "input", "input file path", "FILE");
    opts.optopt("", "char-detect-thresh", "threshould for character detection (default: 10)", "THRESH");
    opts.optopt("", "line-detect-thresh", "threshould for line detection (default: 10)", "THRESH");
    opts.optopt("", "shrink-thresh", "threshould for shrink (default: 5)", "THRESH");
    opts.optflag("", "help", "");
    return opts;
}

fn main() {
    let args: Vec<String> = env::args().collect();
    let parser = setup_option_parser();
    let matches = match parser.parse(&args[1..]) {
        Ok(m) => m,
        Err(f) => panic!(f.to_string())
    };

    if !matches.opt_present("i") || matches.opt_present("help") {
        println!("{}", parser.short_usage("png2aa"));
        return;
    }

    let input_file = matches.opt_str("i").unwrap();

    let mut hough_filter = filter::block_hough::default();
    if let Some(block_size_str) = matches.opt_str("s") {
        hough_filter.block_size = block_size_str.parse().unwrap();
    }
    if let Some(slope_count_thresh_str) = matches.opt_str("char-detect-thresh") {
        hough_filter.slope_count_thresh = slope_count_thresh_str.parse().unwrap();
    }

    let mut binary_filter = filter::binary::default();
    if let Some(line_detect_thresh_str) = matches.opt_str("line-detect-thresh") {
        binary_filter.thresh = line_detect_thresh_str.parse().unwrap();
    }

    let mut shrink_filter = filter::shrink::default();
    if let Some(shrink_thresh_str) = matches.opt_str("shrink-thresh") {
        shrink_filter.thresh = shrink_thresh_str.parse().unwrap();
    }

    let image_array = utils::read_png(Box::new(File::open(input_file).unwrap())).unwrap();
    let grayscale_array = filter::grayscale::default().run(image_array);
    let gradient_array = filter::line::default().run(grayscale_array.clone());
    let line_array = shrink_filter.run(binary_filter.run(gradient_array)).mapv(|e| e as f32) * 250.;
    let hough_array = hough_filter.run(line_array);
    let aa = filter::ascii_art::default().run(hough_array);
    println!("{}", aa);
}