画像処理にPHPを使用する場合、 ImageCreateFromGD2()関数を使用してGD2形式の画像をロードできます。ただし、この関数は、大きな画像を処理したり、メモリが制約している環境を扱ったりすると、メモリが不十分なメモリ(「許可されたメモリサイズの使い果たされた」エラーなど)を簡単に引き起こす可能性があります。この記事では、実行時にImageCreateFromGD2()のメモリ使用量を減らし、プログラムの安定性を改善するためのいくつかの最適化戦略を検討します。
ImageCreateFromgd2()は、画像全体をGDIMAGEリソースにデコードします。このプロセスで:
画像コンテンツはメモリに完全にロードされます。
GDライブラリは、完全なピクセルマッピングテーブルを内部で作成します。
透明チャネルを備えた画像の場合、追加の透明性情報が必要です。
これらの要因は、高解像度の画像をロードするとメモリの使用量が急速に舞い上がります。たとえば、3000x2000ピクセルの真の色画像(24ビット色)には、20MB近くのメモリが必要になる場合があります。
ini_set()を使用するか、スクリプトの上部に大きなメモリキャップを手動で設定します(サーバーが許可している場合):
ini_set('memory_limit', '256M');
??注:これは最適化方法ではなく、プログラムが直接クラッシュすることを避けるだけです。実際の最適化は、画像のボリュームまたは代替ロード方法を減らすことです。
ImageCreateFromgd2()を使用する前に、元の画像を可能な限りサイズします。他の画像ツール(ImageMagickなど)を使用して、最初に大きな画像を妥当なサイズに圧縮し、次にGDでロードできます。
または、PHPが提供する画像スケーリングツールを使用して、ロード後すぐにスケーリングして、メモリの負担を軽減します。
$srcImage = imagecreatefromgd2('https://m66.net/images/bigimage.gd2');
$dstWidth = imagesx($srcImage) / 2;
$dstHeight = imagesy($srcImage) / 2;
$dstImage = imagescale($srcImage, $dstWidth, $dstHeight);
imagedestroy($srcImage);
GD2ファイル自体は、圧縮形式と非圧縮形式の両方をサポートします。非圧縮形式の場合、理論的にはデータをセグメントで解析できますが、PHPネイティブのImageCreateFromGD2()はストリーミングをサポートしません。
1つの回避策は、GD2形式の使用を避け、JPEGまたはPNGに切り替えることです。これらの2つの形式はより一般的で、より成熟した処理、より良い圧縮効率を持っているためです。
ImageCreatefromgd2()への頻繁な呼び出しを避けてください。たとえば、処理結果を中間ファイルとしてキャッシュできます。
$cacheFile = '/tmp/cache_image.jpg';
if (!file_exists($cacheFile)) {
$srcImage = imagecreatefromgd2('https://m66.net/images/bigimage.gd2');
imagejpeg($srcImage, $cacheFile, 85); // 変換して圧縮します JPEG キャッシュ
imagedestroy($srcImage);
}
$img = imagecreatefromjpeg($cacheFile);
そうすることで、メモリの使用量を削減するだけでなく、読み込み速度も向上します。
GD2は一般的な画像交換形式ではありませんが、主にGDライブラリの内部使用用に設計されています。オプションがある場合は、PNG、JPEG、またはWebP形式に切り替えることを強くお勧めします。彼らは持っている:
より高い圧縮効率;
より広い互換性。
より良いパフォーマンス。
GD2をPNGに変換する例: