Imagick::getImageColors

(PECL imagick 2, PECL imagick 3)

Imagick::getImageColors获取图像中唯一颜色的数量

描述

public Imagick::getImageColors(): int

获取图像中唯一颜色的数量。

参数

此函数没有参数。

返回值

返回一个 int,表示图像中唯一颜色的数量。

添加备注

用户贡献的备注 2 个备注

holdoffhunger at gmail dot com
12 年前
我很难让这个函数返回唯一颜色的数量。此外,我还想能够获得一个数组,其中每个 $key 值都是像素的 RGB,每个 $value 值都是该像素出现的次数。基本上,是一个频率列表。例如,您将有 "1 / 0 / 0" 作为红色 $key 值,以及 "25" 作为该像素颜色在图像中出现的次数。因此,我写了一些代码来做到这一点,使用 readImageFile、getImageWidth、getImageHeight、getImagePixelColor 和一个简单的 x/y 解析器,如下所示

<?php

// 测试文件
// ---------------------------------------------

// 注意:此文件只是一个 5x5 的红色正方形图像
// 在一个巨大的 521x512 的黑色正方形中,
// 然后我做了一些随机的黄色之字形。

$file_to_grab_with_location = "test.bmp";

$imagick_type = new Imagick();

// 打开文件
// ---------------------------------------------

$file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');
$imagick_type->readImageFile($file_handle_for_viewing_image_file);

// 预设信息
// ---------------------------------------------

$frequency_list_of_values = array();

// 解析像素
// ---------------------------------------------

$image_resolution_width = $imagick_type->getImageWidth();
$image_resolution_height = $imagick_type->getImageHeight();

print(
"图像分辨率:宽度 - $image_resolution_width / 高度 - $image_resolution_height<br><br>");

// 解析图像从上到下(Y 变量)
// ---------------------------------------------

for($y = 0; $y < $image_resolution_height; $y++)
{
// 解析图像从左到右(X 变量)
// ---------------------------------------------

for($x = 0; $x < $image_resolution_width; $x++)
{

// 图像像素颜色
// ---------------------------------------------

$pixel_to_examine = $imagick_type->getImagePixelColor($x,$y);

$pixel_to_examine_color_value_red = $pixel_to_examine->getColorValue(imagick::COLOR_RED);
$pixel_to_examine_color_value_green = $pixel_to_examine->getColorValue(imagick::COLOR_GREEN);
$pixel_to_examine_color_value_blue = $pixel_to_examine->getColorValue(imagick::COLOR_BLUE);

// 设置键值
// ---------------------------------------------

$key_value = $pixel_to_examine_color_value_red . " / " .
$pixel_to_examine_color_value_green . " / " .
$pixel_to_examine_color_value_blue ;

// 为颜色递增数组条目
// ---------------------------------------------

if(isset($frequency_list_of_values[$key_value]) == TRUE)
{
$temp = $frequency_list_of_values[$key_value];
$temp++;
$frequency_list_of_values[$key_value] = $temp;
}
else
{
$frequency_list_of_values[$key_value] = 1;
}
}
}

// 打印出值的数组
// ---------------------------------------------

print("<pre>");
print_r($frequency_list_of_values);
print(
"</pre>");

/*

结果:
------------------

图像分辨率:宽度 - 521 / 高度 - 512

Array
(
[1 / 0 / 0] => 25
[0 / 0 / 1] => 264107
[1 / 1 / 0] => 2620
)

*/

?>
amaral dot regis at hotmail dot com
6 年前
之前的例子在 $frequency_list_of_values 变量的键中显示了小数

数组
(
[1 / 0 / 1] => 157295
[0.83529411764706 / 0.87843137254902 / 0.82352941176471] => 1
[0.80392156862745 / 0.84705882352941 / 0.7843137254902] => 2
[0.8156862745098 / 0.84705882352941 / 0.78823529411765] => 1
...

所以我做了一些更改,这将改善结果,对于那些想要知道图像中哪些颜色占主导地位的人,显示带有准确 rgb 值的键
<?php

$file_to_grab_with_location
= $imagepath; // 图像文件的相对路径

$imagick_type = new \Imagick();

$file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');
$imagick_type->readImageFile($file_handle_for_viewing_image_file);

$frequency_list_of_values = array();

$image_resolution_width = $imagick_type->getImageWidth();
$image_resolution_height = $imagick_type->getImageHeight();

print(
"图像分辨率:宽度 - $image_resolution_width / 高度 - $image_resolution_height<br><br>");

for(
$y = 0; $y < $image_resolution_height; $y++)
{

for(
$x = 0; $x < $image_resolution_width; $x++)
{

$pixel_to_examine = $imagick_type->getImagePixelColor($x,$y);

if(isset(
$frequency_list_of_values[$pixel_to_examine->getColorAsString()]) == TRUE)
{
$temp = $frequency_list_of_values[$pixel_to_examine->getColorAsString()];
$temp++;
$frequency_list_of_values[$pixel_to_examine->getColorAsString()] = $temp;
}
else
{
$frequency_list_of_values[$pixel_to_examine->getColorAsString()] = 1;
}
}

arsort($frequency_list_of_values);
}

print(
"<pre>");
print_r($frequency_list_of_values);
print(
"</pre>");

?>

结果
图像分辨率:宽度 - 1965 / 高度 - 998

数组
(
[srgba(255,0,255,0)] => 451654
[srgb(54,52,53)] => 281069
[srgb(177,51,54)] => 130449
[srgb(236,50,55)] => 64001
...

对于非常大的图像,此方法速度很慢,因为它会逐像素分析。
To Top