0

重複の可能性:
PHP によって既に送信されたヘッダー

echo "how";

$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);

文字列「how」と画像を同時に表示したいのですが、この画像をファイルに保存したくありません。

上記のコードは機能しません。echo "how"という行を削除すると、正常に動作します。文字列と画像を同時に表示したい場合、どうすれば変更できますか?

4

1 に答える 1

1

Nileがすでに指摘しているように、画像にはData-URIを使用する必要があります。

コードを使用した実際のコード例は次のとおりです。

echo "how";

$im         = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
$tmpImg     = tempnam('/tmp', 'image');

imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);
imagejpeg($im, $tmpImg);
imagedestroy($im);

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

unlink($tmpImg);

何が起こるのですか?使用したコードは多かれ少なかれですが、画像はブラウザに直接送信されるのではなく、一時ファイルに書き込まれます。これは、imagejpegの2番目のパラメータです。次に、一時ファイルのコンテンツがBase64-Encodingを使用してData-URIに配置され、そのDataUriがイメージタグのsrcとして設定されます。

最後に一時ファイルを削除することをお勧めします!

一時ファイルを省略したい場合は、出力バッファリングを使用して画像をキャプチャできます。これは次のようになります。

echo 'how';

$im         = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);

imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);

ob_start();
imagejpeg($im);
imagedestroy($im);
$image = ob_get_contents();
ob_end_clean();

echo '<img src="data:image/jpeg;base64,' . base64_encode($image) . '">';
于 2012-09-05T14:20:06.563 に答える