Signatur
Beschreibung
imagecreatefromstring() ermöglicht es, ein GD-Bildobjekt direkt aus einem Byte-String zu erzeugen, ohne dass die Bilddaten zuerst in eine Datei auf dem Dateisystem geschrieben werden müssen. PHP erkennt dabei automatisch das Format der übergebenen Bilddaten (JPEG, PNG, GIF, WebP, BMP u. a.), sofern die jeweilige GD-Unterstützung kompiliert wurde.
Typische Einsatzfälle sind das Verarbeiten von Bildern, die aus einer Datenbank (BLOB-Felder) ausgelesen wurden, das direkte Weiterverarbeiten von Bilddaten aus HTTP-Antworten (z. B. via file_get_contents() oder cURL) sowie Unit-Tests, bei denen Bilder als base64-kodierte Strings eingebettet sind.
Das zurückgegebene GdImage-Objekt kann anschließend wie jedes andere GD-Bild verwendet werden: Transformationen, Zeichenoperationen, Ausgabe mit imagejpeg(), imagepng() usw. Ab PHP 8.0 wird ein GdImage-Objekt zurückgegeben; zuvor war es eine Ressource.
Schlägt die Erstellung fehl (z. B. ungültige oder leere Daten), gibt die Funktion false zurück und erzeugt einen Fehler der Stufe E_WARNING. Eine Überprüfung des Rückgabewerts ist daher wichtig.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Der rohe Binär-String mit den Bilddaten. Unterstützte Formate sind JPEG, PNG, GIF, BMP, WebP und weitere, je nach GD-Konfiguration der PHP-Installation. |
Rückgabewert
GdImage-Objekt zurück (vor PHP 8.0 eine GD-Ressource). Bei ungültigen Bilddaten oder einem nicht unterstützten Format wird false zurückgegeben.Beispiele
Bild aus Datenbank laden und als PNG ausgeben
<?php
// Simuliert BLOB-Daten aus einer Datenbank
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'user', 'pass');
$stmt = $pdo->prepare('SELECT bilddata FROM produkte WHERE id = ?');
$stmt->execute([42]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row && $row['bilddata']) {
$image = imagecreatefromstring($row['bilddata']);
if ($image === false) {
http_response_code(500);
exit('Ungültige Bilddaten.');
}
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
} else {
http_response_code(404);
exit('Bild nicht gefunden.');
}
Bild per HTTP laden, skalieren und speichern
<?php
$url = 'https://example.com/foto.jpg';
$daten = file_get_contents($url);
if ($daten === false) {
exit('HTTP-Anfrage fehlgeschlagen.');
}
$quelle = imagecreatefromstring($daten);
if ($quelle === false) {
exit('Keine gültigen Bilddaten empfangen.');
}
$breite = imagesx($quelle);
$hoehe = imagesy($quelle);
$neueBreite = 300;
$neueHoehe = (int) round($hoehe * $neueBreite / $breite);
$ziel = imagecreatetruecolor($neueBreite, $neueHoehe);
imagecopyresampled($ziel, $quelle, 0, 0, 0, 0, $neueBreite, $neueHoehe, $breite, $hoehe);
imagejpeg($ziel, '/var/www/cache/foto_klein.jpg', 85);
imagedestroy($quelle);
imagedestroy($ziel);
echo 'Thumbnail gespeichert: ' . $neueBreite . 'x' . $neueHoehe . ' Pixel';
Base64-kodiertes Bild verarbeiten
<?php
// Beispiel: Ein winziges 1×1-px rotes PNG als Base64
$base64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==';
$binaer = base64_decode($base64);
$bild = imagecreatefromstring($binaer);
if ($bild !== false) {
echo 'Breite: ' . imagesx($bild) . ' px' . PHP_EOL;
echo 'Höhe: ' . imagesy($bild) . ' px' . PHP_EOL;
imagedestroy($bild);
} else {
echo 'Fehler beim Laden des Bildes.';
}
// Wichtig · Fallstricke
Sicherheitshinweis: Werden Bilddaten aus nicht vertrauenswürdigen Quellen (z. B. Nutzer-Uploads via Formular) als String übergeben, sollte das Format nach der Erstellung explizit mit imagetypes() und der Metainformation geprüft werden. Das bloße Einlesen schützt nicht vor speziell präparierten Bilddaten, die andere Schwachstellen in nachgelagerten Bibliotheken ausnutzen könnten.
Speicher: Bei sehr großen Bilddaten kann der PHP-Speicherlimit überschritten werden. Mit ini_set('memory_limit', '256M') kann dieser temporär erhöht werden, besser ist jedoch die Größe der Eingabe vorher zu prüfen.
Ressource vs. Objekt: Vor PHP 8.0 lieferte die Funktion eine GD-Ressource zurück. Ab PHP 8.0 wird ein GdImage-Objekt zurückgegeben; imagedestroy() ist ab PHP 8.0 nicht mehr zwingend nötig, schadet aber nicht.