ImagePng()で画像を作成しました。画像をファイルシステムに保存したくないが、base64エンコードインライン画像と同じページに出力したい。
print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>';
これは機能しません。
これは単一のPHPファイルで可能ですか?
前もって感謝します!
ここでの秘訣は、出力バッファリングを使用してimagepng()
からの出力をキャプチャすることです。これにより、出力がブラウザまたはファイルに送信されます。変数(またはbase64エンコード)に格納するためにそれを返しません:
_// Enable output buffering
ob_start();
imagepng($png);
// Capture the output and clear the output buffer
$imagedata = ob_get_clean();
print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>';
_
これは、 imagepng()
docs。 のユーザー例から採用されています。
AJAXでPHPを使用するときにob_get_contents()を使用するのに問題があったので、これを試しました:
$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);
これにより、一時的な画像ファイルがサーバーに保存され、エンコードされてエコーアウトされた後に削除されます。
明示的なファイルに保存する必要がなく、すでにob_start()
を他の目的で使用している場合(したがって、この場合、多くのリファクタリングなしでob_startを使用することはできません)、独自のストリームラッパーを定義できます。ストリーム出力を変数に格納します。
stream_wrapper_register
を使用して新しいストリームラッパーを登録し、そのstream_write
メソッドを実装して、後で値を取得できる変数に書き込みます。次に、このストリームをimagepng
に渡します(実際には、このストリームのURIを渡す必要があります)。 imagepng
ストリームを閉じたい場合でも、ストリームラッパーが閉じたときにデータを破棄しない限り(stream_close
メソッドが呼び出されます)、気になりません。