[解決済み] PHP による効率的な JPEG 画像のリサイズ
2023-05-31 13:15:38
質問
PHP で大きな画像をリサイズする最も効率的な方法は何ですか?
現在、私は GD 関数 imagecopyresampled を使って高解像度の画像を取得し、ウェブ表示用のサイズ(およそ幅700ピクセル×高さ700ピクセル)にきれいにリサイズしています。
これは、小さい (2 MB 未満) 写真では非常に効果的で、リサイズ操作全体がサーバー上で 1 秒未満で完了します。しかし、このサイトは最終的には、最大 10 MB (または最大 5000x4000 ピクセル) のサイズの画像をアップロードする写真家にサービスを提供する予定です。
大きな画像でこの種のリサイズ操作を行うと、メモリ使用量が非常に大きくなる傾向があります (大きな画像では、スクリプトのメモリ使用量が 80 MB を超えて急上昇することがあります)。このリサイズ操作をより効率的にする方法はありますか? 次のような別の画像ライブラリを使用すべきでしょうか? ImageMagick ?
今現在、リサイズのコードは以下のような感じです。
function makeThumbnail($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality) {
// Takes the sourcefile (path/to/image.jpg) and makes a thumbnail from it
// and places it at endfile (path/to/thumb.jpg).
// Load image and get image size.
$img = imagecreatefromjpeg($sourcefile);
$width = imagesx( $img );
$height = imagesy( $img );
if ($width > $height) {
$newwidth = $thumbwidth;
$divisor = $width / $thumbwidth;
$newheight = floor( $height / $divisor);
} else {
$newheight = $thumbheight;
$divisor = $height / $thumbheight;
$newwidth = floor( $width / $divisor );
}
// Create a new temporary image.
$tmpimg = imagecreatetruecolor( $newwidth, $newheight );
// Copy and resize old image into new image.
imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );
// Save thumbnail into a file.
imagejpeg( $tmpimg, $endfile, $quality);
// release the memory
imagedestroy($tmpimg);
imagedestroy($img);
どのように解決するのですか?
ImageMagickの方がずっと速いと言われます。せいぜい両ライブラリを比較して、それを測定するだけです。
- 典型的な画像を1000枚用意します。
- 2つのスクリプトを書く -- 1つはGD用、もう1つは ImageMagickのためのものです。
- その両方を数回実行します。
- 結果を比較する (総実行時間 時間、CPUとI/Oの使用量、結果 の画質) を比較します。
誰もが最高と思うものが、あなたにとって最高であるとは限りません。
また、私の意見では、ImageMagickはより良いAPIインターフェースを持っています。
関連
-
[解決済み】 $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて]
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] div' コンテナに合わせて画像を自動リサイズするにはどうしたらいいですか?
-
[解決済み] div 内の画像を縦に並べる方法
-
[解決済み] Markdownで画像サイズを変更する
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 整形されていない数値が発生しました。
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み] SAJAXは死んだか?何を置き換えるべきか?
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?