RSS Bild Histogramm mit PHP - Darstellung RGB und CMYK

verfasst 29.01.2010 von MediaCix | kurze URL: /t917 | Kommentar schreiben

Bild Histogramm mit PHP - Darstellung RGB und CMYK

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
<?php
// Farbinformationen ermitteln
$rgb ImageColorsForIndex($this->imImageColorAt($this->im$x$y));
?>


$rgb ist dann ein Array mit den Keys red, green und blue die einen Wert zwischen 0 bis 255 enthalten. Damit wird dann ein Array gefüttert und mitgezählt. Nun können die ermittelten Werte als Linien in ein neues Bild gezeichnet werden. Und hier kommt jetzt der oben erwähnte Haken ins Spiel.

Besteht das Histogramm nur aus einfachen Linien, können die Linien schon beim auslesen der Werte gezeichnet werden. Hier würde dann eine Zwischenspeicherung entfallen. Das oben gezeigte Bildspiel basiert auf ImageFilledPolygon (zeichnen von Vielecken). Damit lassen sich zum Beispiel Flächendiagramme oder sonstige Figuren zeichnen. Nachteil bei ImageFilledPolygon ist allerdings, dass alle ermittelten Werte als Array übergeben muss. Im Klartset bedeutet das wie folgt:

- alle Werte in Array oder Object einlesen
- zusätzlich aus ermittelten Werten neue X und Y-Positionen berechnen (für jede Farbe extra)
- Postionen nun als Array der Funktion ImageFilledPolygon übergeben (für jede Farbe extra)

Der Haken ist nun, dass hier weit mehr Speicher verbraucht wird, als beim einfachen Linien-Diagramm was ggf. zur Laufzeit gezeichnet werden kann.

Die Anzeige der CMYK-Werte wird zur Laufzeit aus den RGB-Werten berechnet, wobei ich hier sehr unterschiedliche Formeln zur Bestimmung von K (schwarz) gefunden habe. Letzlich habe ich dann folgenes Verfahren benutzt:

» PHP
<?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->imimagecolorat($this->im$x$y));

 
$r $rgb['red'];
 
$g $rgb['green'];
 
$b $rgb['blue'];

 if ( 
$g 254 && $b 254 $c_arrayround(($g+$b)/2) ] += 1// Cyan
 
if ( $r 254 && $b 254 $m_arrayround(($r+$b)/2) ] += 1// Magenta
 
if ( $r 254 && $g 254 $y_arrayround(($r+$g)/2) ] += 1// Yellow

 
$hell round(0.2125*$r 0.7154*$g 0.0721*$b); // Key
 
if ( $hell 254 $k_array[$hell] += 1;

}
}
?>


Das Gitternetz und der Farbverlauf besteht aus einfachen Linien.

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


Andere Möglichkeiten für einen Farbverlauf wäre zum Beispiel diese:
Farbverlauf mit GDlib

Und zum Schluss noch 2 Online-Beispiele:

Online-Beispiel mit ImageFilledPolygon ohne Füllung
Online-Beispiel mit ImageFilledPolygon mit Füllung

neuen Kommentar schreiben

Ich möchte automatisch eine E-Mail bei neuen Kommentaren erhalten.



Themen mit ähnlichen Inhalten


Tags zum Beitrag

histogramm     luminosity     imagefilledpolygon