2010-09-12 6 views
10

In der PHP manual für base64_encode() sah ich das folgende Skript für die Ausgabe eines Bildes.PHP HTML Bildausgabe

<?php 

$imgfile = "test.gif"; 

$handle = fopen($filename, "r"); 

$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile)); 

echo '<img src="data:image/gif;base64,' . base64_encode($imgbinary) . '" />'; 

?> 

Aber wie können Sie die Ausgabe ein Bild dynamisch mit GD erstellt?

Ich habe dies versucht:

$im = imagecreatetruecolor(400, 400); 

imagefilledrectangle($im, 0, 0, 200, 200, 0xFF0000); 
imagefilledrectangle($im, 200, 0, 400, 200, 0x0000FF); 
imagefilledrectangle($im, 0, 200, 200, 400, 0xFFFF00); 
imagefilledrectangle($im, 200, 200, 400, 400, 0x00FF00); 

echo '<img src="data:image/png;base64,'.base64_encode(imagepng($im)).'" />'; 

Warum funktioniert das?

Es scheint zu funktionieren in IE aber nicht Firefox. Wie kann ich es cross-browser machen?

+2

wurden mit Ihnen MSIE? – BalusC

+0

Nein, Firefox. Hmm, es funktioniert in IE ... –

+3

Haben Sie eine echte Notwendigkeit, Daten zu verwenden: URIs? Denn wenn du es nicht tust, ist es besser, sie nicht zu benutzen. Sie haben eine Menge Nachteile. IE <8 unterstützt sie beispielsweise überhaupt nicht. –

Antwort

15

Ok, sorry, ich dachte zu schnell :)

imagepng() ausgeben wird Rohdatenstrom direkt an den Browser, so dass Sie ob_start() und andere Ausgabepufferung verwenden müssen, behandelt sie zu erhalten.

Sie sind hier:

ob_start(); 
imagepng($yourGdImageHandle); 
$output = ob_get_contents(); 
ob_end_clean(); 

Das ist - Sie müssen für Sie base64_encode() Funktion $output Variable verwenden.

+0

Vielleicht, aber macht er das nicht schon? –

+0

@ Tomasz guter Punkt! Das ist es. +1 –

+0

@Mark nein, er hat Recht. Wenn es in IE funktioniert, dann weil der 'img src' Teil ignoriert wird. Das Rohbild wird an den Browser ausgegeben und 'base64_encode' findet nie statt. –

1

Höchst wahrscheinlich, weil das data: URI-Schema ist extrem begrenzt und gut zu bedienen, es sei denn, es gibt absolut keine Möglichkeit, um es herum.

Im Internet Explorer zum Beispiel funktioniert dies erst nach IE 8; und dort gibt es eine global 32 kilobyte limitation für Daten: URIs.

+0

Also Ihr Sprichwort machen es anders? –

+0

@Mark, was brauchen Sie Daten: URIs für an erster Stelle? –

+0

Captcha-Experiment. Siehe http: // stackoverflow.com/questions/3692969/captcha-encryption –

0

Sie müssen zuerst Ihr Bild als PNG speichern und dann lesen, um seinen Inhalt als Wert zu erhalten.

http://www.php.net/manual/en/function.imagepng.php

imagepng() gibt nicht die PNG-Datei. Es gibt es direkt an den Browser aus und gibt dann eine boolesche Bedeutung zurück, die Erfolg oder Misserfolg bedeutet.

(aus php.net :) PHP intern arbeitet mit einer temporären Datei beim Senden des Bildes an den Browser, so dass Sie nichts durch zweimal Aufruf von imagepng() gewinnen.

+0

Nun, ich möchte nicht als Bild speichern, aber ... –

+1

Sie können imagepng() zwischen ob_start() und ob_get_contents(); ob_end_clean(); um das Bild zu erhalten, aber es verwendet sowieso eine temporäre Datei. –

11

Weil imagepng bool oder Bildstrom direkt zur Ausgabe ausgibt.
Also, um Bilddaten zu erhalten, sollten Sie die Ausgangspuffer wie folgt verwenden:

ob_start(); 
imagepng($im); 
$image = ob_get_contents(); 
ob_end_clean(); 
echo '<img src="data:image/png;base64,'.base64_encode($image).'" />';