Start · Sprachen · PHP · Referenz · imagesetpixel

imagesetpixel

Funktion

Setzt ein einzelnes Pixel an der angegebenen Position in einem GD-Bild auf die übergebene Farbe.

seit PHP 4.0.0 Kategorie: image

Signatur

imagesetpixel(GdImage $image, int $x, int $y, int $color): bool

Beschreibung

imagesetpixel() färbt exakt einen Pixel im Bild-Objekt $image an der Koordinate ($x, $y) mit der gewünschten Farbe ein. Die Funktion ist das grundlegendste Zeichenwerkzeug der GD-Bibliothek und damit die Basis für alle höheren Zeichenoperationen.

Typische Anwendungsfälle sind das manuelle Rendern eigener Grafikalgorithmen (z. B. fraktale Kurven, Mandelbrot-Mengen, benutzerdefinierte Zeichenpfade) oder das pixelgenaue Nachbearbeiten einzelner Bildpunkte. Für das massenhafte Lesen oder Schreiben von Pixeln sollte man jedoch die effizienteren Funktionen imagecopyresampled() oder imagefilter() in Betracht ziehen, da imagesetpixel() bei großen Bildern durch den Overhead pro Aufruf langsam werden kann.

Koordinatenursprung ist die obere linke Ecke des Bildes mit (0, 0). Der Farb-Parameter muss ein mit imagecolorallocate() oder imagecolorallocatealpha() erzeugter Farbindex sein, oder ein über imagecolorexact() ermittelter Wert.

Parameter

Name Typ Default Beschreibung
$image Pflicht GdImage Ein GD-Bildobjekt, das z. B. mit imagecreatetruecolor(), imagecreatefromjpeg() oder einer ähnlichen Funktion erzeugt wurde.
$x Pflicht int Die horizontale Koordinate des Pixels (0 = linker Rand).
$y Pflicht int Die vertikale Koordinate des Pixels (0 = oberer Rand).
$color Pflicht int Ein Farbindex, der zuvor mit imagecolorallocate() oder imagecolorallocatealpha() erzeugt wurde. Bei True-Color-Bildern kann auch ein direkt berechneter RGBA-Integer übergeben werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die Koordinaten außerhalb des Bildbereichs liegen oder das Bildobjekt ungültig ist).

Beispiele

Einzelnen farbigen Pixel in ein neues Bild setzen

<?php
// Ein 100x100 True-Color-Bild erstellen
$bild = imagecreatetruecolor(100, 100);

// Hintergrundfarbe: Weiß
$weiss = imagecolorallocate($bild, 255, 255, 255);
imagefill($bild, 0, 0, $weiss);

// Einen roten Pixel in der Mitte setzen
$rot = imagecolorallocate($bild, 255, 0, 0);
imagesetpixel($bild, 50, 50, $rot);

// Bild als PNG ausgeben
header('Content-Type: image/png');
imagepng($bild);
imagedestroy($bild);

Einfaches Fraktal (Diagonale Linie) mit imagesetpixel zeichnen

<?php
// Ein 200x200 True-Color-Bild erstellen
$bild = imagecreatetruecolor(200, 200);

// Schwarzen Hintergrund erzeugen
$schwarz = imagecolorallocate($bild, 0, 0, 0);
imagefill($bild, 0, 0, $schwarz);

// Gelbe Diagonale von (0,0) bis (199,199) zeichnen
$gelb = imagecolorallocate($bild, 255, 255, 0);
for ($i = 0; $i < 200; $i++) {
    imagesetpixel($bild, $i, $i, $gelb);
}

// Bild als PNG ausgeben
header('Content-Type: image/png');
imagepng($bild);
imagedestroy($bild);

Mandelbrot-Menge mit imagesetpixel visualisieren

<?php
$breite  = 400;
$hoehe   = 300;
$bild    = imagecreatetruecolor($breite, $hoehe);
$schwarz = imagecolorallocate($bild, 0, 0, 0);
$weiss   = imagecolorallocate($bild, 255, 255, 255);
imagefill($bild, 0, 0, $schwarz);

for ($px = 0; $px < $breite; $px++) {
    for ($py = 0; $py < $hoehe; $py++) {
        $cx = ($px / $breite)  * 3.5 - 2.5;
        $cy = ($py / $hoehe) * 2.0 - 1.0;
        $x = 0.0;
        $y = 0.0;
        $iteration = 0;
        $maxIter   = 50;
        while ($x * $x + $y * $y <= 4 && $iteration < $maxIter) {
            $xNeu = $x * $x - $y * $y + $cx;
            $y    = 2 * $x * $y + $cy;
            $x    = $xNeu;
            $iteration++;
        }
        if ($iteration === $maxIter) {
            imagesetpixel($bild, $px, $py, $weiss);
        }
    }
}

header('Content-Type: image/png');
imagepng($bild);
imagedestroy($bild);

// Wichtig · Fallstricke

Performance: Da imagesetpixel() pro Aufruf einen einzelnen Pixel setzt, ist es bei großen Bildern oder komplexen Algorithmen sehr langsam. Für Massenoperationen sollte man, wenn möglich, auf imagecopy(), imagefilter() oder dedizierte Zeichenfunktionen wie imageline() zurückgreifen.

Koordinatengrenzen: Koordinaten außerhalb des Bildbereichs führen dazu, dass die Funktion false zurückgibt und keinen Pixel setzt. Eine Prüfung der Grenzen vor dem Aufruf ist empfehlenswert, wenn die Koordinaten dynamisch berechnet werden.

Palettenbilder vs. True-Color: Bei Palettenbildern (erstellt mit imagecreate()) muss die Farbe zuerst explizit mit imagecolorallocate() reserviert werden; bei True-Color-Bildern kann man auch direkt einen berechneten Ganzzahlwert übergeben.