📜  PHP |想象一下 getImageBluePrimary()函数(1)

📅  最后修改于: 2023-12-03 15:03:40.219000             🧑  作者: Mango

PHP | 想象一下 getImageBluePrimary() 函数介绍

在图像处理中,提取图片中的主色调是一项常见的任务。其中,一种常见的需求是提取图片中的主要蓝色调。在 PHP 中,我们可以通过创建 getImageBluePrimary() 函数来实现该需求。

该函数可用于从指定的图像文件中提取主要蓝色调,并返回一个包含该颜色调 RGB 值的数组。下面,我们将会详细讲解这个函数的实现。

函数参数

getImageBluePrimary() 函数接受两个参数:

getImageBluePrimary($imageFilePath, $tolerance = 10)

其中,$imageFilePath 参数为需要提取主要蓝色调的图像文件路径,$tolerance 参数为提取蓝色调时的容差值。容差值默认为 10,越小表示提取颜色时越严格。

函数返回值

getImageBluePrimary() 函数将会返回一个包含主要蓝色调 RGB 值的数组。该数组包含 3 个元素,分别代表该颜色的 R、G、B 值。例如:

Array(
    [0] => 10, // R 值
    [1] => 50, // G 值
    [2] => 200 // B 值
)
函数实现

为了实现获取图像中主要蓝色调的功能,我们需要经过如下几个步骤:

  1. 读取图像文件,并转换为 RGB 模式;
  2. 通过计算每个像素点在 RGB 空间中的距离,找出距离最靠近蓝色的像素点;
  3. 计算所有距离最靠近的像素点的 RGB 值的平均值,得到主要蓝色调。

具体实现如下:

function getImageBluePrimary($imageFilePath, $tolerance = 10) {
  // 读取图像文件,转换为 RGB 模式
  $image = imagecreatefromstring(file_get_contents($imageFilePath));
  imagecolortransparent($image, imagecolorallocatealpha($image, 0, 0, 0, 127));
  imagealphablending($image, false);
  imagesavealpha($image, true);
  imagepalettetotruecolor($image);

  // 定义蓝色色值
  $blue = array(0, 0, 255);

  $width = imagesx($image);
  $height = imagesy($image);

  $pixels = [];
  $pixelCount = 0;

  for($y = 0; $y < $height; $y++) {
    for($x = 0; $x < $width; $x++) {
      $rgb = imagecolorat($image, $x, $y);

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

      $distance = sqrt(pow($r - $blue[0], 2) + pow($g - $blue[1], 2) + pow($b - $blue[2], 2));

      if ($distance <= $tolerance) {
        $pixels[] = [$r, $g, $b];
        $pixelCount++;
      }
    }
  }

  if ($pixelCount == 0) {
    return false; // 未找到蓝色区域
  } else {
    $totalR = 0;
    $totalG = 0;
    $totalB = 0;

    foreach($pixels as $pixel) {
      $totalR += $pixel[0];
      $totalG += $pixel[1];
      $totalB += $pixel[2];
    }

    return [
      round($totalR/$pixelCount),
      round($totalG/$pixelCount),
      round($totalB/$pixelCount)
    ];
  }
}
总结

通过 getImageBluePrimary() 函数,我们可以轻松地从图像文件中提取主要蓝色调,便于我们进行后续的图像处理工作。