commit bca605e1efac52b7533e586b711252b7d25a44ec
parent 44542f415b93e2515f03768914f69acc8e9db6bf
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Fri, 31 Mar 2023 19:48:00 -0700
cleanup
Diffstat:
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()