获取图像颜色

Posted

技术标签:

【中文标题】获取图像颜色【英文标题】:Get image color 【发布时间】:2010-12-17 07:41:51 【问题描述】:

我想在 div 或表格中显示图像作为背景。如果它们的图像不够大,我将需要找到该图像的最外层颜色并将其应用于包含 div 或表格单元格的背景。

有人有这方面的经验吗?在 php 中。我是菜鸟,请解释一下。非常感谢

【问题讨论】:

【参考方案1】:

查看GD functions。

这里有一个looping through the pixels 的解决方案,可以找到最常见的颜色。但是,you could just resize the image to 1 pixel - 这应该是平均颜色 - 对吧?

1px 方法的示例(现在包括测试页面):

<?php
  $filename = $_GET['filename'];    
  $image = imagecreatefromjpeg($filename);
  $width = imagesx($image);
  $height = imagesy($image);
  $pixel = imagecreatetruecolor(1, 1);
  imagecopyresampled($pixel, $image, 0, 0, 0, 0, 1, 1, $width, $height);
  $rgb = imagecolorat($pixel, 0, 0);
  $color = imagecolorsforindex($pixel, $rgb);
?>
<html>
  <head>
    <title>Test Image Average Color</title>
  </head>
  <body style='background-color: rgb(<?php echo $color['red'] ?>, <?php echo $color['green'] ?>, <?php echo $color['blue'] ?>)'>
    <form action='' method='get'>
      <input type='text' name='filename'><input type='submit'>
    </form>
    <img src='<?php echo $filename ?>'>
  </body>
</html>

这里是一些用于查找平均 border 颜色的示例代码,类似于第一个链接。对于您的使用,这可能会更好(我知道这段代码效率低下,但希望它很容易理解):

<?php
  $filename = $_GET['filename'];    
  $image = imagecreatefromjpeg($filename);
  $width = imagesx($image);
  $height = imagesy($image);

  for($y = 0; $y < $height; $y++)
    $rgb = imagecolorat($image, 0, $y);
    $color = imagecolorsforindex($image, $rgb);
    $red += $color['red'];
    $green += $color['green'];
    $blue += $color['blue'];

    $rgb = imagecolorat($image, $width -1, $y);
    $color = imagecolorsforindex($image, $rgb);
    $red += $color['red'];
    $green += $color['green'];
    $blue += $color['blue'];
  

  for($x = 0; $x < $height; $x++)
    $rgb = imagecolorat($image, $x, 0);
    $color = imagecolorsforindex($image, $rgb);
    $red += $color['red'];
    $green += $color['green'];
    $blue += $color['blue'];

    $rgb = imagecolorat($image, $x, $height -1);
    $color = imagecolorsforindex($image, $rgb);
    $red += $color['red'];
    $green += $color['green'];
    $blue += $color['blue'];
  

  $borderSize = ($height=$width)*2;
  $color['red'] = intval($red/$borderSize);
  $color['green'] = intval($green/$borderSize);
  $color['blue'] = intval($blue/$borderSize);

?>

更新:我放了一些more refined code on github。这包括平均边界和平均整个图像。需要注意的是,调整到 1px 比扫描每个像素更节省资源(虽然我没有运行任何实时测试),但代码确实显示了三种不同的方法。

【讨论】:

抱歉,我是初学者,我该如何将它应用到 div 中作为背景颜色?任何想法蒂姆。也感谢您提出这个建议,这意味着很多。 我为完整的“测试页”添加了代码。这应该为您指明正确的方向。 非常感谢蒂姆。我不希望你的工作被闲置,但我仍然没有开始工作。 riptapparel.com/test/get-image-color.php 是测试...我不确定 " 和 ' 是否被混淆等。此外,一旦我将这个新代码放入,我如何将它调用到 div 的背景?就像你的第一个例子一样,我假设?感谢并为您的烦恼感到抱歉。 只需将第一个示例中的初始 php 代码块(包括 HTML)替换为第二个示例即可。 在将“filename”替换为“image.jpg”后,我不断收到这些错误警告:imagecreatefromjpeg() [function.imagecreatefromjpeg]:/path/get-image-color.php 中的文件名不能为空第 3 行警告:imagesx():提供的参数不是 /path/get-image-color.php 中的有效图像资源 第 4 行警告:imagesy():提供的参数不是 /path/get 中的有效图像资源第 5 行 -image-color.php 警告:第 36 行 /path/get-image-color.php 中除以零警告:第 37 行 /path/get-image-color.php 中除以零

以上是关于获取图像颜色的主要内容,如果未能解决你的问题,请参考以下文章

在图像中获取颜色代码[关闭]

如何从图像中获取像素的颜色?

Android imageview从缩放图像中获取像素颜色

从打开的 CV 图像中获取颜色为整数格式 [重复]

如何使用python对相同颜色的图像区域进行分组并获取其坐标而忽略背景颜色

如何从脚本的纯色图像中获取十六进制颜色代码?