Start · Sprachen · PHP · Referenz · imagebmp

imagebmp

Funktion

Gibt ein GD-Bildobjekt im BMP-Format an den Browser oder in eine Datei aus.

seit PHP 7.2.0 Kategorie: image

Signatur

imagebmp(GdImage $image, string|null $file = null, bool $compressed = true): bool

Beschreibung

imagebmp() schreibt das übergebene GD-Bild als BMP-Datei (Windows Bitmap Format) entweder direkt in den Ausgabepuffer (Browser) oder in eine Datei auf dem Dateisystem. Die Funktion ist seit PHP 7.2.0 verfügbar und ergänzt die Familie der Bildausgabe-Funktionen wie imagepng(), imagejpeg() und imagegif().

Das BMP-Format ist ein verlustfreies Rasterformat ohne Transparenz-Unterstützung in der klassischen Variante. Es eignet sich vor allem für einfache Grafiken, bei denen maximale Kompatibilität mit Windows-Anwendungen wichtig ist. Der Parameter $compressed steuert, ob RLE-Komprimierung (Run-Length Encoding) auf 8-Bit-Bilder angewandt wird.

Wenn $file auf null gesetzt oder weggelassen wird, wird der BMP-Datenstrom direkt an den Ausgabepuffer gesendet. In diesem Fall sollte vor dem Aufruf der korrekte Content-Type-Header (image/bmp) gesendet werden, damit der Browser die Antwort korrekt interpretiert.

Das zurückgegebene BMP ist ein 24-Bit-Bild, außer wenn das Quellbild eine Palette besitzt – dann wird es als Palettenbild gespeichert. Bei transparenten Bildern gehen Transparenzinformationen verloren, da BMP in dieser Implementierung keine Alpha-Kanäle unterstützt.

Parameter

Name Typ Default Beschreibung
$image Pflicht GdImage Ein GD-Bildobjekt, das z. B. mit imagecreatetruecolor(), imagecreatefromjpeg() oder einer ähnlichen Funktion erzeugt wurde.
$file string|null null Pfad zur Ausgabedatei als Zeichenkette oder null. Wird null übergeben oder der Parameter weggelassen, wird das Bild direkt in den Ausgabepuffer geschrieben.
$compressed bool true Steuert, ob RLE-Komprimierung für Palettenbilder (8-Bit) angewandt wird. Bei true wird RLE-Komprimierung aktiviert, bei false wird unkomprimiert gespeichert. Für True-Color-Bilder hat dieser Parameter keine Wirkung.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die Datei nicht geschrieben werden konnte oder das Bildobjekt ungültig ist).

Beispiele

BMP-Bild direkt an den Browser ausgeben

<?php
// Neues True-Color-Bild erstellen
$image = imagecreatetruecolor(200, 100);

// Hintergrundfarbe setzen (blau)
$blue = imagecolorallocate($image, 0, 0, 200);
imagefill($image, 0, 0, $blue);

// Text in weiß schreiben
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 5, 30, 40, 'Hallo BMP!', $white);

// Korrekten Content-Type-Header senden
header('Content-Type: image/bmp');

// BMP in den Ausgabepuffer schreiben
imagebmp($image, null, false);

// Speicher freigeben
imagedestroy($image);

BMP-Bild in eine Datei speichern

<?php
// Bild aus einer bestehenden JPEG-Datei laden
$source = imagecreatefromjpeg('/pfad/zum/bild.jpg');

if ($source === false) {
    die('Bild konnte nicht geladen werden.');
}

$outputPath = '/pfad/zum/ausgabe.bmp';

// Als BMP-Datei speichern (mit RLE-Komprimierung)
$result = imagebmp($source, $outputPath, true);

if ($result) {
    echo 'BMP-Datei erfolgreich gespeichert: ' . $outputPath;
} else {
    echo 'Fehler beim Speichern der BMP-Datei.';
}

imagedestroy($source);
BMP-Datei erfolgreich gespeichert: /pfad/zum/ausgabe.bmp

Palettenbild als BMP ohne Komprimierung speichern

<?php
// Palettenbild erstellen (nicht True-Color)
$image = imagecreate(150, 75);

// Farben aus der Palette zuweisen
$background = imagecolorallocate($image, 255, 255, 0); // Gelb
$red = imagecolorallocate($image, 200, 0, 0);

// Rechteck zeichnen
imagerectangle($image, 10, 10, 140, 65, $red);

// Unkomprimiert speichern (compressed = false)
imagebmp($image, '/tmp/palette.bmp', false);

echo 'Paletten-BMP gespeichert (unkomprimiert).';
imagedestroy($image);
Paletten-BMP gespeichert (unkomprimiert).

// Wichtig · Fallstricke

Transparenz: BMP in der von imagebmp() erzeugten Form unterstützt keinen Alpha-Kanal. Transparente Bereiche in True-Color-Bildern werden ohne Transparenzinformation gespeichert und erscheinen in der Regel schwarz oder werden mit der Hintergrundfarbe gefüllt. Wer Transparenz benötigt, sollte stattdessen imagepng() verwenden.

Dateigröße: BMP-Dateien sind in der Regel deutlich größer als PNG- oder JPEG-Dateien, da das Format kaum Komprimierung bietet. Für die Webausgabe sind PNG oder JPEG meist die bessere Wahl.

Sicherheit: Beim Schreiben in eine Datei sollte der Dateipfad niemals direkt aus Benutzereingaben stammen, um Path-Traversal-Angriffe zu verhindern. Pfade sollten stets validiert und auf erlaubte Verzeichnisse beschränkt werden.

Browserunterstützung: Nicht alle Browser zeigen BMP-Dateien direkt an. Für die Webausgabe empfiehlt sich daher eher imagepng() oder imagejpeg().