增加在RGB颜色空间逆向计算颜色混合比例的功能。

This commit is contained in:
徐涛 2025-01-14 06:02:49 +08:00
parent 1edc74daaf
commit 7c91f50173
2 changed files with 77 additions and 0 deletions

View File

@ -15,6 +15,7 @@ use wasm_bindgen::prelude::*;
mod color_card;
mod color_differ;
mod errors;
mod reversing;
#[wasm_bindgen]
pub fn represent_rgb(color: &str) -> Result<Box<[u8]>, errors::ColorError> {
@ -496,3 +497,37 @@ pub fn differ_in_oklch(
);
Ok(oklch.difference(&other_oklch))
}
#[wasm_bindgen]
pub fn tint_scale(
basic_color: &str,
mixed_color: &str,
) -> Result<reversing::MixReversing, errors::ColorError> {
let basic_color = Srgb::from_str(basic_color)
.map_err(|_| errors::ColorError::UnrecogniazedRGB(basic_color.to_string()))?
.into_format::<f32>();
let mixed_color = Srgb::from_str(mixed_color)
.map_err(|_| errors::ColorError::UnrecogniazedRGB(mixed_color.to_string()))?
.into_format::<f32>();
Ok(reversing::MixReversing::from_tint_rgb(
basic_color,
mixed_color,
))
}
#[wasm_bindgen]
pub fn shade_scale(
basic_color: &str,
mixed_color: &str,
) -> Result<reversing::MixReversing, errors::ColorError> {
let basic_color = Srgb::from_str(basic_color)
.map_err(|_| errors::ColorError::UnrecogniazedRGB(basic_color.to_string()))?
.into_format::<f32>();
let mixed_color = Srgb::from_str(mixed_color)
.map_err(|_| errors::ColorError::UnrecogniazedRGB(mixed_color.to_string()))?
.into_format::<f32>();
Ok(reversing::MixReversing::from_shade_rgb(
basic_color,
mixed_color,
))
}

View File

@ -0,0 +1,42 @@
use palette::rgb::Rgb;
use serde::Serialize;
use wasm_bindgen::prelude::wasm_bindgen;
#[derive(Debug, Clone, Copy, Serialize)]
#[wasm_bindgen]
pub struct MixReversing {
pub r_factor: f32,
pub g_factor: f32,
pub b_factor: f32,
pub average: f32,
}
impl MixReversing {
pub fn from_tint_rgb(basic_color: Rgb, mixed_result: Rgb) -> Self {
let r_factor = (mixed_result.red - basic_color.red) / (1.0 - basic_color.red);
let g_factor = (mixed_result.green - basic_color.green) / (1.0 - basic_color.green);
let b_factor = (mixed_result.blue - basic_color.blue) / (1.0 - basic_color.blue);
let average = (r_factor + g_factor + b_factor) / 3.0;
MixReversing {
r_factor,
g_factor,
b_factor,
average,
}
}
pub fn from_shade_rgb(basic_color: Rgb, mixed_result: Rgb) -> Self {
let r_factor = (basic_color.red - mixed_result.red) / (0.0 - basic_color.red);
let g_factor = (basic_color.green - mixed_result.green) / (0.0 - basic_color.green);
let b_factor = (basic_color.blue - mixed_result.blue) / (0.0 - basic_color.blue);
let average = (r_factor + g_factor + b_factor) / 3.0;
MixReversing {
r_factor,
g_factor,
b_factor,
average,
}
}
}