base64
でエンコードされた文字列をクライアントに送信する必要があります。したがって、私はサーバー上の画像ファイルを開いて読み取り、それをエンコードして、そのデータをimage/jpeg
content-typeと共にブラウザーに送信します。 phpの例:
$image = $imagedir . 'example.jpg';
$image_file = fopen($image, 'r');
$image_data = fread($image_file, filesize($image));
header("Content-type: image/jpeg");
echo 'data:image/jpeg;base64,' . base64_encode($image_data);
クライアントサイド、私は呼んでいます:
var img = new Image();
img.src = "http://www.myserver.com/generate.php";
img.onerror = function(){alert('error');}
$(img).appendTo(document.body);
それは何らかの理由で機能しません。 onerror
は常に起動します。たとえばFireBug Network task
を見ると、正しいヘッダー情報と転送されたバイトの正しい値を受け取っていることがわかります。
そのデータをContent-type: text/plain
として送信すると機能し、base64
文字列がブラウザーに表示されます(スクリプトを直接呼び出す場合)。その出力を<img>
要素のsrc
にコピーして貼り付けると、画像が期待どおりに表示されます。
ここで何が悪いのですか?
ソリューション
私の間違いを指摘してくれてPekka
に感謝します。そのようなアプローチでは、そのバイナリイメージデータをbase64文字列としてエンコードする必要はありません(できません!)。 base64エンコーディングがなくても機能します。
この場合、最初に画像データをbase64エンコードする理由はありません。放出したいのは、プレーンな古い画像データです。
JPEG画像をそのまま通過させるだけです。
AJAX呼び出しを介してgenerate.php
の出力を取得し、その結果をsrc
プロパティに直接入力する場合、これが私にとって意味のある唯一の方法です。これは機能するはずです(ただしIE <8ではありませんが、ご存知だと思います)。ただし、画像のソースとしてgenerate.php
を直接呼び出すことができる場合は、これの必要性を見てください。
Content-typeをimage/jpegに設定する場合は、base64のクラップなしで、jpegデータのみを指定する必要があります。しかし、結果はHTMLであるかのように処理しています。
データURIを効果的に構築していますが、これは問題ありませんが、お気付きのとおり、URIとしてのみです。したがって、コンテンツタイプはそのまま(text/html)のままにし、
echo '<img src="data:image/jpeg;base64,'.base64_encode($image_data).'">';
そして、あなたは行ってもいいです。
私はそれをphpのみを使用して非常に効率的に行うことができると信じています...あなたはbase64でエンコードされたデータで画像をレンダリングするために以下の関数を使用することができます
function binaryImages($imgSrc,$width = null,$height = null){
$img_src = $imgSrc;
$imgbinary = fread(fopen($img_src, "r"), filesize($img_src));
$img_str = base64_encode($imgbinary);
if(isset($height) && isset($width))
{
echo '<img src="data:image/jpg;base64,'.$img_str.'" height="'.$height.'" width="'.$width.'"/>';
}
else
{
echo '<img src="data:image/jpg;base64,'.$img_str.'"/>';
}
}
この機能の使い方
binaryImages("../images/end.jpg",100,100);
関数binaryImagesを実行します.. 1番目のパラメータは画像パス、2番目は幅、そして高さ...高さと幅はオプションです
私はそれをお勧めします: base64_encode MIME base64でデータをエンコードします
echo '<img src="data:image/jpeg;base64,'.base64_encode($image).'">';