10

libjpegを使用して、ディスクからヒープに割り当てられたメモリバッファにjpegイメージをデコードしています。私jpeg_read_scanlinesはファイルから各スキャンラインを読み取ってデコードするために使用します。これは完全に機能しており、各ピクセルを24ビットRGB値としてデコードします。

問題は、(RGBではなく)BGR形式のバッファーを必要とする追加のサードパーティライブラリを使用していることです。このライブラリを使用すると、チャネルの順序が間違っているため、奇妙な結果が得られます。

したがって、libjpegをRGBではなくBGR形式にデコードする方法を見つけたいと思います。Webをトロールしましたが、これを行うようにlibjpegを構成する方法が見つかりませんか?メモリバッファをさらにパスしてカラーチャネルを手動で並べ替えることができることはわかっていますが、作業中のアプリケーションは非常にタイムクリティカルであり、可能な限り高速かつ効率的である必要があります。

4

6 に答える 6

10

あなたのためのいくつかの解決策:

  • 提案どおりに変換を行います。4 ピクセルのグループで作業する場合、3 つの 32 ビット読み取りと書き込み、ビットマスクとシフトですべてを実行でき、非常に高速です。
  • libjpeg の YUV から RGB への変換またはその直後のステージを変更して、R と B を入れ替えます。
  • libjpeg-turboを使用します。libjpeg との下位互換性があり、SIMD アクセラレーションがあり、色空間を提供しJCS_EXT_BGRますJCS_EXT_BGRX
  • R チャンネルと B チャンネルが入れ替わるようにソース イメージを変更します。ばかげているように聞こえますが、ソース コードを変更する必要はありません。

また、あなたは速度を求めていると言いますが、BGR データを (BGRX ではなく) 操作します。32 ビット境界でピクセルを整列させると、おそらくはるかに高速になるため、これはあまり意味がありません。

于 2011-04-11T11:17:10.080 に答える
3

JPEGLIBは、通常のRGB値の順序を変更するには、jmorecfg.hを変更する必要があると言っています。ドキュメントへのリンクは次のとおりです 。http : //www.opensource.apple.com/source/tcl/tcl-20/tcl_ext/tkimg/tkimg/libjpeg/libjpeg.docデータ形式セクションにあります

于 2013-02-16T16:01:17.313 に答える
1

libjpeg の最後のバージョン以降、呼び出し後に取得したオブジェクトのout_color_space属性を変更することも可能です。cinfojpeg_read_header()

引用libjpeg.txt

J_COLOR_SPACE out_color_space

出力色空間。 jpeg_read_header()に基づいて適切なデフォルトを設定しjpeg_color_spaceます。通常、RGB またはグレースケールになります。アプリケーションは、このフィールドを変更して、別の色空間での出力を要求できます。たとえばJCS_GRAYSCALE、カラー ファイルからグレースケール出力を取得するには、 に設定します。

したがって、画像を BGR としてデコードする場合は、解凍中に次の行を追加できます。

cinfo.out_color_space = JCS_EXT_BGR;
于 2016-12-20T21:33:43.880 に答える
1

私のJPEGコーデックを見てください。

libjpeg に対する速度を実際にテストしたことはありません。もしそれができたら、それは啓示かもしれません。いずれにせよ、デコーダはすべて 1 つのファイルにまとめられており、チャンネルの順序を逆にするだけで非常に簡単です。

ここにJPEGコードを維持します:

https://github.com/MalcolmMcLean/babyxrc/tree/master/src

于 2016-12-20T21:44:21.843 に答える
-3

私の知る限り、Libjpegにはこれを行う方法がありません。
いずれにせよ、それはO(n)変換にすぎません。

于 2011-04-11T10:35:08.227 に答える