3

libjpeg のjpeg_read_scanlines動作について混乱しています。JPEGを行ごとに解凍し、解凍されたピクセルバッファを作成することは私の理解です。

典型的な使用法は次のようなものです。

jpeg_decompress_struct cinfo;

...

unsigned char* image = new unsigned char[cinfo.image_width  * cinfo.image_height];
unsigned char* ptr = image; 
int row_stride = cinfo.image_width;

while (cinfo.output_scanline < cinfo.image_height) 
{
    jpeg_read_scanlines(&cinfo, &ptr, 1);
    ptr += row_stride;
}


質問:出力バッファ サイズについて混乱しています。を使用しているすべてのサンプル コードjpeg_read_scanlinesで、出力バッファのサイズは ですwidth X height。ここで、幅と高さは JPEG ファイルのサイズを表します。したがって、10x10 の JPEG ファイルの場合、100 バイトの出力バッファがあります。

でも・・・RGBの各ピクセルのサイズが3バイト(24bit)じゃないですか?width X height X 3では、圧縮されていないデータは実際にはバイト であるべきではありませんか?

なぜそうではないのですか?

jpeg_write_scanlinesを使用するコードでは、圧縮されるバッファがIS であることに気付きましたwidth X height X 3。では、なぜバッファjpeg_read_scanlinesのみで使用されるのwidth X heightでしょうか?

4

2 に答える 2

0

RGB データの場合、output_components3 (R、G、B) になります。

libjpeg.txtからの関連ドキュメントを次に示します。

   output_width     image width and height, as scaled
   output_height
   out_color_components # of color components in out_color_space
   output_components    # of color components returned per pixel
   colormap     the selected colormap, if any
   actual_number_of_colors      number of entries in colormap

output_components is 1 (a colormap index) when quantizing colors; otherwise it
equals out_color_components.  It is the number of JSAMPLE values that will be
emitted per pixel in the output arrays.

Typically you will need to allocate data buffers to hold the incoming image.
You will need output_width * output_components JSAMPLEs per scanline in your
output buffer, and a total of output_height scanlines will be returned.
于 2015-05-07T05:22:00.530 に答える