1

Independent JPEG Groupのjpeg ライブラリ v8d を使用していますが、jpeg 解凍によるデータの読み取りと処理の方法を変更したいと考えています。

djpegmain()では、一度に 1 つのスキャンライン/行のみが読み取られ、各jpeg_read_scanlines()呼び出しで処理されます。したがって、画像全体を読み取るには、すべての行が読み取られて処理されるまで、この関数が呼び出されます。

  while (cinfo.output_scanline < cinfo.output_height) { 
    num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
                    dest_mgr->buffer_height); //read and process
    (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); //write to file
  }

しかし、画像全体を一度読み取ってメモリに保存し、メモリから画像全体を処理したいと思います。を読んlibjpeg.txtで、これが可能であることがわかりました。

多少の進歩はあったものの、完全に機能させることはできませんでした。pub.buffer_height値とpub.bufferサイズを大きくすることで、一度に数行を読み取ることができるようになりましたが、どれだけ大きくpub.buffer_heightpub.bufferも、各jpeg_read_scanlines()呼び出しで読み取られるのは数行だけです。これについて何か考えはありますか?

4

1 に答える 1

3

それぞれ数行だけが読み取られますjpeg_read_scanlines()

はい、ループで呼び出します。以下は、一度に 1 つのスキャンラインを取得するループです。

unsigned char *rowp[1], *pixdata = ...;
unsigned rowbytes = ..., height = ...;

while (cinfo.output_scanline < height) {
    rowp[0] = pixdata + cinfo.output_scanline * rowbytes;
    jpeg_read_scanlines(&cinfo, rowp, 1);
}

ループが終了すると、イメージ全体が得られます。

于 2012-12-08T17:13:29.427 に答える