Start · Sprachen · PHP · Referenz · imagecreatefromstring

imagecreatefromstring

Funktion

Erstellt ein neues <code>GdImage</code>-Objekt aus Bilddaten, die als String vorliegen (z. B. aus einer Datenbank, einem HTTP-Response oder <code>file_get_contents()</code>).

seit PHP 4.0.4 Kategorie: image

Signatur

imagecreatefromstring(string $data): GdImage|false

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

Typ
GdImage|false
Beschreibung
Gibt bei Erfolg ein 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';
Thumbnail gespeichert: 300x200 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.';
}
Breite: 1 px Höhe: 1 px

// 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.