在PHP GD中,我如何确定像素是否为红色阴影?

时间:2013-09-20 03:40:03

标签: php gd

我想创建一种“除红色之外的所有灰度”效果。要做到这一点,我有这个代码

<?php
    header('content-type: image/png');
    $image = imagecreatefrompng('a.png');
    imagefilter($image, IMG_FILTER_GRAYSCALE);
    imagepng($image);
    imagedestroy($image);
?>

从这里开始,我计划循环原始的a.png像素,并在过滤后将任何红色阴影设置在其上。

2 个答案:

答案 0 :(得分:2)

您是否在询问如何判断像素是否为红色?您可以使用imagecolorat

$col = imagecolorat($image, $x, $y);

这是RGB的颜色'($ col&gt;&gt; 16)&amp; 0xFF'是红色组件。现在你不能只检查红色组件,因为其他组件可能会将其更改为更紫色或橙色,这取决于你想要走多远,但如果红色比绿色或蓝色更多,那么这样的事情将是真的:

$r = ($col >> 16) & 0xFF;
$g = ($col >> 8) & 0xFF;
$b = $col & 0xFF;

$limit = 2; // Aim for 2 times more red 

$is_red = ($r / $limit) > ($g + $b);

您可以使用$limit或尝试不同的逻辑。

可能已有GD过滤器可以执行此操作,但我不熟悉过滤器。

编辑

这看起来像将来可能有用的东西,所以我敲了一个小功能来做:

function colorInGreyFilter($im, $limit = 1.5, $rgb_choice = 0) { 

  $sx = imagesx($im); 
  $sy = imagesy($im); 

  for ($x = 0; $x < $sx; $x++ ) {
    for ($y = 0; $y < $sy; $y++ ) {

      // Get the color and split the RGB values into an array 
      $col = imagecolorat($im, $x, $y);
      $rgb = array( ($col >> 16) & 0xFF, ($col >> 8) & 0xFF, $col & 0xFF );

      // Get the rgb value we're intested in;
      $trg_col = $rgb[$rgb_choice]; 

      // If the value of the target color is more than $limit times
      // the sum of the other colors then we use that pixel so 
      // we only greyscale the pixel if it's less ...
      if (($trg_col / $limit) < (array_sum($rgb) - $trg_col)) {

        // Use the average of the values as the setting 
        // for the grey scale RGB values
        $avg = (array_sum($rgb) / 3) & 0xFF;;
        $col = ($avg <<16) + ($avg << 8) + $avg;
        imagesetpixel($im, $x, $y, $col);

      }
      /* 
       else { 
         Could have the option of taking a target image that's already 
     filtered, so here we would copy the pixel to the target 
       }
      */
    }
  }
}

这会拍摄图像并将灰度算法应用于除符合条件的像素之外的所有像素。您可以更改限制并选择使用红色,绿色或蓝色作为主要颜色:

colorInGreyFilter($im);        // Greyscale with red highlights (the default)
colorInGreyFilter($im, .5, 1); // Greyscale with lots of green left
colorInGreyFilter($im,  2, 2); // Greyscale with only the bluest blue left

它使用RGB值的简单平均值进行灰度化 - 这是好的但不像GD过滤器那样精致 - 因此良好的扩展可选择性地允许预过滤的目标图像。

答案 1 :(得分:0)

语法

int imagecolorat ( resource $image , int $x , int $y )

返回由image

指定的图像中指定位置的像素颜色的索引

如果PHP是针对GD库2.0或更高版本编译的,并且图像是真彩色图像,则此函数将该像素的RGB值作为整数返回。使用位移和屏蔽来访问不同的红色,绿色和蓝色分量值

示例:

<?php
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

var_dump($r, $g, $b);
?>