Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Push Meldungen
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Lernpfade
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 Unit Test Generator
 TLD Liste
 Webkatalog‑Verzeichnis

Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
Webspace-Mieten.d...
Webhosting mit Plesk aus Erfurt: Vier...
https://www.Webspace-Mieten.de
 
 
 

PHP imagecolorat(): Pixelfarben auslesen und auswerten

Sie befinden sich: Home > Php Tutorial > PHP imagecolorat(): Pixelfa...

PHP imagecolorat(): Pixelfarben auslesen und auswerten
Veröffentlicht am:
21.09.2026
Hits / Besucher:
69
Sprache:
  Deutsch
Tutorial Art:
eigenes
Eingetragen von:
Merkliste:
 
Beschreibung

Eine Bildergalerie soll zu jedem Foto eine passende Kachelfarbe bekommen, damit der Rahmen nicht gegen das Motiv arbeitet. Die Farbe muss aus dem Bild selbst kommen, und dazu führt der Weg über einzelne Bildpunkte.

Illustration zum Tutorial: PHP imagecolorat(): Pixelfarben auslesen und auswerten

Im Bild hängen an einem einzelnen Bildpunkt drei Farbwerte. Wie man von der einen Zahl zu diesen drei Werten kommt, ist der eigentliche Inhalt dieses Textes.

Was PHP imagecolorat() zurückgibt

PHP imagecolorat() liefert die Farbe eines einzelnen Bildpunkts. Der Rückgabewert ist eine Ganzzahl, und diese Zahl sieht auf den ersten Blick unbrauchbar aus. Sie ist es nicht, sie enthält nur mehrere Werte gleichzeitig.

<?php

$bild = imagecreatefromjpeg('produkt.jpg');
$wert = imagecolorat($bild, 10, 10);

echo $wert; // 9127187

imagedestroy($bild);

Die Zahl 9127187 ist kein Zufallswert. Sie ist ein Rot-, ein Grün- und ein Blauwert, zusammengepackt in eine einzige Ganzzahl. Die Koordinaten beginnen links oben bei null, und ein Wert außerhalb des Bildes liefert false.

Die Signatur im Original

Die englische Beschreibung enthält den Hinweis, der den gesamten Rest dieses Textes erklärt:

imagecolorat(GdImage $image, int $x, int $y): int|false


/* image - an image object, returned by one of the image
creation functions such as imagecreatefromjpeg()
x - x-coordinate of the point, starting at 0
y - y-coordinate of the point, starting at 0
return - returns the index of the color of the pixel

If the image is a truecolor image, this function returns the
RGB value of that pixel as an integer. Use bit shifting and
masking to access the distinct red, green and blue values.
For palette images the return value is an index into the
color table, not a color. */

Derselbe Aufruf liefert also zwei verschiedene Dinge, abhängig davon, wie das Bild aufgebaut ist. Wer das nicht weiß, wundert sich, warum ein GIF Zahlen zwischen 0 und 255 liefert und ein PNG Millionenwerte.

Truecolor oder Palette: derselbe Aufruf, zwei Bedeutungen

Ein Truecolor-Bild speichert zu jedem Punkt den Farbwert selbst. Ein Palettenbild speichert stattdessen eine Nummer, die auf eine Farbtabelle verweist. PHP imagecolorat() gibt in beiden Fällen das zurück, was im Bild steht, und das ist eben nicht dasselbe.

flowchart TD
    A[Bild laden] --> B[imagecolorat aufrufen]
    B --> C{imageistruecolor}
    C -->|true| D[Wert ist die Farbe]
    C -->|false| E[Wert ist ein Index]
    D --> F[Bitverschiebung]
    E --> G[imagecolorsforindex]
    F --> H[Rot, Gruen, Blau]
    G --> H

Der sichere Weg führt deshalb nicht über die rohe Zahl aus PHP imagecolorat(), sondern über imagecolorsforindex(). Diese Funktion versteht beide Fälle und liefert immer ein Array mit den Schlüsseln red, green, blue und alpha.

