"Ton" olarak değiştirin

2 Cevap

Ben PHP görüntü işleme fonksiyonlarını kullanarak bir görüntünün "renk" değiştirmek istiyorum. Uygulamak için doğru filtre hangisidir?

Not: olay "renk tonu" benim yorumlama diğerlerinden farklıdır bu yüzden ben, bir photoshop kökenli değilim, burada ne demek istediğim ...

Photoshop, aslında görüntünün tasarımını etkilemeden bir görüntünün rengini değiştirmek için "Hue" filtresi kullanabilirsiniz.

Şu anda benim görüntüleri renklendirmek için aşağıdaki fonksiyonu kullanıyorum ama işlevi nedeniyle tamamen tasarım kaybetme, görüntüyü yeniden boyar gerçeğine benim ihtiyaçlarını karşılamak için başarısız olur.

	function set_theme_color_header($hex)
	{
		$info = hexToRGB($hex); //utility function that converts hex to rgb
		$token = "header.gif";
		$img = imagecreatefromgif("header-template.gif";
		$color = imagecolorallocate($img, $info["red"], $info["green"], $info["blue"]);
		imagecolorset($img, 0, $info["red"], $info["green"], $info["blue"]);
		imagegif($img, $token);
	}
	?>

2 Cevap

Ben tonu değişikliği işlemek PHP hiçbir işlevleri vardır eminim. Ama bunu yapmak için kendi işlevi yazabilirsiniz, burada görüntünün tonunu değiştirmek için adımlar şunlardır:

  1. Piksel görüntü piksel travers
  2. Pikselin RGB renk kullanarak Get imagecolorat()
  3. Bir HSL değeri içine RGB değeri Transform
  4. Renk değerini değiştirin, (Hue 0-360 bir değer) yalnız doygunluğunu ve açıklığını bırakın
  5. RGB geri yeni HSL değerini Dönüşümü
  6. Geçerli pikselin rengini değiştirme

Aslında bu denemek için oldukça ilginç bir şey görünüyor, bu yüzden başka bir çözüm bulmak yoksa ben sadece kendimi bu yapmak ve burada sonrası olabilir.

EDIT

Fonksiyonunu yazdı. PHP tonunu değiştirmek için, RGB ve HSL renk alanlarda ve görüntünün katetme yapan bir fonksiyonu arasında dönüştürmek için işlevler gerekir. Bu biraz çirkin olabilir ama güzel çalışıyor. Daha büyük görüntüler üzerinde oldukça yavaş.

function imagehue(&$image, $angle) {
    if($angle % 360 == 0) return;
    $width = imagesx($image);
    $height = imagesy($image);

    for($x = 0; $x < $width; $x++) {
        for($y = 0; $y < $height; $y++) {
            $rgb = imagecolorat($image, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;            
            $alpha = ($rgb & 0x7F000000) >> 24;
            list($h, $s, $l) = rgb2hsl($r, $g, $b);
            $h += $angle / 360;
            if($h > 1) $h--;
            list($r, $g, $b) = hsl2rgb($h, $s, $l);            
            imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
        }
    }
}

İşte utanmadan http://www.actionscript.org/forums/showthread.php3?t=50746 küçük değişiklikler ile kopyalanmış bir renk alanı, dönüştürmek için gerekli olan yardımcı fonksiyonları bulunuyor:

function rgb2hsl($r, $g, $b) {
   $var_R = ($r / 255);
   $var_G = ($g / 255);
   $var_B = ($b / 255);

   $var_Min = min($var_R, $var_G, $var_B);
   $var_Max = max($var_R, $var_G, $var_B);
   $del_Max = $var_Max - $var_Min;

   $v = $var_Max;

   if ($del_Max == 0) {
      $h = 0;
      $s = 0;
   } else {
      $s = $del_Max / $var_Max;

      $del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
      $del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
      $del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

      if      ($var_R == $var_Max) $h = $del_B - $del_G;
      else if ($var_G == $var_Max) $h = ( 1 / 3 ) + $del_R - $del_B;
      else if ($var_B == $var_Max) $h = ( 2 / 3 ) + $del_G - $del_R;

      if ($h < 0) $h++;
      if ($h > 1) $h--;
   }

   return array($h, $s, $v);
}

function hsl2rgb($h, $s, $v) {
    if($s == 0) {
        $r = $g = $B = $v * 255;
    } else {
        $var_H = $h * 6;
        $var_i = floor( $var_H );
        $var_1 = $v * ( 1 - $s );
        $var_2 = $v * ( 1 - $s * ( $var_H - $var_i ) );
        $var_3 = $v * ( 1 - $s * (1 - ( $var_H - $var_i ) ) );

        if       ($var_i == 0) { $var_R = $v     ; $var_G = $var_3  ; $var_B = $var_1 ; }
        else if  ($var_i == 1) { $var_R = $var_2 ; $var_G = $v      ; $var_B = $var_1 ; }
        else if  ($var_i == 2) { $var_R = $var_1 ; $var_G = $v      ; $var_B = $var_3 ; }
        else if  ($var_i == 3) { $var_R = $var_1 ; $var_G = $var_2  ; $var_B = $v     ; }
        else if  ($var_i == 4) { $var_R = $var_3 ; $var_G = $var_1  ; $var_B = $v     ; }
        else                   { $var_R = $v     ; $var_G = $var_1  ; $var_B = $var_2 ; }

        $r = $var_R * 255;
        $g = $var_G * 255;
        $B = $var_B * 255;
    }    
    return array($r, $g, $B);
}

Ve son olarak, bir kullanım örneği. Bu örnek, bir resim açar, 180 ° de renk değiştirir ve tarayıcı çıkışlar:

header('Content-type: image/png');
$image = imagecreatefrompng('image.png');
imagehue($image, 180);
imagepng($image);

Tonu açısı 0, 360, 720 vererek, dereceye ayarlanır veya 360 herhangi birden fazla görüntüye hiçbir değişime neden olacak gibi.

Normalde doğrudan tonunu işleyebilirsiniz hangi noktadan, RGB to HSL renk alana dönüştürmek istiyorum. Ne istediğinizi yaptık, RGB geri dönüştürün.