php: Bild aus Binärdaten neu erstellen und anzeigen

Lesezeit: 3 Minuten

Ist es möglich, Bilder aus Binärdaten neu zu erstellen (bei Bedarf zu verarbeiten) und anzuzeigen, alles im selben Skript? Etwas wie

// get and display image 1:
$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);

echo "<img src={$imagedata1} >"; // <-- IS THIS (OR EQUIVALENT) POSSIBLE?

// get and display image 2:
//etc...

Ich möchte vermeiden, die Bilder nach der Verarbeitung auf der Festplatte zu speichern und von dort abzurufen oder ein externes Skript zu verwenden …

Sie können dies mit einem tun Daten-URI im Bild src Attribut.

Das Format ist: data:[<MIME-type>][;charset="<encoding>"][;base64],<data>

Dieses Beispiel stammt direkt aus der Wikipedia-Seite zu Daten-URIs:

<?php
function data_uri($file, $mime) 
{  
  $contents = file_get_contents($file);
  $base64   = base64_encode($contents); 
  return ('data:' . $mime . ';base64,' . $base64);
}
?>

<img src="https://stackoverflow.com/questions/2070603/<?php%20echo%20data_uri("elephant.png','image/png'); ?>" alt="An elephant" />

  • Danke Ben! Genau das, was ich brauchte!

    – Cambiata

    15. Januar 2010 um 10:00 Uhr

  • Bitte beachten Sie, dass nicht alle Browser Daten-URIs richtig darstellen. Unbedingt gut testen…

    – ircmaxell

    3. Juni 2011 um 11:36 Uhr

  • Nur eine kleine Anmerkung: Ich habe ein rötliches Bild anstelle eines transparenten.

    – YOMorales

    9. Juli 2013 um 21:30 Uhr

  • Danke Ben, genau das was ich gesucht habe.

    – Abd Ul Aziz

    30. Juni 2014 um 14:30 Uhr

php Bild aus Binardaten neu erstellen und anzeigen
Pekka

Dies ist tatsächlich möglich, indem Inline-Bilder (genannt Daten-URIS).

Ihr Image-Tag würde in etwa so aussehen:

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" 
width="16" height="14" alt="embedded folder icon">

Warum sie meistens keine gute Idee sind:

  • Seitenlast wird sein verlangsamt weil das Bild abgerufen werden muss Vor die vollständige HTML-Struktur kann geladen und somit gerendert werden. Dies gilt umso mehr, wenn Sie zusätzliche Operationen an dem Bild ausführen. Ihre Website wird sich sehr wahrscheinlich viel langsamer anfühlen, als wenn es sich um ein externes Bild handeln würde.

  • Inline-Bilder müssen base64-codiert sein, Hinzufügen von 33% zu ihrer Größe.

Wenn Sie über eine vernünftige öffentliche Website mit hohem Datenverkehr sprechen, würde ich empfehlen, dass Sie Ihr Bild extern speichern und zwischenspeichern. Wenn es sich nur um ein kleines Projekt handelt, können Inline-Bilder für Sie funktionieren.

  • +1 für die Auflistung von Nachteilen. Als Faustregel sollte diese Technik für relativ kleine (größenmäßige) Bilder verwendet werden, z.

    – jensgram

    15. Januar 2010 um 9:50 Uhr

  • Danke Pekka! StackOverflow und (seine Benutzer) Regeln!

    – Cambiata

    15. Januar 2010 um 10:01 Uhr

php Bild aus Binardaten neu erstellen und anzeigen
Krabbe

Eine andere Möglichkeit für Sie besteht darin, ein Skript zu erstellen, das die Bilddaten für die Ausgabe erzeugt, und den Link darauf zu richten.

Bild.php

$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);

header('Content-type: image/png');
echo $imagedata1;

andere_seiten.php:

echo "<img src="https://stackoverflow.com/questions/2070603/image.php?some_params">";

BEARBEITEN: Entschuldigung, ich habe den Hinweis verpasst, kein externes Skript zu wollen, aber diese Lösung ist effizienter als das Codieren des Bildes in base64.

Versuche dies…

$img=base64_encode($row['PICTURE']);

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php%20echo%20$img%20?>"/>

Falls Sie nur das Bild ohne HTML möchten, können Sie Folgendes verwenden:

$filename="assets/test.png";
$original_image = file_get_contents($filename);
$processed_image = process_the_image_somehow($original_image);

header('Content-type: '.mime_content_type($filename));
header('Content-Length: '.strlen($processed_image));
echo $processed_image;

Du darfst den Content-Length-Header nicht vergessen, sonst funktioniert es nicht. Möglicherweise möchten Sie auch mime_content_type() ersetzen, da es laut Dokumentation veraltet ist.

924370cookie-checkphp: Bild aus Binärdaten neu erstellen und anzeigen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy