1 module rip.processing.colorization; 2 3 private 4 { 5 import std.algorithm; 6 import std.range; 7 8 import rip.concepts.ranges; 9 import rip.concepts.templates; 10 import rip.concepts.color; 11 import rip.concepts.surface; 12 } 13 14 auto compareColors(RGBColor a, RGBColor b) 15 { 16 return a.distance!float(b); 17 } 18 19 // выборочная замена цвета (впоследстивие можно обобщить) 20 auto selectiveReplacing(Range)(Range r, RGBColor color, float detalizationLevel) 21 if(isPixelRange!Range) 22 { 23 // процедура замены цвета 24 auto replacingProcedure(RGBColor a, RGBColor b) 25 { 26 if (compareColors(a, b) <= detalizationLevel) 27 { 28 return a; 29 } 30 else 31 { 32 auto I = 0.2126 * a.red!float + 0.7152 * a.green!float + 0.0722 * a.blue!float; 33 return new RGBColor(I, I, I); 34 } 35 } 36 37 auto range = map!(a => replacingProcedure(a, color))(r).array; 38 return createPixels(range); 39 } 40 41 42 // замена цвета на другой 43 auto colorReplacing(Range)(Range r, RGBColor color, float detalizationLevel) 44 if(isPixelRange!Range) 45 { 46 // процедура замены цвета 47 auto replacingProcedure(RGBColor a, RGBColor b) 48 { 49 if (compareColors(a, b) <= detalizationLevel) 50 { 51 return b; 52 } 53 else 54 { 55 return a; 56 } 57 } 58 59 auto range = map!(a => replacingProcedure(a, color))(r).array; 60 return createPixels(range); 61 } 62 63 // простая замена одного цвета другим 64 auto simpleColorizing(Surface surface, RGBColor color, float detalizationLevel) 65 { 66 auto image = surface 67 .createFences(1,1) 68 .map!(a => a.front) 69 .colorReplacing(color, detalizationLevel) 70 .toSurface(surface.getWidth!int, surface.getHeight!int); 71 return image; 72 } 73 74 // выборочное обесцвечивание 75 auto selectiveColorizing(Surface surface, RGBColor color, float detalizationLevel) 76 { 77 auto image = surface 78 .createFences(1,1) 79 .map!(a => a.front) 80 .selectiveReplacing(color, detalizationLevel) 81 .toSurface(surface.getWidth!int, surface.getHeight!int); 82 return image; 83 }