<?php

$bild = imagecreatefromgif('logo.gif');
$wert = imagecolorat($bild, 5, 5);

var_dump(imageistruecolor($bild)); // bool(false)
echo $wert; /* 3 (ein Index, keine Farbe) */

$farbe = imagecolorsforindex($bild, $wert);
print_r($farbe);
/* Array ( [red] => 139 [green] => 61 [blue] => 19 [alpha] => 0 ) */

Wer den Rückgabewert eines Palettenbildes direkt als Farbe deutet, bekommt bei einem Index von 3 ein fast schwarzes Ergebnis, obwohl der Punkt braun ist. Das ist der häufigste Fehler im Umgang mit dieser Funktion.

Die Zahl in Rot, Grün und Blau zerlegen

Bei Truecolor-Bildern lässt sich der Wert aus PHP imagecolorat() direkt auseinandernehmen. Die drei Kanäle liegen als je acht Bit hintereinander, und mit einer Verschiebung plus Maske kommt man an jeden einzelnen heran.

<?php

$wert = imagecolorat($bild, 10, 10); // 9127187

$r = ($wert >> 16) & 0xFF; // 139
$g = ($wert >> 8) & 0xFF; // 61
$b = $wert & 0xFF; // 19

printf('#%02X%02X%02X', $r, $g, $b); // #8B3D13

Die Verschiebung um 16 Stellen holt den Rotanteil nach vorn, die Maske schneidet alles ab, was dahinter noch steht. Wer mit Zahlensystemen und Bitoperationen wenig zu tun hatte, findet die Grundlagen dazu in PHP Zahlensysteme mit dechex, decbin, base_convert und bin2hex.

Der Alphakanal und sein Wertebereich

Ein vierter Wert steckt ebenfalls in der Zahl, die PHP imagecolorat() liefert, nämlich die Transparenz. Er liegt an der obersten Stelle und hat eine Eigenheit, an der viele Berechnungen scheitern.

<?php

$bild = imagecreatefrompng('logo.png');
imagesavealpha($bild, true);

$wert = imagecolorat($bild, 0, 0);
$alpha = ($wert >> 24) & 0x7F;

/* 0 bedeutet vollstaendig deckend,
127 bedeutet vollstaendig durchsichtig. */
$deckkraft = round((127 - $alpha) / 127 * 100);

echo $deckkraft . ' Prozent';

Der Bereich endet bei 127 und nicht bei 255, wie man es von den Farbkanälen gewohnt ist. GD verwendet dafür sieben Bit statt acht. Wer mit 255 rechnet, bekommt Deckkraftwerte, die um den Faktor zwei danebenliegen.

Praxis: die dominante Farbe eines Bildes

Für die eingangs beschriebene Kachelfarbe muss nicht jeder Bildpunkt betrachtet werden. Ein Foto von 2000 mal 1500 Punkten hätte drei Millionen Aufrufe zur Folge, und jeder davon kostet einzeln. Verkleinert man das Bild vorher, bleiben ein paar tausend übrig.

<?php

function dominanteFarbe(string $datei, int $raster = 50): array
{
$gross = imagecreatefromjpeg($datei);
$klein = imagescale($gross, $raster, $raster);

$summe = ['r' => 0, 'g' => 0, 'b' => 0];
$anzahl = $raster * $raster;

for ($x = 0; $x < $raster; $x++) {
for ($y = 0; $y < $raster; $y++) {
$f = imagecolorsforindex($klein, imagecolorat($klein, $x, $y));
$summe['r'] += $f['red'];
$summe['g'] += $f['green'];
$summe['b'] += $f['blue'];
}
}

imagedestroy($gross);
imagedestroy($klein);

return array_map(fn($w) => (int) round($w / $anzahl), $summe);
}

Aus drei Millionen Aufrufen werden 2500. Das Ergebnis ist der Mittelwert und damit eine ruhige Farbe, die selten daneben liegt. Wer die wirklich häufigste Farbe braucht, zählt stattdessen die Vorkommen und nimmt den Spitzenreiter. Zum Verkleinern selbst gibt es weitere Wege in PHP Bilder skalieren und Thumbnails erzeugen.

