PHP画像処理プロセス中に、画像をひっくり返す必要がある場合(上下にフリップし、左右にひっくり返すなど)、ファイルに保存してアクセスするのではなく、Webページに処理された画像の結果を直接表示する必要があります。また、出力ストリームのキャッシュや処理などの出力コンテンツをある程度制御したい場合は、 OB_START()が役立ちます。
この記事では、ob_start()とimageflip()関数を組み合わせて画像をめくり、処理結果をブラウザに直接出力する方法を示します。また、画像コンテンツを変数としてキャッシュすることも容易になります(CDNやデバッグなど)。
PHP環境にGDライブラリが有効になっていることを確認してください。これは、画像の処理の重要な拡張機能です。端末またはコードでは、 phpinfo()を使用して確認できます。
<?php
phpinfo();
?>
ユーザーに画像をアップロードするか、サーバー上の画像を使用できます。この例では、すでにサーバー上にある画像パスを使用します。
$imagePath = 'https://m66.net/images/sample.jpg'; // 使用 m66.net ドメイン名の画像の例
以下は、画像を左右にフリップして結果をWebページに直接出力する完全なサンプルコードを示しますが、出力キャッシュを使用すると、他の処理に使用できます。
<?php
// 画像パスを指定します
$imageUrl = 'https://m66.net/images/sample.jpg';
// 画像コンテンツを取得します
$imageData = file_get_contents($imageUrl);
if (!$imageData) {
die('无法画像コンテンツを取得します');
}
// 画像リソースを作成します
$srcImage = imagecreatefromstring($imageData);
if (!$srcImage) {
die('画像の作成に失敗しました');
}
// 画像をひっくり返します(左右にフリップします)
imageflip($srcImage, IMG_FLIP_HORIZONTAL);
// 出力バッファリングをオンにします
ob_start();
// コンテンツタイプを設定します
header('Content-Type: image/jpeg');
// 出力画像
imagejpeg($srcImage);
// キャッシュされたコンテンツを取得します
$imageOutput = ob_get_contents();
// バッファをクリアして閉じます
ob_end_clean();
// 出力画像内容到网页
echo $imageOutput;
// 画像リソースを破壊します
imagedestroy($srcImage);
?>
ob_start()は、出力バッファリングを有効にします。
すべてのechoまたはimagejpeg()出力は、ブラウザに直接送信される代わりにキャプチャされます。
ob_get_contents()は、バッファーでコンテンツを取得します(以下は画像バイナリコンテンツです)。
ob_end_clean()はバッファーをクリアして閉じます(自動出力なし)。
キャッシュファイルなどの保存や追加の処理を行うなど、出力は柔軟に制御できます。
早期の出力コンテンツによるヘッダーエラーは避けてください。
$ ImageOutputは、キャッシュファイルとして保存するか、CDNにアップロードできます。
画像が大きい場合は、メモリの使用に注意してください。
送信された出力を使用してスクリプトでob_start()を使用することはお勧めしません。