PHP:Erstellen Sie ein Bild aus Binärdaten neu und zeigen Sie es an
-
20-09-2019 - |
Frage
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 ...
Lösung
Sie können dies mit einem tun Daten Uri im Bild src
Attribut.
Das Format lautet: data:[<MIME-type>][;charset="<encoding>"][;base64],<data>
Dieses Beispiel ist direkt von der Wikipedia -Seite auf Daten uris:
<?php
function data_uri($file, $mime)
{
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
return ('data:' . $mime . ';base64,' . $base64);
}
?>
<img src="<?php echo data_uri('elephant.png','image/png'); ?>" alt="An elephant" />
Andere Tipps
Dies ist tatsächlich mit Inline-Bildern (genannt Daten-URIS).
Ihr Bild-Tag würde 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 meist keine gute Idee sind:
Das Laden der Seite 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 Vorgänge am Bild durchführen.Ihre Website wird sich höchstwahrscheinlich viel langsamer anfühlen, als wenn es ein externes Bild wäre.
Inline-Bilder müssen Base64-kodiert sein, 33 % zu ihrer Größe hinzufügen.
Wenn es sich um eine öffentliche Website mit einigermaßen hohem Datenverkehr handelt, würde ich Ihnen empfehlen, Ihr Bild extern zu speichern und zwischenzuspeichern.Wenn es sich nur um ein kleines Projekt handelt, könnten Inline-Bilder für Sie geeignet sein.
Versuche dies...
$img=base64_encode($row['PICTURE']);
<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
Eine andere Möglichkeit für Sie besteht darin, ein Skript zu erstellen, das die Bilddaten an die Ausgabe erstellt und den Link dazu leitet.
Image.php
$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);
header('Content-type: image/png');
echo $imagedata1;
othus_pages.php:
echo "<img src='image.php?some_params'>";
Bearbeiten: Entschuldigung, ich habe die Mitteilung verpasst, kein externes Skript zu wünschen, aber diese Lösung ist effizienter als das Codieren des Bildes für Base64.
Falls Sie nur das Bild wünschen, 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;
Sie dürfen den Header der Inhaltslänge nicht vergessen, sonst wird er nicht funktioniert. Möglicherweise möchten Sie auch mime_content_type () ersetzen, da es gemäß den Dokumenten veraltet ist.