Цветове на снимка

dakata__92

Super Moderator
Имам един логически проблем с който не успявам да се справя явно... Та имам някаква снимка на която извеждам даден набор от цветова гама и примерно мога спокойно да въведа всеки цвят в дадена табличка и да го визоализирам в последствие. Става дума за нещо подобно:
<table><tr><td width='20' height='20' title=\"#000000\" bgcolor=\"000000\"></td></tr></table>

Та имам дадено изображение в случая 1.jpg! Извеждам даден набор от цветове и снимката се визоализира под формата на цветови код. Ето и снимка с разяснение какво извежда кода по-долу :
6537304R.png


Интересува ме как мога в долупоказания код да заменя близките по нюанс цветове с някаква цифра. Тоест да заменя всички цветове с даден номер но нюансите примерно на черно да попадат в този номер. Примерно имам цветовете 000000 (черно) и 202020 което си е нюанс на черното. Искам да се замени 000000 с цифрата 0, но и нюансите на черното като 202020 също да е с 0! Това важи за всички цветове в дадената снимка. Искам да намаля обема на визуализирания код от цветовете, от 6 цифрено и буквено показване на цифрово или буквено показване на даден цвят с 1 цифра или буква.
Код:
Малко неясно се изразих ноо съм отворен за идеи :) Интересува ме и как да разгранича фона, който в случая е черен от останалия цвят ?
 
Никога не бих се захванал с такова нещо, но се оказа, че все пак Аз има една идея:

Идеята ми е следната .. понеже бачкаш с цветове в HEX вид, а там са разбъркани числа и букви. Не може ли да ги конвертираш към RGB или HSL и да провериш процентите и така бачкаш само с числа и ще ти е по лесно да ги закруглиш и да определиш тоновете .

Пример с RGB:
PHP:
function hex2rgb($hex) { // return array [0] => R / [1] => G  / [2] => B
   $hex = str_replace("#", "", $hex);

   if(strlen($hex) == 3) {
      $r = hexdec(substr($hex,0,1).substr($hex,0,1));
      $g = hexdec(substr($hex,1,1).substr($hex,1,1));
      $b = hexdec(substr($hex,2,1).substr($hex,2,1));
   } else {
      $r = hexdec(substr($hex,0,2));
      $g = hexdec(substr($hex,2,2));
      $b = hexdec(substr($hex,4,2));
   }
   $rgb = array($r, $g, $b);
   //return implode(",", $rgb); // returns the rgb values separated by commas
   return $rgb; // returns an array with the rgb values
}

 $color = "#313140"; // twiq cvqt
 $sep = hex2rgb($color);
 $r = $sep[0]; // R 
 $g = $sep[1]; // G 
 $b = $sep[2]; // B 
 
  if($r > 200 AND $g > 200 AND $b > 200){  $r = 255; $b = 255; $g=255; }
  if($r < 50 AND $g < 50 AND $b < 50){  $r = 0; $b = 0; $g=0; }


Пирмер с HSL:



