From f7b65c733a68ebb6ba9ebe41d84abae312c985aa Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 21 Feb 2014 03:57:27 +0100 Subject: more curve functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/curve.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/curve.py b/src/curve.py index 001108f..c88b02d 100644 --- a/src/curve.py +++ b/src/curve.py @@ -351,9 +351,9 @@ def negative(r = True, g = None, b = None): curve[i], curve[j] = curve[j], curve[i] -def invert(r = True, g = None, b = None): +def rgb_invert(r = True, g = None, b = None): ''' - Invert the colour curves (negative image with gamma invertion) + Invert the colour curves (negative image with gamma invertion), using sRGB @param r:bool Whether to invert the red curve @param g:bool? Whether to invert the green curve, defaults to `r` if `None` @@ -366,6 +366,23 @@ def invert(r = True, g = None, b = None): for i in range(i_size): curve[i] = 1 - curve[i] + +def cie_invert(r = True, g = None, b = None): + ''' + Invert the colour curves (negative image with gamma invertion), using CIE xyY + + @param r:bool Whether to invert the red curve + @param g:bool? Whether to invert the green curve, defaults to `r` if `None` + @param b:bool? Whether to invert the blue curve, defaults to `r` if `None` + ''' + if g is None: g = r + if b is None: b = r + for (curve, setting) in curves(r, g, b): + if setting: + for i in range(i_size): + (x, y, Y) = srgb_to_ciexyy(r_curve[i], g_curve[i], b_curve[i]) + (r_curve[i], g_curve[i], b_curve[i]) = ciexyy_to_srgb(x, y, 1 - Y) + def sigmoid(r, g, b): ''' @@ -384,6 +401,41 @@ def sigmoid(r, g, b): curve[i] = 0; +def rgb_limits(r_min, r_max, g_min = None, g_max = None, b_min = None, b_max = None): + ''' + Changes the black point and the white point, using sRGB + + @param r_min:float The red component value of the black point + @param r_max:float The red component value of the white point + @param g_min:float? The green component value of the black point, defaults to `r_min` + @param g_max:float? The green component value of the white point, defaults to `r_max` + @param b_min:float? The blue component value of the black point, defaults to `r_min` + @param b_max:float? The blue component value of the white point, defaults to `r_max` + ''' + if g_min is None: g_min = r_min + if g_max is None: g_max = r_max + if b_min is None: b_min = r_min + if b_max is None: b_max = r_max + for (curve, (level_min, level_max)) in curves((r_min, r_max), (g_min, g_max), (b_min, b_max)): + if (level_min != 0) or (level_max != 1): + for i in range(i_size): + curve[i] = curve[i] * (level_max - level_min) + level_min + + +def cie_limits(level_min, level_max): + ''' + Changes the black point and the white point, using CIE xyY + + @param level_min:float The brightness of the black point + @param level_max:float The brightness of the white point + ''' + if (level_min != 0) or (level_max != 1): + for i in range(i_size): + (x, y, Y) = srgb_to_ciexyy(r_curve[i], g_curve[i], b_curve[i]) + Y = Y * (level_max - level_min) + level_min + (r_curve[i], g_curve[i], b_curve[i]) = ciexyy_to_srgb(x, y, Y) + + def manipulate(r, g = None, b = None): ''' Manipulate the colour curves using a lambda function -- cgit v1.2.3-70-g09d2