Praxis: ist ein Bild hell oder dunkel?

Aus denselben Werten von PHP imagecolorat() lässt sich ableiten, ob heller oder dunkler Text auf einem Bild besser lesbar ist. Der einfache Mittelwert der drei Kanäle taugt dafür nicht, weil das Auge Grün deutlich stärker wahrnimmt als Blau.

<?php

$f = imagecolorsforindex($bild, imagecolorat($bild, $x, $y));

/* Gewichtete Helligkeit nach der Wahrnehmung des Auges.
Ergebnis zwischen 0 (schwarz) und 255 (weiss). */
$helligkeit = 0.299 * $f['red'] + 0.587 * $f['green'] + 0.114 * $f['blue'];

$textfarbe = $helligkeit > 140 ? '#000000' : '#ffffff';

Die drei Faktoren stammen aus der Fernsehtechnik und haben sich für diesen Zweck bewährt. Auf einem verkleinerten Bild angewendet ergibt sich in wenigen Millisekunden eine brauchbare Aussage über die gesamte Fläche.

Praxis: farbig oder Graustufe?

Ein digitalisierter Bestand enthält oft beides nebeneinander, und die Dateiendung sagt darüber nichts aus. Ein JPEG kann ein reines Graustufenbild sein und trotzdem drei Farbkanäle mitführen. Bei echten Graustufen tragen alle drei Kanäle denselben Wert, und genau darauf lässt sich prüfen.

<?php

function istGraustufe(GdImage $bild, int $proben = 300): bool
{
$breite = imagesx($bild);
$hoehe = imagesy($bild);

for ($i = 0; $i < $proben; $i++) {
$x = random_int(0, $breite - 1);
$y = random_int(0, $hoehe - 1);
$f = imagecolorsforindex($bild, imagecolorat($bild, $x, $y));

/* Kleine Abweichungen kommen durch die
JPEG-Kompression zustande und sind erlaubt. */
if (abs($f['red'] - $f['green']) > 8 || abs($f['green'] - $f['blue']) > 8) {
return false;
}
}

return true;
}

Die Stichprobe bricht beim ersten farbigen Punkt ab. Bei einem Farbfoto ist das meist schon nach wenigen Aufrufen der Fall, bei einer echten Graustufe laufen alle 300 Proben durch. Die Toleranz von acht Stufen ist nötig, weil PHP imagecolorat() auch bei einer Graustufenvorlage leicht abweichende Kanäle liefert, sobald das Bild als JPEG gespeichert wurde.

Grenzen und Laufzeit

PHP imagecolorat() liest jeweils genau einen Punkt, und jeder Aufruf hat seinen eigenen Aufwand. In einer doppelten Schleife über ein großes Bild wird daraus schnell eine Zeitüberschreitung. Die Regel ist einfach: erst verkleinern, dann auswerten.

Zu beachten ist außerdem, dass die Funktion nur liest. Wer Punkte setzen will, braucht imagesetpixel(), und wer ganze Flächen verändert, ist mit den Werkzeugen aus PHP GD-Bibliothek zum programmatischen Erzeugen und Bearbeiten von Bildern besser bedient.

Fazit

PHP imagecolorat() liefert eine Ganzzahl, und diese Zahl bedeutet je nach Bildtyp etwas anderes. Bei Truecolor ist sie die Farbe selbst, bei einem Palettenbild ein Verweis in die Farbtabelle. imagecolorsforindex() kennt beide Fälle und ist deshalb der sichere Weg.

Zum Zerlegen genügen drei Zeilen mit Bitverschiebung, beim Alphakanal endet der Wertebereich bei 127 statt bei 255. Und wer aus einem ganzen Bild eine Aussage ableiten will, verkleinert es vorher. Aus drei Millionen Aufrufen werden so ein paar tausend, ohne dass das Ergebnis spürbar leidet.

 

Tags:

 

 

Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.