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

Artfiles.de
Bietet Serviceorientierte Internetdienstleistungen...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains und...
https://www.Hosterplus.de
 
 
 

PHP imagecreatefromstring(): Bilder aus Daten

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

PHP imagecreatefromstring(): Bilder aus Daten
Veröffentlicht am:
08.09.2026
Hits / Besucher:
5
Sprache:
  Deutsch
Tutorial Art:
eigenes
Eingetragen von:
Merkliste:
 
Beschreibung

Ein Unterschriftenfeld im Browser liefert das Bild als lange Zeichenkette. Die Bildbearbeitung von PHP will aber einen Dateipfad sehen. Der übliche Ausweg, die Daten erst als Datei abzulegen und sofort wieder einzulesen, ist unnötig.

Illustration zum Tutorial: PHP imagecreatefromstring(): Bilder aus Daten

Im Bild führen drei Quellen ohne Umweg in denselben Decoder, und der Ordner daneben ist durchgestrichen. Genau darum geht es hier.

Was PHP imagecreatefromstring() macht

PHP imagecreatefromstring nimmt Bilddaten als Zeichenkette entgegen und liefert ein Bildobjekt zurück, mit dem sich anschließend alle übrigen GD-Funktionen verwenden lassen. Bei ungültigen Daten kommt false zurück, begleitet von einer Warnung.

<?php

$daten = file_get_contents('logo.png');

$bild = imagecreatefromstring($daten);

if ($bild === false) {
exit('Das sind keine lesbaren Bilddaten.');
}

echo imagesx($bild) . ' x ' . imagesy($bild); /* 550 x 310 */

Ein Hinweis zum Rückgabewert, der viele Umstellungen betrifft: Seit PHP 8.0 ist das Ergebnis ein Objekt der Klasse GdImage und keine Ressource mehr. Prüfungen der Form is_resource($bild) liefern seither immer false, obwohl alles in Ordnung ist. Geprüft wird ausschließlich gegen false, und zwar mit drei Gleichheitszeichen.

Unterstützt werden JPEG, PNG, GIF, BMP, WBMP, WEBP, AVIF und GD2, je nachdem, was die GD-Bibliothek auf dem Server mitbekommen hat. gd_info() gibt darüber Auskunft.

Die Beschreibung im Handbuch ist kurz, nennt aber genau die Punkte, die in der Praxis zählen:

imagecreatefromstring(string $data): GdImage|false


/* data - the image data as a string, in any supported format
return - an image object on success, false on failure

The function detects the image format automatically. It supports
JPEG, PNG, GIF, BMP, WBMP, WEBP, AVIF and GD2, provided support
for the format is compiled into the gd library.

On error, an E_WARNING is raised: "Data is not in a recognized
format". The return value is false, and that is what has to be
checked. Since PHP 8 the value is a GdImage object, not a resource
identifier, so is_resource() no longer works here. */

Der letzte Absatz beschreibt genau den Umstellungsfehler, der weiter unten ausführlich vorkommt.

Wenn der Dateipfad fehlt

Die üblichen GD-Beispiele beginnen mit einem Dateipfad. Genau der fehlt, wenn das Bild aus einem Formularfeld, aus einer Datenbankspalte oder aus einer HTTP-Antwort kommt. PHP imagecreatefromstring ersetzt in diesen Fällen den Einstiegspunkt, alles Weitere bleibt gleich.

Das heißt auch: Dieses Tutorial behandelt den Einstieg, nicht die Bearbeitung. Wie ein Bild anschließend verkleinert wird, zeigt PHP Bilder skalieren und Thumbnails erzeugen, und wie ein Schriftzug daraufkommt, steht in PHP Wasserzeichen auf Bilder setzen mit GD.

Drei Quellen für PHP imagecreatefromstring()

Der erste Fall ist der häufigste, in dem PHP imagecreatefromstring zum Einsatz kommt. Ein Browser liefert Bilddaten als sogenannte Daten-URL, die einen Kopf vor den eigentlichen Daten trägt.

<?php

$eingabe = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...';

/* Der Kopf vor dem Komma muss weg. Das Trennen am Komma
ist sicherer als das Abschneiden fester Zeichenzahlen. */
$teile = explode(',', $eingabe, 2);
$roh = base64_decode($teile[1] ?? '', true);

if ($roh === false) {
exit('Die Base64-Daten sind fehlerhaft.');
}

