一度メモリにロードできなかった非常に大きな画像があります。メモリ不足例外が発生する可能性があるためです。この写真を小さいサイズにズームする必要があります。それで、私は何をすべきですか?
簡単な考え方は、入力ストリームを開き、一度にバッファ サイズを処理することです。しかし、ズームアルゴリズムは?
行ごとに画像にアクセスできる場合 (たとえば、ビットマップの場合)、できる最も簡単なことは、それをダウンサンプリングすることです。たとえば、n 行ごとに n ピクセルごとに読み取るだけです。
// n is an integer that is the downsampling factor
// width, height are the width and height of the original image, in pixels
// down is a new image that is (height/n * width/n) pixels in size
for (y = 0; y < height; y += n) {
row = ... // read row y from original image into a buffer
for (x = 0; x < width; x += n) {
down[y/n, x/n] = row[x]; // image[row,col] -- shorthand for accessing a pixel
}
}
これは、全体をメモリにロードすることなく、元の画像のサイズをすばやく安価に変更できる手っ取り早い方法です。残念ながら、出力画像にもエイリアシングが発生します (下)。エイリアシングを処理するには、補間を実行する必要があります。上記の行ごとのアプローチを使用しても可能ですが、もう少し複雑です。
8x8 ブロックにデータをエンコードする JPEG など、行ごとに画像に簡単にアクセスできない場合でも、上記の方法と同様の方法を実行できます。ピクセルの行ではなく、ブロックの行を読み取るだけです。アルゴリズムの残りの部分は同じように機能します。さらに、8 分の 1 でダウンサンプリングする場合、JPEG では非常に簡単です。各ブロックの DC 係数を取得するだけです。このアプローチを使用して、8 の倍数である係数によるダウンサンプリングも可能です。
他の多くの詳細 (カラー チャネル、ピクセル ストライドなど) については説明しましたが、始めるにはこれで十分です。
CPU時間とのトレードオフでさまざまなレベルの品質を提供するさまざまなサイズ変更アルゴリズムがたくさんあります。
これらのいずれかを使用すると、大量のファイルを比較的簡単にチャンクで処理できるはずですが、既存のツールを試して、とにかく大量のファイルを処理できるかどうかを確認する必要があります.
Gd グラフィックス ライブラリを使用すると、使用できる作業メモリの量を定義できるため、ファイルをチャンクで処理するためのロジックが既にあることは明らかです。