2012-02-21 1 views
15

ImagePng()で画像を作成しました。私は動作しませんPHP:ImagePngで画像を作成し、base64_encodeで1つのファイルに変換しますか?

print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>'; 

のように、それはファイルシステムに画像を保存したくないが、base64でエンコードインライン画像と同じページ上の出力にそれをしたいです。

これは単一のPHPファイルでは可能ですか?

ありがとうございます!

答えて

27

ここでは、出力バッファリングを使用して、出力をブラウザまたはファイルに送信するimagepng()の出力をキャプチャする方法があります。

// Enable output buffering 
ob_start(); 
imagepng($png); 
// Capture the output 
$imagedata = ob_get_contents(); 
// Clear the output buffer 
ob_end_clean(); 

print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>'; 

これはthe imagepng() docs.

5

でPHPを使用する場合、私はトラブルob_get_contentsを使用して()を有していたユーザの例から採用されている:それは変数に格納する(またはBase64エンコード)戻りませんAJAXは、私が試したこの:

$id = generateID(); //Whereas this generates a random ID number 
$file="testimage".$id.".png"; 
imagepng($image, $file); 
imagedestroy($image); 
echo(base64_encode(file_get_contents($file))); 
unlink($file); 

これは、サーバー上の一時イメージファイルを保存し、それをコード化し、エコー出力された後、それが削除されました。

0

明示的なファイルに格納したくない場合で、すでに他のものにob_start()を使用している場合(多くのリファクタリングなしでob_startを使用することはできません)、独自のストリームラッパーを定義して変数へのストリーム出力。

stream_wrapper_registerを使用して新しいストリームラッパーを登録し、その値を後で取り出せる変数に書き込むためのstream_writeメソッドを実装します。次に、このストリームを渡します(実際にはこのストリームのURIを渡す必要があります)。imagepngに渡します。 imagepngストリームを閉じたい場合は、ストリームラッパーがデータが閉じられたときにデータを破棄しない限り(stream_closeメソッドが呼び出されます)、気にする必要はありません。

関連する問題