$bild = imagecreatefromstring($roh);

Das zweite Argument von base64_decode() sorgt dafür, dass ungültige Zeichen einen Fehler auslösen, statt stillschweigend verworfen zu werden. Ohne diesen Schalter entsteht aus kaputten Eingaben ein Stück Datenmüll, das erst eine Zeile später auffällt.

<?php

/* Zweite Quelle: ein BLOB aus der Datenbank */
$satz = $pdo->query('SELECT bild FROM profile WHERE id = 17')->fetch();
$bild = imagecreatefromstring($satz['bild']);

/* Dritte Quelle: die Antwort einer HTTP-Anfrage */
$ch = curl_init('https://beispiel.tld/artikel/4711.jpg');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$antwort = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$typ = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);

if ($status !== 200 || !str_starts_with((string) $typ, 'image/')) {
exit('Die Gegenstelle hat kein Bild geliefert.');
}

$bild = imagecreatefromstring((string) $antwort);

Die Prüfung von Statuscode und Inhaltstyp im dritten Block ist keine überflüssige Vorsicht. Antwortet der fremde Server mit einer HTML-Fehlerseite, landet genau die in der Funktion, und die Meldung, die dann erscheint, wird im nächsten Abschnitt behandelt.

Wenn die Daten kein Bild sind

Die Warnung Data is not in a recognized format hat in der Praxis fast immer eine von zwei Ursachen.

Der Base64-Kopf steht noch davor Die Zeichenfolge bis zum ersten Komma gehört nicht zu den Bilddaten. Wer sie mitdekodiert, erhält Unsinn.
Die Antwort war gar kein Bild Ein abgelaufener Link, eine Anmeldeseite oder eine Fehlermeldung im HTML-Format sehen für das Skript aus wie Daten, sind aber keine Bilddaten.

Die Meldung kommt als E_WARNING, das Skript läuft also weiter. Was in dieser Lage nicht hilft, ist das Abschalten der Warnungen, wie es in Foren gelegentlich empfohlen wird. Der Rückgabewert bleibt false, und die einzige Spur, die auf die Ursache geführt hätte, ist danach fort. Sinnvoll ist die Prüfung des Rückgabewerts und eine eigene, verständliche Meldung.

Format und Abmessungen vor PHP imagecreatefromstring() prüfen

Zu getimagesize(), das einen Pfad erwartet, gibt es ein Gegenstück für Zeichenketten. Es dekodiert das Bild nicht, sondern liest nur den Kopf der Daten aus, und gehört deshalb vor den eigentlichen Aufruf.

<?php

$info = getimagesizefromstring($roh);

if ($info === false) {
exit('Kein erkennbares Bildformat.');
}

echo $info[0] . ' x ' . $info[1] . ', Typ: ' . $info['mime'];
/* 1920 x 1080, Typ: image/jpeg */

$erlaubt = ['image/jpeg', 'image/png', 'image/webp'];

if (!in_array($info['mime'], $erlaubt, true)) {
exit('Dieses Format nehmen wir nicht an.');
}

Damit lassen sich unerwünschte Formate ablehnen, bevor auch nur ein Pixel im Speicher liegt. Der gemeldete Typ stammt dabei aus den Daten selbst und nicht aus einer Angabe, die der Absender frei wählen könnte.

Speicherbedarf abschätzen, bevor es zu spät ist

Eine JPEG-Datei von 4 MB ist nach PHP imagecreatefromstring im Arbeitsspeicher ein Vielfaches größer, denn dort liegt jedes Bildpunkt einzeln. Als Faustformel gilt: Breite mal Höhe mal vier Byte.

<?php

$info = getimagesizefromstring($roh);
$bedarf = $info[0] * $info[1] * 4;

/* 8000 x 6000 Pixel ergeben rund 192 MB,
voellig unabhaengig von der Dateigroesse. */
if ($bedarf > 100 * 1024 * 1024) {
exit('Das Bild ist mit ' . round($bedarf / 1048576)
. ' MB zu gross fuer die Verarbeitung.');
}

$bild = imagecreatefromstring($roh);

Diese Prüfung ist besonders bei Uploads von Fremden nützlich, weil sich mit einer kleinen Datei ein sehr großes Bild erzeugen lässt. Eine saubere Ablehnung ist immer besser als ein Abbruch mitten in der Verarbeitung.

Vom Rohdatensatz zum gespeicherten Vorschaubild

