3

に基づくJPEG画像解凍の次の標準コードがありlibjpegます。

jpeg_decompress_struct cinfo;
// ...Set error manager and data source...
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
while (cinfo.output_scanline < cinfo.output_height) {
    JSAMPLE* scanlines[1];
    // ...Set target pointer for scanline...
    jpeg_read_scanlines(&cinfo, scanlines, 1);
}
jpeg_destroy_decompress(&cinfo);

長方形でトリミングされた画像の一部を読みたい:

// struct RECT {
//     int left;
//     int top;
//     int right;
//     int bottom;
// };
RECT cropRect; // Coordinates of the crop rectangle relative to the output image size

libjpeg画像をすぐにトリミングするように指示するには、以下のコードで何を変更する必要がありますか?

これが私がそれを実装する方法です:

  1. top - 1最初の行を無視します。
  2. 次の各行についてbottom - top:1)スキャンラインを一時バッファに読み取ります。[left, right)2)一時バッファからターゲットバッファに列範囲からピクセルをコピーします。
  3. 減圧を中止します。

しかし、このコードは冗長です。

4

1 に答える 1

2

パフォーマンス面では、特に元の画像が高解像度で、その一部が比較的必要な場合は、最初に画像を解凍せずにロスレスでトリミング/トリミングする必要があります。これは、16x16 px(8x8?)の粒度で高速に実行できます。次に、余白から数行とピクセルだけスキップして解凍します。操作に使用するメモリの量が少ない場合は、このアプローチもお勧めします。

少しだけトリミングしている場合は、完全に解凍を開始する当初の計画がおそらく最善です。ここには冗長性はほとんどありません。

于 2012-10-03T17:10:20.260 に答える