Wie bereits beim Beitrag Bild Histogramm mit PHP - Darstellung Luminosity angekündigt hier nun der zweiter Teil zum Thema Bild Histogramme mit PHP. Diesmal geht es aber nicht um die Helligkeit des Bild, sondern um die Anteile von RGB und CMYK. Auch hier werden kurze PHP-Codeschnipsel gezeigt und mittels Beispielen kurz erklärt.
Erfassung der RGB-Anteile
[bild]1524[/bild]
Diesmal wird das Abtasten des Bildes etwas rechenintensiven. Wie bei der Helligkeitsermittlung wird auch hier das Bild in einen bestimmtes Raster eingeteilt, was dann abgetastet wird. Allerdings werden hier bei RGB 3 Farbwerte und bei CMYK 4 Farbwerte ermittelt und in ein Array gespeichert. Das jeweilige PHP-Script verbraucht nun reichlich Arbeitspeicher. Zum einen muss das Originalbild in den Speicher geladen werden, alle Farbwerte müssen gespeichert werden und am Schluss muss ein neues Bild erstellt werden. Wobei es hier einen kleinen Haken gibt, aber gleich mehr.
Um die Farbwerte zu erhalten, gibt es folgende Möglichkeit:
<?php
// Farbinformationen ermitteln
$rgb = ImageColorsForIndex($this->im, ImageColorAt($this->im, $x, $y));
?> <?php
// Originalbild nach Anteile abtasten
for ($x = 1; $x < $this->im_bb; $x += $this->raster ) {
for ($y = 1; $y < $this->im_hh; $y += $this->raster ) {
// Farbinformationen ermitteln
$rgb = imagecolorsforindex($this->im, imagecolorat($this->im, $x, $y));
$r = $rgb['red'];
$g = $rgb['green'];
$b = $rgb['blue'];
if ( $g < 254 && $b < 254 ) $c_array[ round(($g+$b)/2) ] += 1; // Cyan
if ( $r < 254 && $b < 254 ) $m_array[ round(($r+$b)/2) ] += 1; // Magenta
if ( $r < 254 && $g < 254 ) $y_array[ round(($r+$g)/2) ] += 1; // Yellow
$hell = round(0.2125*$r + 0.7154*$g + 0.0721*$b); // Key
if ( $hell < 254 ) $k_array[$hell] += 1;
}
}
?> <?php
/*
Histogramm Farbverlauf
$this->lMargin = Abstand links
$this->rMargin = Abstand rechts
$this->bMargin = Abstand unten
$this->new_im_bb = Breite vom Bild
*/
function _set_verlauf() {
for ($x = $this->lMargin; $x < $this->new_im_bb - $this->rMargin; $x++ ) {
$c = ($x * 255) / ($this->new_im_bb-$this->rMargin);
$col = ImageColorAllocate($this->new_im, $c, $c, $c);
ImageLine($this->new_im,
$x, $this->new_im_hh - $this->bMargin-10,
$x, $this->new_im_hh - $this->bMargin,
$col );
}
}
?>