Alles zusammen ergibt eine kurze, vollständige Kette, die mit PHP imagecreatefromstring beginnt.

<?php

$info = getimagesizefromstring($roh);

if ($info === false) {
exit('Kein Bild.');
}

$quelle = imagecreatefromstring($roh);

if ($quelle === false) {
exit('Bilddaten nicht lesbar.');
}

$breite = 300;
$hoehe = (int) round($info[1] * ($breite / $info[0]));

$ziel = imagecreatetruecolor($breite, $hoehe);
imagecopyresampled($ziel, $quelle, 0, 0, 0, 0,
$breite, $hoehe, $info[0], $info[1]);

imagejpeg($ziel, 'vorschau/17.jpg', 82);

Der Einstieg unterscheidet sich also nur in der ersten Zeile von jedem gewöhnlichen GD-Beispiel. Fein abgestimmt wird das Verkleinern im dafür zuständigen Tutorial, hier genügt die Kette.

PNG-Transparenz nicht verlieren

Ein häufiger Folgefehler nach PHP imagecreatefromstring: Das Ausgangsbild hat einen durchsichtigen Hintergrund, das Ergebnis nicht mehr. Der Grund liegt in zwei Voreinstellungen, die vor dem Kopieren umgestellt werden müssen.

<?php

$ziel = imagecreatetruecolor($breite, $hoehe);

/* Beide Zeilen muessen VOR dem Kopieren stehen. */
imagealphablending($ziel, false);
imagesavealpha($ziel, true);

imagecopyresampled($ziel, $quelle, 0, 0, 0, 0,
$breite, $hoehe, $info[0], $info[1]);

imagepng($ziel, 'vorschau/logo.png');

Die erste Zeile sorgt dafür, dass der Alphakanal beim Kopieren übernommen und nicht mit dem Untergrund verrechnet wird. Die zweite bewirkt, dass er beim Speichern erhalten bleibt. Fehlt eine der beiden, ist der Hintergrund am Ende schwarz.

flowchart TD
  A[Bilddaten als String] --> B{Base64 mit Kopf}
  B -->|ja| C[Kopf entfernen und dekodieren]
  B -->|nein| D[getimagesizefromstring]
  C --> D[getimagesizefromstring]
  D --> E{Format und Groesse ok}
  E -->|nein| F[Ablehnen mit Meldung]
  E -->|ja| G[imagecreatefromstring]
  G --> H{Ergebnis false}
  H -->|ja| F
  H -->|nein| I[Weiterverarbeiten]

Zwei Prüfungen vor dem eigentlichen Aufruf, eine danach. Diese Reihenfolge verhindert sowohl abgelehnte Formate als auch Abbrüche wegen zu großer Bilder.

Taugt das als Upload-Prüfung?

Teilweise, und die Grenze ist wichtig. Liefert PHP imagecreatefromstring ein false, sind die Daten mit Sicherheit kein Bild, das GD lesen kann. Diese Aussage ist belastbar und deutlich mehr wert als eine Prüfung der Dateiendung.

Der Umkehrschluss gilt aber nicht. Ein erfolgreiches Einlesen bedeutet nur, dass ein Bild in den Daten steckt. Eine Datei kann gleichzeitig ein gültiges Bild sein und weitere Inhalte mitführen. Wer Uploads von Fremden annimmt, speichert deshalb das neu erzeugte Bild und nie das Original, vergibt einen eigenen Dateinamen und liefert die Datei nicht aus einem Verzeichnis aus, in dem der Server Code ausführen würde.

Ein letzter Punkt zum Aufräumen: imagedestroy() war früher Pflicht, um den Speicher freizugeben. Seit PHP 8.0 verschwindet das Bild zusammen mit dem Objekt, sobald keine Variable mehr darauf zeigt. Der Aufruf schadet nicht, sein Fehlen ist aber kein Versäumnis mehr.

Fazit

PHP imagecreatefromstring macht den Umweg über temporäre Dateien überflüssig, egal ob die Daten aus einem Formular, einer Datenbank oder dem Netz stammen. Mit getimagesizefromstring() davor lassen sich Format und Größe prüfen, bevor Speicher belegt wird, und die beiden Alpha-Aufrufe erhalten die Transparenz. Wer den Rückgabewert gegen false prüft statt mit is_resource(), hat auch die Umstellung auf PHP 8 hinter sich.

 

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.