Imagick::getImageHistogram

(PECL imagick 2, PECL imagick 3)

Imagick::getImageHistogramGörüntünün renk dağılımını döndürür

Açıklama

public Imagick::getImageHistogram(): array

Görüntünün renk dağılımını bir ImagickPixel nesneleri dizisi olarak döndürür.

Değiştirgeler

Bu işlevin değiştirgesi yoktur.

Dönen Değerler

Görüntünün renk dağılımını bir ImagickPixel nesneleri dizisi olarak döndürür.

Hatalar/İstisnalar

Hata durumunda bir ImagickException istisnası oluşur.

Örnekler

Örnek 1 - Imagick::getImageHistogram() kullanımı

<?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); // çizgiler mümkün olduğunca ince olsun

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

    
$histogramWidth 256;
    
$histogramHeight 100// RGB segmanların yüksekliği

    
$imagick = new \Imagick(realpath($imagePath));
    
// görüntüyü küçült, yoksa PHP belleği tükenecek
    // Bu, ister istemez "pikselli" görüntülerde kötü sonuçlara sebep olur
    
$imagick->adaptiveResizeImage(200200true);
    
$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'] , $getMax0);
    
$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;
}

?>

add a note add a note

User Contributed Notes 1 note

up
2
Iddles
12 years ago
Scratched my head for a while trying to figure out why this only returned a list of coloured pixels, and seemingly no colour count. Well it turns out that for some reason, the ImagickPixel class has a "getColorCount" method, which seems a strange place for it but hey.

<?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" );
}
?>

This will print out something like:

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

...where the colums are red, green, blue, alpha, followed by the number of times that colour appears in the image.
To Top