PHP:
function HexHSL( $HexColor ) // ВРЪЩА -> [Hue] => 0 [Saturation] => 0 [Luminance] => 79 
{

        $HexColor    = str_replace( '#', '', $HexColor );

        if( strlen( $HexColor ) < 3 ) str_pad( $HexColor, 3 - strlen( $HexColor ), '0' );

        $Add         = strlen( $HexColor ) == 6 ? 2 : 1;
        $AA          = 0;
        $AddOn       = $Add == 1 ? ( $AA = 16 - 1 ) + 1 : 1;

        $Red         = round( ( hexdec( substr( $HexColor, 0, $Add ) ) * $AddOn + $AA ) / 255, 6 );
        $Green       = round( ( hexdec( substr( $HexColor, $Add, $Add ) ) * $AddOn + $AA ) / 255, 6 );
        $Blue        = round( ( hexdec( substr( $HexColor, ( $Add + $Add ) , $Add ) ) * $AddOn + $AA ) / 255, 6 );


        $HSLColor    = array( 'Hue' => 0, 'Saturation' => 0, 'Luminance' => 0 );

        $Minimum     = min( $Red, $Green, $Blue );
        $Maximum     = max( $Red, $Green, $Blue );

        $Chroma      = $Maximum - $Minimum;


        $HSLColor['Luminance'] = ( $Minimum + $Maximum ) / 2;

        if( $Chroma == 0 )
        {
                $HSLColor['Luminance'] = round( $HSLColor['Luminance'] * 255, 0 );

                return $HSLColor;
        }


        $Range = $Chroma * 6;


        $HSLColor['Saturation'] = $HSLColor['Luminance'] <= 0.5 ? $Chroma / ( $HSLColor['Luminance'] * 2 ) : $Chroma / ( 2 - ( $HSLColor['Luminance'] * 2 ) );

        if( $Red <= 0.004 || $Green <= 0.004 || $Blue <= 0.004 )
                $HSLColor['Saturation'] = 1;


        if( $Maximum == $Red )
        {
                $HSLColor['Hue'] = round( ( $Blue > $Green ? 1 - ( abs( $Green - $Blue ) / $Range ) : ( $Green - $Blue ) / $Range ) * 255, 0 );
        }
        else if( $Maximum == $Green )
        {
                $HSLColor['Hue'] = round( ( $Red > $Blue ? abs( 1 - ( 4 / 3 ) + ( abs ( $Blue - $Red ) / $Range ) ) : ( 1 / 3 ) + ( $Blue - $Red ) / $Range ) * 255, 0 );
        }
        else
        {
                $HSLColor['Hue'] = round( ( $Green < $Red ? 1 - 2 / 3 + abs( $Red - $Green ) / $Range : 2 / 3 + ( $Red - $Green ) / $Range ) * 255, 0 );
        }




        $HSLColor['Saturation'] = round( $HSLColor['Saturation'] * 255, 0 );
        $HSLColor['Luminance']  = round( $HSLColor['Luminance'] * 255, 0 );



        return $HSLColor; // ВРЪЩА -> [Hue] => 0 [Saturation] => 0 [Luminance] => 79 


}

$Color =  "#265CFF";
$hsl = HexHSL( $Color ) ;

$hue = $hsl['Hue']; // цвят
$sat = $hsl['Saturation']; // наситеност
$lum = $hsl['Luminance']; // яркост 

if($lum < 13){ $lum = 0;  } if($lum > 80){ $lum = 100;  }
if($sat < 50){ $sat = 0;  } if($sat > 50){ $sat = 100;  }

$color = "<div style=\"padding:300px;background: hsl($hue, $sat, $lum);\"></div>";
echo $color;

ЕДИТ: полезни и подобни статии:
1. http://stackoverflow.com/questions/1890409/change-hue-of-an-image-with-php-gd-library
2. http://stackoverflow.com/questions/5098583/how-do-i-make-a-lighter-version-of-a-colour-using-php
3.http://www.charles-reace.com/test/colors.php?color=123456
Дано съм помогнал .. :?:
 
Принципно идеята ми е да успея да филтрирам тази така видна за хората шестица която се получи на снимката. Искам да отсея расейките след извеждането на информацията в подобен вид (HEX), но да запазя изображението. Все още се чудя как в последствие да се разпознае цифрата... В случая с кодовете които си дал изображението се разваля и не се получава правилно замяната на цветовете. Идеите са ти добри като цяло но не са това, което питам. Може да не съм го обяснил правилно, но за по-просто ще кажа, че желая да се личи по-добре цифрата след извеждането :)
 
Справих се с това което желаех! Не съм се усетил от къде идва проблема в зародиш! Тааа с малко прости добавки се получи. По-рано повдигнах друг въпрос а той е как да разбера коя е цифрата след като съм я отпечатал ред по ред и съм филтрирал ненужните цветове. Какво се получи:
6538666y.png

Мисля да броя цветовете на всеки ред и при определен брой или вариация да извежда определена цифра. Някой да има по-добри идеи ? :)
 

Back
Горе