Start · Sprachen · PHP · Referenz · getimagesizefromstring

getimagesizefromstring

Funktion

Ermittelt Breite, Höhe, Typ und andere Metadaten eines Bildes direkt aus einem String (Binärdaten), ohne eine Datei auf der Festplatte zu benötigen.

seit PHP 5.4.0 Kategorie: image

Signatur

getimagesizefromstring(string $string): array|false

Beschreibung

getimagesizefromstring() ist das Äquivalent zu getimagesize(), arbeitet jedoch nicht mit einer Datei, sondern mit den rohen Binärdaten eines Bildes als PHP-String. Die Funktion analysiert den Bildinhalt und liefert ein Array mit Breite, Höhe, Bildtyp und einem HTML-Attributstring zurück.

Typische Anwendungsfälle sind: Bilder, die per HTTP-Upload bereits im Speicher vorliegen ($_FILES über file_get_contents() gelesen), aus einer Datenbank geladene BLOB-Daten oder Bilddaten, die über eine API oder einen Stream empfangen wurden – ohne sie zuvor temporär als Datei speichern zu müssen.

Das zurückgegebene Array enthält folgende Indizes: [0] = Breite in Pixel, [1] = Höhe in Pixel, [2] = Bildtyp-Konstante (z. B. IMAGETYPE_JPEG), [3] = fertiger HTML-Attributstring (width="x" height="y"), ['mime'] = MIME-Typ und ggf. ['channels'] und ['bits'].

Bei nicht erkannten oder beschädigten Bilddaten gibt die Funktion false zurück. Es empfiehlt sich daher stets eine Überprüfung des Rückgabewertes, bevor auf die Array-Indizes zugegriffen wird.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Die rohen Binärdaten des Bildes als PHP-String. Typischerweise das Ergebnis von file_get_contents(), Datenbank-BLOB oder empfangene Stream-Daten.

Rückgabewert

Typ
array|false
Beschreibung
Bei Erfolg ein Array mit Bildinformationen: Index 0 = Breite, 1 = Höhe, 2 = Bildtyp-Konstante (IMAGETYPE_*), 3 = HTML-Attributstring, 'mime' = MIME-Typ, ggf. 'channels' (RGB=3, CMYK=4) und 'bits' (Bit-Tiefe pro Kanal). Gibt false zurück, wenn das Bild nicht erkannt oder geparst werden konnte.

Beispiele

Bildgröße aus einer Datei im Speicher ermitteln

<?php
// Bilddatei in einen String laden (z. B. aus dem Dateisystem oder einer Datenbank)
$imageData = file_get_contents('/pfad/zum/bild.jpg');

$info = getimagesizefromstring($imageData);

if ($info === false) {
    echo 'Ungültige oder nicht erkannte Bilddaten.';
} else {
    echo 'Breite:    ' . $info[0] . ' px' . PHP_EOL;
    echo 'Höhe:      ' . $info[1] . ' px' . PHP_EOL;
    echo 'MIME-Typ:  ' . $info['mime'] . PHP_EOL;
    echo 'HTML-Attr: ' . $info[3] . PHP_EOL;
}
Breite: 800 px Höhe: 600 px MIME-Typ: image/jpeg HTML-Attr: width="800" height="600"

Bilddaten aus einer Datenbank validieren (BLOB)

<?php
// Simuliert einen aus der Datenbank gelesenen BLOB
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT image_data FROM images WHERE id = ?');
$stmt->execute([42]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row && $row['image_data']) {
    $info = getimagesizefromstring($row['image_data']);

    if ($info !== false) {
        // Nur erlaubte Bildtypen akzeptieren
        $allowedTypes = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF];
        if (in_array($info[2], $allowedTypes, true)) {
            header('Content-Type: ' . $info['mime']);
            echo $row['image_data'];
        } else {
            http_response_code(415);
            echo 'Nicht unterstützter Bildtyp.';
        }
    } else {
        http_response_code(422);
        echo 'Ungültige Bilddaten in der Datenbank.';
    }
}

Hochgeladenes Bild im Speicher prüfen, ohne temporäre Datei

<?php
// Hochgeladene Bilddaten direkt aus dem temporären Pfad lesen und analysieren
if (isset($_FILES['upload']) && $_FILES['upload']['error'] === UPLOAD_ERR_OK) {
    $rawData = file_get_contents($_FILES['upload']['tmp_name']);
    $info    = getimagesizefromstring($rawData);

    if ($info === false) {
        echo 'Die hochgeladene Datei ist kein gültiges Bild.';
    } elseif ($info[0] > 4000 || $info[1] > 4000) {
        echo 'Das Bild ist zu groß (max. 4000×4000 Pixel).';
    } else {
        echo 'Bild akzeptiert: ' . $info[0] . 'x' . $info[1] . ' (' . $info['mime'] . ')';
    }
}

// Wichtig · Fallstricke

Sicherheitshinweis: Die Funktion liest den Bildtyp aus den Binärdaten selbst – nicht aus dem Dateinamen oder dem vom Client gemeldeten MIME-Typ. Dennoch sollte der zurückgegebene Typ immer gegen eine Whitelist zulässiger IMAGETYPE_*-Konstanten geprüft werden, da getimagesizefromstring() keine vollständige Sicherheitsprüfung darstellt.

Speicherverbrauch: Da das gesamte Bild als String im Arbeitsspeicher gehalten wird, ist bei sehr großen Bilddateien auf ausreichend Memory zu achten (memory_limit in der php.ini).

GD-Erweiterung: Die Funktion benötigt die GD-Erweiterung nicht zwingend – sie liest lediglich die Bild-Header aus. Für tatsächliche Bildbearbeitung ist GD oder Imagick erforderlich.