Signatur
Beschreibung
ImagickPixelIterator ist eine Klasse der Imagick-Erweiterung, die einen effizienten, zeilenweisen Zugriff auf die einzelnen Pixel eines Bildes bietet. Statt das gesamte Bild in den Speicher zu laden, können die Pixel Zeile für Zeile abgerufen und verändert werden, was den Speicherverbrauch bei großen Bildern deutlich senkt.
Jede Zeile wird als Array von ImagickPixel-Objekten zurückgegeben. Über diese Objekte lassen sich Farbwerte lesen und schreiben. Nach dem Bearbeiten einer Zeile muss syncIterator() aufgerufen werden, damit die Änderungen in das Bild übernommen werden.
Typische Anwendungsfälle sind Pixelfilter, Farbersetzungen, Histogramm-Analysen oder das Einlesen von Bilddaten für weitere Verarbeitung. Der Iterator kann vorwärts (getNextIteratorRow()), rückwärts (getPreviousIteratorRow()) oder zufällig (setIteratorRow()) positioniert werden.
Hinweis: ImagickPixelIterator kann direkt instanziiert werden oder über die Methode Imagick::getPixelIterator() bzw. Imagick::getPixelRegionIterator() erzeugt werden. Letztere ermöglicht den Zugriff auf einen rechteckigen Ausschnitt des Bildes.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $wand Pflicht | Imagick | Das Imagick-Objekt, über dessen Pixel iteriert werden soll. |
Rückgabewert
Beispiele
Alle Pixel eines Bildes aufhellen
<?php
$imagick = new Imagick('foto.jpg');
$iterator = new ImagickPixelIterator($imagick);
foreach ($iterator as $row) {
/** @var ImagickPixel $pixel */
foreach ($row as $pixel) {
$color = $pixel->getColor();
$r = min(255, (int)($color['r'] * 1.2));
$g = min(255, (int)($color['g'] * 1.2));
$b = min(255, (int)($color['b'] * 1.2));
$pixel->setColor("rgb($r,$g,$b)");
}
$iterator->syncIterator();
}
$imagick->writeImage('foto_aufgehellt.jpg');
$imagick->destroy();
Bestimmte Farbe durch eine andere ersetzen (Farbersatz)
<?php
$imagick = new Imagick('logo.png');
// Nur eine Region des Bildes iterieren
$iterator = $imagick->getPixelRegionIterator(0, 0, 200, 200);
while ($row = $iterator->getNextIteratorRow()) {
foreach ($row as $pixel) {
$color = $pixel->getColor();
// Rote Pixel durch blaue ersetzen
if ($color['r'] > 200 && $color['g'] < 50 && $color['b'] < 50) {
$pixel->setColor('blue');
}
}
$iterator->syncIterator();
}
$imagick->writeImage('logo_blau.png');
$imagick->destroy();
Durchschnittliche Helligkeit eines Bildes berechnen
<?php
$imagick = new Imagick('bild.jpg');
$iterator = $imagick->getPixelIterator();
$summe = 0;
$anzahl = 0;
foreach ($iterator as $row) {
foreach ($row as $pixel) {
$color = $pixel->getColor();
// Relative Luminanz (vereinfacht)
$summe += ($color['r'] + $color['g'] + $color['b']) / 3;
$anzahl++;
}
}
$durchschnitt = $anzahl > 0 ? $summe / $anzahl : 0;
echo 'Durchschnittliche Helligkeit: ' . round($durchschnitt) . '/255';
// Wichtig · Fallstricke
Wichtig: Nach dem Verändern von Pixelwerten in einer Zeile muss syncIterator() aufgerufen werden, bevor die nächste Zeile abgerufen wird. Ohne diesen Aufruf werden die Änderungen nicht in das Bild übernommen.
Bei sehr großen Bildern kann selbst der zeilenweise Iterator viel Zeit in Anspruch nehmen. Für massive Batch-Verarbeitungen sind häufig native Imagick-Filter (modulateImage(), colorMatrixImage() etc.) performanter, da sie intern in C implementiert sind.
Die Klasse implementiert das Iterator-Interface, sodass sie direkt in foreach-Schleifen verwendet werden kann. Alternativ stehen die Methoden getNextIteratorRow(), getPreviousIteratorRow(), resetIterator() und setIteratorRow(int $row) zur Verfügung.
Stellt sicher, dass die Imagick-Erweiterung (PECL imagick >= 2.0.0) installiert und die ImageMagick-Bibliothek verfügbar ist.