@@ -169,6 +169,14 @@ StyledImage::StyledImage(Image *input_image, Style *input_style, int offset) : I
169169 }
170170 }
171171
172+ else if (style->colorize_defined ()) {
173+ if (source_image->get_channels () == 3 || source_image->get_channels () == 4 ) {
174+ channels = style->get_colorize ()->destination .size ();
175+ } else {
176+ channels = input_image->get_channels ();
177+ }
178+ }
179+
172180 if (style->palette_defined ()){
173181 // Il n'y aura application de la palette et modification des canaux que si
174182 // - la palette n'est pas nulle et pas vide
@@ -489,6 +497,138 @@ int StyledImage::_getline(T *buffer, int line) {
489497 space = width * sizeof ( T ) * channels;
490498 }
491499
500+ else if (style->colorize_defined ()) {
501+ Colorize* wta = style->get_colorize ();
502+ switch ( channels ) {
503+ case 3 :
504+ if (source_image->get_channels ()==3 ){
505+ for (int i = 0 ; i < source_image->get_width () ; i++ ) {
506+ // image de départ à 3 canaux pour une arrivée en 3 canaux
507+ int red = *(source+i*3 );
508+ int green = *(source+i*3 +1 );
509+ int blue = *(source+i*3 +2 );
510+ red = red < 0 ? 0 : (red > 255 ? 255 : red);
511+ green = green < 0 ? 0 : (green > 255 ? 255 : green);
512+ blue = blue < 0 ? 0 : (blue > 255 ? 255 : blue);
513+ int s_red = wta->source [0 ];
514+ int s_green = wta->source [1 ];
515+ int s_blue = wta->source [2 ];
516+
517+ if (red>=s_red-wta->tolerance && red<=s_red+wta->tolerance &&
518+ green>=s_green-wta->tolerance && green<=s_green+wta->tolerance &&
519+ blue>=s_blue-wta->tolerance && blue<=s_blue+wta->tolerance ){
520+ * ( buffer+i*3 ) = (T) wta->destination [0 ];
521+ * ( buffer+i*3 +1 ) = (T) wta->destination [1 ];
522+ * ( buffer+i*3 +2 ) = (T) wta->destination [2 ];
523+ }
524+ else {
525+ * ( buffer+i*3 ) = (T) red;
526+ * ( buffer+i*3 +1 ) = (T) green;
527+ * ( buffer+i*3 +2 ) = (T) blue;
528+ }
529+ }
530+ }
531+ if (source_image->get_channels ()==4 ){
532+ for (int i = 0 ; i < source_image->get_width () ; i++ ) {
533+ // image de départ à 4 canaux pour une arrivée en 3 canaux
534+ int red = *(source+i*4 );
535+ int green = *(source+i*4 +1 );
536+ int blue = *(source+i*4 +2 );
537+ int alpha = *(source+i*4 +3 );
538+ red = red < 0 ? 0 : (red > 255 ? 255 : red);
539+ green = green < 0 ? 0 : (green > 255 ? 255 : green);
540+ blue = blue < 0 ? 0 : (blue > 255 ? 255 : blue);
541+ alpha = alpha < 0 ? 0 : (alpha > 255 ? 255 : alpha);
542+ int s_red = wta->source [0 ];
543+ int s_green = wta->source [1 ];
544+ int s_blue = wta->source [2 ];
545+ int s_alpha = wta->source [3 ];
546+
547+ if (red>=s_red-wta->tolerance && red<=s_red+wta->tolerance &&
548+ green>=s_green-wta->tolerance && green<=s_green+wta->tolerance &&
549+ blue>=s_blue-wta->tolerance && blue<=s_blue+wta->tolerance &&
550+ alpha>=s_alpha-wta->tolerance && alpha<=s_alpha+wta->tolerance ){
551+ * ( buffer+i*3 ) = (T) wta->destination [0 ];
552+ * ( buffer+i*3 +1 ) = (T) wta->destination [1 ];
553+ * ( buffer+i*3 +2 ) = (T) wta->destination [2 ];
554+ }
555+ else {
556+ * ( buffer+i*3 ) = (T) red;
557+ * ( buffer+i*3 +1 ) = (T) green;
558+ * ( buffer+i*3 +2 ) = (T) blue;
559+ }
560+ }
561+ }
562+ break ;
563+ case 4 :
564+ if (source_image->get_channels ()==3 ){
565+ for (int i = 0 ; i < source_image->get_width () ; i++ ) {
566+ // image de départ à 3 canaux pour une arrivée en 4 canaux
567+ int red = *(source+i*3 );
568+ int green = *(source+i*3 +1 );
569+ int blue = *(source+i*3 +2 );
570+ red = red < 0 ? 0 : (red > 255 ? 255 : red);
571+ green = green < 0 ? 0 : (green > 255 ? 255 : green);
572+ blue = blue < 0 ? 0 : (blue > 255 ? 255 : blue);
573+ int s_red = wta->source [0 ];
574+ int s_green = wta->source [1 ];
575+ int s_blue = wta->source [2 ];
576+
577+ if (red>=s_red-wta->tolerance && red<=s_red+wta->tolerance &&
578+ green>=s_green-wta->tolerance && green<=s_green+wta->tolerance &&
579+ blue>=s_blue-wta->tolerance && blue<=s_blue+wta->tolerance ){
580+ * ( buffer+i*4 ) = (T) wta->destination [0 ];
581+ * ( buffer+i*4 +1 ) = (T) wta->destination [1 ];
582+ * ( buffer+i*4 +2 ) = (T) wta->destination [2 ];
583+ * ( buffer+i*4 +3 ) = (T) wta->destination [3 ];
584+ }
585+ else {
586+ * ( buffer+i*4 ) = (T) red;
587+ * ( buffer+i*4 +1 ) = (T) green;
588+ * ( buffer+i*4 +2 ) = (T) blue;
589+ * ( buffer+i*4 +3 ) = (T) 255 ;
590+ }
591+ }
592+ }
593+ if (source_image->get_channels ()==4 ){
594+ for (int i = 0 ; i < source_image->get_width () ; i++ ) {
595+ // image de départ à 4 canaux pour une arrivée en 4 canaux
596+ int red = *(source+i*4 );
597+ int green = *(source+i*4 +1 );
598+ int blue = *(source+i*4 +2 );
599+ int alpha = *(source+i*4 +3 );
600+ red = red < 0 ? 0 : (red > 255 ? 255 : red);
601+ green = green < 0 ? 0 : (green > 255 ? 255 : green);
602+ blue = blue < 0 ? 0 : (blue > 255 ? 255 : blue);
603+ alpha = alpha < 0 ? 0 : (alpha > 255 ? 255 : alpha);
604+ int s_red = wta->source [0 ];
605+ int s_green = wta->source [1 ];
606+ int s_blue = wta->source [2 ];
607+ int s_alpha = wta->source [3 ];
608+
609+ if (red>=s_red-wta->tolerance && red<=s_red+wta->tolerance &&
610+ green>=s_green-wta->tolerance && green<=s_green+wta->tolerance &&
611+ blue>=s_blue-wta->tolerance && blue<=s_blue+wta->tolerance &&
612+ alpha>=s_alpha-wta->tolerance && alpha<=s_alpha+wta->tolerance ){
613+ * ( buffer+i*4 ) = (T) wta->destination [0 ];
614+ * ( buffer+i*4 +1 ) = (T) wta->destination [1 ];
615+ * ( buffer+i*4 +2 ) = (T) wta->destination [2 ];
616+ * ( buffer+i*4 +3 ) = (T) wta->destination [3 ];
617+ }
618+ else {
619+ * ( buffer+i*4 ) = (T) red;
620+ * ( buffer+i*4 +1 ) = (T) green;
621+ * ( buffer+i*4 +2 ) = (T) blue;
622+ * ( buffer+i*4 +3 ) = (T) alpha;
623+ }
624+ }
625+ }
626+ break ;
627+ }
628+
629+ space = width * sizeof ( T ) * channels;
630+ }
631+
492632 if (style->palette_defined ()){
493633 switch ( channels ) {
494634 case 4 :
@@ -541,6 +681,16 @@ StyledImage *StyledImage::create(Image *input_image, Style *input_style) {
541681 return NULL ;
542682 }
543683 }
684+ if (input_style->colorize_defined ()){
685+ if (input_image->get_channels ()!=3 && input_image->get_channels ()!=4 ){
686+ BOOST_LOG_TRIVIAL (error)<<" Ce style ne s'applique que sur une image source à trois ou quatre canaux" ;
687+ return NULL ;
688+ }
689+ if (input_style->palette_defined ()){
690+ BOOST_LOG_TRIVIAL (error)<<" Le style colorize n'est pas compatible avec une palette" ;
691+ return NULL ;
692+ }
693+ }
544694 return new StyledImage (input_image,input_style,offset);
545695
546696}
@@ -570,6 +720,9 @@ void StyledImage::print() {
570720 if (style->terrainrgb_defined ()){
571721 BOOST_LOG_TRIVIAL (info) << " --------- Terrainrgb -----------" ;
572722 }
723+ if (style->colorize_defined ()){
724+ BOOST_LOG_TRIVIAL (info) << " --------- Colorize -----------" ;
725+ }
573726 if (style->palette_defined ()){
574727 BOOST_LOG_TRIVIAL (info) << " --------- Palette -----------" ;
575728 }
0 commit comments