Add Minimum and Maximum option to Threshold node (#1029)
This might be usefull later when spliting Images into Seperate Images for each Channel, as then the other modes might behave weirdly Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
6caed9e761
commit
4bb4e2c22e
|
|
@ -11,11 +11,19 @@ pub enum LuminanceCalculation {
|
||||||
SRGB,
|
SRGB,
|
||||||
Perceptual,
|
Perceptual,
|
||||||
AverageChannels,
|
AverageChannels,
|
||||||
|
MinimumChannels,
|
||||||
|
MaximumChannels,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LuminanceCalculation {
|
impl LuminanceCalculation {
|
||||||
pub fn list() -> [LuminanceCalculation; 3] {
|
pub fn list() -> [LuminanceCalculation; 5] {
|
||||||
[LuminanceCalculation::SRGB, LuminanceCalculation::Perceptual, LuminanceCalculation::AverageChannels]
|
[
|
||||||
|
LuminanceCalculation::SRGB,
|
||||||
|
LuminanceCalculation::Perceptual,
|
||||||
|
LuminanceCalculation::AverageChannels,
|
||||||
|
LuminanceCalculation::MinimumChannels,
|
||||||
|
LuminanceCalculation::MaximumChannels,
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -25,6 +33,8 @@ impl std::fmt::Display for LuminanceCalculation {
|
||||||
LuminanceCalculation::SRGB => write!(f, "sRGB"),
|
LuminanceCalculation::SRGB => write!(f, "sRGB"),
|
||||||
LuminanceCalculation::Perceptual => write!(f, "Perceptual"),
|
LuminanceCalculation::Perceptual => write!(f, "Perceptual"),
|
||||||
LuminanceCalculation::AverageChannels => write!(f, "Average Channels"),
|
LuminanceCalculation::AverageChannels => write!(f, "Average Channels"),
|
||||||
|
LuminanceCalculation::MinimumChannels => write!(f, "Minimum Channels"),
|
||||||
|
LuminanceCalculation::MaximumChannels => write!(f, "Maximum Channels"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -43,6 +53,8 @@ fn luminance_color_node(color: Color, luma_calculation: LuminanceCalculation) ->
|
||||||
LuminanceCalculation::SRGB => color.luminance_srgb(),
|
LuminanceCalculation::SRGB => color.luminance_srgb(),
|
||||||
LuminanceCalculation::Perceptual => color.luminance_perceptual(),
|
LuminanceCalculation::Perceptual => color.luminance_perceptual(),
|
||||||
LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
|
LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
|
||||||
|
LuminanceCalculation::MinimumChannels => color.minimum_rgb_channels(),
|
||||||
|
LuminanceCalculation::MaximumChannels => color.maximum_rgb_channels(),
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Remove conversion to linear when the whole node graph uses linear color
|
// TODO: Remove conversion to linear when the whole node graph uses linear color
|
||||||
|
|
@ -188,6 +200,8 @@ fn threshold_node(color: Color, luma_calculation: LuminanceCalculation, threshol
|
||||||
LuminanceCalculation::SRGB => color.luminance_srgb(),
|
LuminanceCalculation::SRGB => color.luminance_srgb(),
|
||||||
LuminanceCalculation::Perceptual => color.luminance_perceptual(),
|
LuminanceCalculation::Perceptual => color.luminance_perceptual(),
|
||||||
LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
|
LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
|
||||||
|
LuminanceCalculation::MinimumChannels => color.minimum_rgb_channels(),
|
||||||
|
LuminanceCalculation::MaximumChannels => color.maximum_rgb_channels(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if luminance >= threshold {
|
if luminance >= threshold {
|
||||||
|
|
|
||||||
|
|
@ -200,6 +200,14 @@ impl Color {
|
||||||
(self.red + self.green + self.blue) / 3.
|
(self.red + self.green + self.blue) / 3.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn minimum_rgb_channels(&self) -> f32 {
|
||||||
|
self.red.min(self.green).min(self.blue)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn maximum_rgb_channels(&self) -> f32 {
|
||||||
|
self.red.max(self.green).max(self.blue)
|
||||||
|
}
|
||||||
|
|
||||||
// From https://stackoverflow.com/a/56678483/775283
|
// From https://stackoverflow.com/a/56678483/775283
|
||||||
pub fn luminance_srgb(&self) -> f32 {
|
pub fn luminance_srgb(&self) -> f32 {
|
||||||
0.2126 * self.red + 0.7152 * self.green + 0.0722 * self.blue
|
0.2126 * self.red + 0.7152 * self.green + 0.0722 * self.blue
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue