diff options
| author | ache <ache@ache.one> | 2025-08-31 22:21:17 +0200 |
|---|---|---|
| committer | ache <ache@ache.one> | 2025-08-31 22:21:17 +0200 |
| commit | f77e747dd7b4053f4c3421b383a5495cc6d23055 (patch) | |
| tree | fadb9d7cd71da1475c5ee8d396a56d321ebfc5f5 | |
| parent | Fix images dimensions (diff) | |
RNG use small
| -rw-r--r-- | src/lib.rs | 43 | ||||
| -rw-r--r-- | src/main.rs | 5 |
2 files changed, 34 insertions, 14 deletions
@@ -3,7 +3,7 @@ pub mod kernel; use image::{ImageBuffer, Rgb, RgbImage}; use palette::{LinSrgb, Srgb, color_difference::EuclideanDistance}; use rand::rngs::SmallRng; -use rand::{RngCore, SeedableRng}; +use rand::{Rng, RngCore, SeedableRng}; use std::cmp; use std::collections::VecDeque; use std::num::Wrapping; @@ -15,20 +15,26 @@ const WHITE_SRGB: Srgb<f32> = Srgb::new(1., 1., 1.); const BLACK_LINEAR_SRGB: LinSrgb<f32> = LinSrgb::new(0., 0., 0.); const WHITE_LINEAR_SRGB: LinSrgb<f32> = LinSrgb::new(1., 1., 1.); +#[allow(dead_code)] const MULTIPLIER: u32 = 1303515245; +#[allow(dead_code)] const INCREMENT: u32 = 12345; +#[allow(dead_code)] const MODULUS: u32 = 1 << 31; +#[allow(dead_code)] fn lcg_next(state: &mut u32) -> u32 { let tmp_state = Wrapping(*state); *state = ((Wrapping(MULTIPLIER) * tmp_state + Wrapping(INCREMENT)) % Wrapping(MODULUS)).0; *state } +#[allow(dead_code)] fn rand_(state: &mut u32) -> u32 { lcg_next(state) } +#[allow(dead_code)] fn rand_double(state: &mut u32) -> f64 { // TODO: Should to it with 64bits integers (lcg_next(state) as f64) / (MODULUS as f64) @@ -1518,7 +1524,7 @@ pub fn refine_palette( } } -pub fn random_permutation_1d(count: usize, queue: &mut VecDeque<i32>, rng: &mut u32) { +pub fn random_permutation_1d(count: usize, queue: &mut VecDeque<i32>, rng: &mut SmallRng) { // NOTE: Done and tested ! for i in 0..count { queue.push_back(i as i32); @@ -1527,7 +1533,8 @@ pub fn random_permutation_1d(count: usize, queue: &mut VecDeque<i32>, rng: &mut queue.make_contiguous(); for i in (1..count).rev() { - let rand_number = rand_(rng) % (i as u32 + 1); + // let rand_number = rand_(rng) % (i as u32 + 1); + let rand_number = rng.random_range(0..(i as u32 + 1)); queue.swap(i, rand_number as usize); } } @@ -1536,7 +1543,7 @@ pub fn random_permutation_2d( width: usize, height: usize, queue: &mut VecDeque<(i32, i32)>, - rng: &mut u32, + rng: &mut SmallRng, ) { // NOTE: Done and tested ! // WARN: Should be improved. @@ -1701,12 +1708,13 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) { // let res = invert_matrix(&mut matrix); let (width, height) = image_in.dimensions(); - let palette_size = 6; + let palette_size = _palette_size as usize; let ditherring_level = 0.09 * ((width * height) as f64).ln() - 0.04 * (palette_size as f64).ln() + 0.001; - let mut rng: u32 = 42; + // let mut rng: u32 = 42; + let mut rng = SmallRng::seed_from_u64(11); let mut image = vec![vec![[0.; 3]; height as usize]; width as usize]; let _filter_weights_1 = vec![vec![[0.; 3]; 1]; 1]; @@ -1717,11 +1725,12 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) { let mut palette: Vec<(f64, f64, f64)> = Vec::with_capacity(palette_size); for _ in 0..palette_size { - let color: (f64, f64, f64) = ( - rand_double(&mut rng), - rand_double(&mut rng), - rand_double(&mut rng), - ); + // let color: (f64, f64, f64) = ( + // rand_double(&mut rng), + // rand_double(&mut rng), + // rand_double(&mut rng), + // ); + let color: (f64, f64, f64) = rng.random(); palette.push(color); } @@ -1797,7 +1806,8 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) { for i in 0..(pcoarse_variables.len() as usize) { for j in 0..(pcoarse_variables[0].len() as usize) { for c in 0..palette_size { - pcoarse_variables[i][j][c] = rand_double(&mut rng); + // pcoarse_variables[i][j][c] = rand_double(&mut rng); + pcoarse_variables[i][j][c] = rng.random(); coarse_variables[i][j][c] = pcoarse_variables[i][j][c]; } } @@ -2147,6 +2157,7 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) { } } + print!("["); for v in 0..palette_size { if palette[v].0 > 1.0 { palette[v].0 = 1.0; @@ -2165,7 +2176,15 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) { } else if palette[v].2 < 0.0 { palette[v].2 = 0.0; } + + print!( + "#{:02.x}{:02.x}{:02.x}, ", + (palette[v].0 * 255.).ceil() as u8, + (palette[v].1 * 255.).ceil() as u8, + (palette[v].2 * 255.).ceil() as u8 + ); } + println!("]"); } for y in 0..(height as u32) { diff --git a/src/main.rs b/src/main.rs index ac28eb7..b56b867 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,10 +5,11 @@ use std::path::Path; const LIST_OF_SAMPLES: [&str; 6] = [ "samples/david.png", "samples/david2.jpg", + "samples/test_scolarq.png", "samples/us.png", "samples/jane.jpg", "samples/jane2.webp", - "samples/karel_käos.jpg", + // "samples/karel_käos.jpg", // "samples/diderot_111.png", ]; #[allow(dead_code)] @@ -55,7 +56,7 @@ fn main() -> Result<(), image::ImageError> { }), ("bayer_3b", |img| dither::dither_bayer(256, img)), */ - ("scolorq", |_img| dither::dither_scolorq(_img, 16)), + ("scolorq", |_img| dither::dither_scolorq(_img, 8)), ("kernel_jarvis_judice_ninke_linear_3b", |img| { dither::dither_palette_linear( img, |