bhcli

"Strange's fork of n0tr1v's bhcli (onion)"
git clone https://git.dasho.dev/Strange/bhcli.git
Log | Files | Refs | README

commit bca605e1efac52b7533e586b711252b7d25a44ec
parent 44542f415b93e2515f03768914f69acc8e9db6bf
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Fri, 31 Mar 2023 19:48:00 -0700

cleanup

Diffstat:
Msrc/lechatphp/mod.rs | 36++++++++++++++++--------------------
1 file changed, 16 insertions(+), 20 deletions(-)

diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs @@ -3,7 +3,7 @@ use std::fmt::{Display, Formatter}; use std::hash::Hash; use base64::{engine::general_purpose, Engine as _}; use bresenham::Bresenham; -use image::{DynamicImage, GenericImageView, Rgba, SubImage}; +use image::{DynamicImage, GenericImageView, Rgba}; use lazy_static::lazy_static; const B64_PREFIX: &'static str = "R0lGODlhCAAOAIAAAAAAAAAAACH5BAgAAAAALAAAAAAIAA4AgAQCBPz+/AI"; @@ -110,7 +110,7 @@ pub fn solve_b64(b64_str: &str) -> Option<String> { fn solve_difficulty2(img: &DynamicImage) -> Option<String> { let mut answer = String::new(); for i in 0..NB_CHARS { - let sub_img = img.view(LEFT_PADDING + ((LETTER_WIDTH +1)*i), TOP_PADDING, LETTER_WIDTH, LETTER_HEIGHT); + let sub_img = img.crop_imm(LEFT_PADDING + ((LETTER_WIDTH +1)*i), TOP_PADDING, LETTER_WIDTH, LETTER_HEIGHT); for c in ALPHABET1.chars() { let good_letter_img = get_letter_img(c); if img_contains_letter(&sub_img, &good_letter_img) { @@ -201,7 +201,7 @@ fn find_letters(img: &DynamicImage) -> Result<HashSet<Letter>, CaptchaErr> { let mut letters_set = HashSet::new(); for y in 0..IMAGE_HEIGHT-LETTER_HEIGHT { for x in 0..IMAGE_WIDTH-LETTER_WIDTH { - let letter_img = img.view(x, y, LETTER_WIDTH, LETTER_HEIGHT); + let letter_img = img.crop_imm(x, y, LETTER_WIDTH, LETTER_HEIGHT); // We know that minimum amount of pixels on to form a letter is 21 // We can skip squares that do not have this prerequisite @@ -214,24 +214,20 @@ fn find_letters(img: &DynamicImage) -> Result<HashSet<Letter>, CaptchaErr> { continue } - for c in ALPHABET1.chars() { + 'alphabet_loop: for c in ALPHABET1.chars() { let good_letter_img = get_letter_img(c); if !img_contains_letter(&letter_img, &good_letter_img) { continue; } // "w" fits in "W". So if we find "W" 1 px bellow, discard "w" - if c == 'w' { - let capital_w_img = get_letter_img('W'); - let one_px_down_img = img.view(x, y+1, LETTER_WIDTH, LETTER_HEIGHT); - if img_contains_letter(&one_px_down_img, &capital_w_img) { - continue; - } - } else if c == 'k' { - let capital_k_img = get_letter_img('K'); - let one_px_up_img = img.view(x+1, y+1, LETTER_WIDTH, LETTER_HEIGHT); - if img_contains_letter(&one_px_up_img, &capital_k_img) { - continue; + for (a, b, x, y) in vec![('w', 'W', x, y+1), ('k', 'K', x+1, y+1)] { + if c == a { + let capital_w_img = get_letter_img(b); + let one_px_down_img = img.crop_imm(x, y, LETTER_WIDTH, LETTER_HEIGHT); + if img_contains_letter(&one_px_down_img, &capital_w_img) { + continue 'alphabet_loop; + } } } @@ -249,7 +245,7 @@ fn find_letters(img: &DynamicImage) -> Result<HashSet<Letter>, CaptchaErr> { fn get_starting_letter<'a>(img: &DynamicImage, letters_set: &'a HashSet<Letter>) -> Option<&'a Letter> { const MIN_STARTING_PT_RED_PX: usize = 50; for letter in letters_set.iter() { - let square = img.view(letter.offset.x-5, letter.offset.y-3, LETTER_WIDTH+5+6, LETTER_HEIGHT+3+2); + let square = img.crop_imm(letter.offset.x-5, letter.offset.y-3, LETTER_WIDTH+5+6, LETTER_HEIGHT+3+2); let count_red = count_red_px(&square); if count_red > MIN_STARTING_PT_RED_PX { return Some(letter); @@ -277,7 +273,7 @@ impl From<Point> for bresenham::Point { } // give an image and a valid letter image, return either or not the letter is in that image. -fn img_contains_letter(img: &SubImage<&DynamicImage>, letter_img: &DynamicImage) -> bool { +fn img_contains_letter(img: &DynamicImage, letter_img: &DynamicImage) -> bool { if letter_img.dimensions() != img.dimensions() { return false; } @@ -302,21 +298,21 @@ fn is_red(c: Rgba<u8>) -> bool { c == *RED_COLOR } -fn has_red_in_center_area(letter_img: &SubImage<&DynamicImage>) -> bool { +fn has_red_in_center_area(letter_img: &DynamicImage) -> bool { letter_img.view(LETTER_WIDTH/2 - 1, LETTER_HEIGHT/2 - 1, 2, 2) .pixels() .any(|(_, _, c)| is_red(c)) } // Count pixels that are On (either white or red) -fn count_px_on(img: &SubImage<&DynamicImage>) -> usize { +fn count_px_on(img: &DynamicImage) -> usize { img.pixels() .filter(|(_, _, c)| is_on(*c)) .count() } // Count pixels that are red -fn count_red_px(img: &SubImage<&DynamicImage>) -> usize { +fn count_red_px(img: &DynamicImage) -> usize { img.pixels() .filter(|(_, _, c)| is_red(*c)) .count()