PHP Conference Japan 2024

Imagick::getImageHistogram

(PECL imagick 2, PECL imagick 3)

Imagick::getImageHistogram获取图像直方图

描述

public Imagick::getImageHistogram(): array

返回图像直方图,作为 ImagickPixel 对象数组。

参数

此函数没有参数。

返回值

返回图像直方图,作为 ImagickPixel 对象数组。

错误/异常

出错时抛出 ImagickException。

示例

示例 #1 生成 Imagick::getImageHistogram()

<?php
function getColorStatistics($histogramElements, $colorChannel) {
$colorStatistics = [];

foreach (
$histogramElements as $histogramElement) {
$color = $histogramElement->getColorValue($colorChannel);
$color = intval($color * 255);
$count = $histogramElement->getColorCount();

if (
array_key_exists($color, $colorStatistics)) {
$colorStatistics[$color] += $count;
}
else {
$colorStatistics[$color] = $count;
}
}

ksort($colorStatistics);

return
$colorStatistics;
}



function
getImageHistogram($imagePath) {

$backgroundColor = 'black';

$draw = new \ImagickDraw();
$draw->setStrokeWidth(0); //线条尽可能细

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

$histogramWidth = 256;
$histogramHeight = 100; //每个RGB分量的图高

$imagick = new \Imagick(realpath($imagePath));
//调整图像大小,否则PHP容易内存溢出
//这可能导致对“像素化”严重的图像产生不良结果
$imagick->adaptiveResizeImage(200, 200, true);
$histogramElements = $imagick->getImageHistogram();

$histogram = new \Imagick();
$histogram->newpseudoimage($histogramWidth, $histogramHeight * 3, 'xc:black');
$histogram->setImageFormat('png');

$getMax = function ($carry, $item) {
if (
$item > $carry) {
return
$item;
}
return
$carry;
};

$colorValues = [
'red' => getColorStatistics($histogramElements, \Imagick::COLOR_RED),
'lime' => getColorStatistics($histogramElements, \Imagick::COLOR_GREEN),
'blue' => getColorStatistics($histogramElements, \Imagick::COLOR_BLUE),
];

$max = array_reduce($colorValues['red'] , $getMax, 0);
$max = array_reduce($colorValues['lime'] , $getMax, $max);
$max = array_reduce($colorValues['blue'] , $getMax, $max);

$scale = $histogramHeight / $max;

$count = 0;
foreach (
$colorValues as $color => $values) {
$draw->setstrokecolor($color);

$offset = ($count + 1) * $histogramHeight;

foreach (
$values as $index => $value) {
$draw->line($index, $offset, $index, $offset - ($value * $scale));
}
$count++;
}

$histogram->drawImage($draw);

header( "Content-Type: image/png" );
echo
$histogram;
}

?>

添加备注

用户贡献的备注 1 条备注

Iddles
13年前
我花了一段时间才弄清楚为什么这只会返回一个彩色像素列表,而似乎没有颜色计数。事实证明,由于某种原因,ImagickPixel 类有一个“getColorCount”方法,这似乎是一个奇怪的地方,但不管怎样。

<?php
$image
= new Imagick("thing.png");
$pixels=$image->getImageHistogram();
foreach(
$pixels as $p){
$colors = $p->getColor();
foreach(
$colors as $c){
print(
"$c\t" );
}
print(
"\t:\t" . $p->getColorCount() . "\n" );
}
?>

这将打印类似以下内容

252 250 252 1 : 125
194 156 182 1 : 126
109 18 79 1 : 11440
2 117 162 1 : 12761
255 255 255 1 : 40769

…其中列为红色、绿色、蓝色、alpha,后跟该颜色在图像中出现的次数。
To Top