web-dev-qa-db-ja.com

PHP:ImagePngで画像を作成し、base64_encodeで1つのファイルに変換しますか?

ImagePng()で画像を作成しました。画像をファイルシステムに保存したくないが、base64エンコードインライン画像と同じページに出力したい。

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

これは機能しません。

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

前もって感謝します!

15

ここでの秘訣は、出力バッファリングを使用して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。 のユーザー例から採用されています。

29

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);

これにより、一時的な画像ファイルがサーバーに保存され、エンコードされてエコーアウトされた後に削除されます。

5
SyntaxLAMP

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

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

0
SOFe