2012-04-20 22 views
0

JPEG画像をC++で8×8ブロックに分割する方法を教えてもらえますか?JPEG画像をC++のブロックで分割する

ありがとうございました。

+0

すでに画像がメモリに保存されていて、DCTを実行する準備ができていますか? – GManNickG

+0

はい、そうです。 – NiVeR

+0

私はまだ少し不明です。メモリに圧縮されたデータがあることを意味しますか?その場合、*逆DCTを実行して空間データを復元したいとします。この場合、すでに8×8ブロックに分割されています。メモリに「未処理」のピクセルがあり、JPEG圧縮を行いたい場合は、8×8ブロックに分割し、それぞれのブロックでDCTを実行します。 –

答えて

1

イメージを解凍する必要があります。turbojpgライブラリ(非常に高速です)を使用すると、RGB(またはRGBA)としてunsigned charの配列が得られます。今度は、圧縮されていないイメージがあります。これは、R GとBそれぞれのバイト値を持っています。

ここからは、3 * 8 charブロックを通り、他のメモリ位置にmemcpyを使ってコピーする簡単なforループを作成してください。

turbojpgライブラリから返される配列は、1次元のリニアバイト配列であることに注意する必要があります。したがって、スキャンラインは次々に格納されます。必要に応じてブロックを作成するときにこれを考慮に入れると、配列を別々にトラバースする必要があります。

+0

外部ライブラリを使用せずにやりたいですか? – NiVeR

+0

JPEG圧縮解除関数を自分で書きたいのですか?友人、そして経験からすれば、それはあなたにはまともなスピードが欲しいなら、それは簡単ではないと言うことができます! –

+0

まず最初に、画像を開いて8 x 8ピクセルブロックで表現したいのですが、 (w * h)ここでwとhは画像の重みと高さですが、これはもちろん遅すぎます – NiVeR

2

ああ、ダイ・ハード・アプローチ。私の心はあなたに行く。多くのことを学ぶことを期待していますが、そうすることで時間や血、痛みを失うことに注意してください。

Compression FAQには、JPEGの仕組みに関する詳細がいくつかあります。良い出発点はPart 2:Subject 75:JPEGの紹介です。

一言で言えば、一般的なJPEGファイルを、あなたはエンコーディングは4~6ステップ逆転しなければならないが:

  1. (6)(JFIF容器
  2. から適切なヘッダ及び画像データを抽出5)
  3. をハフマン符号化を逆転(4)あなたは、あなたが適切な逆DCTに供給できた8×8ブロックに委ねられるべき量子化

を逆転。

ウィキペディアには、JFIFフォーマットのほか、ハフマンテーブルと、structure of the JPEGデータがJFIF内にあります。

私はあなたがそれについて学ぶためにJPEGで遊ぶことを望んでいると仮定していますか?実用化されていれば、生のエンコードされたブロックへのアクセスはほとんど必要ありません。

コメントを見て編集:ファイル全体を読み書きせずに非常に大きなJPEGの一部を取得したい場合は、ImageMagickのstreamコマンドを使用できます。それはファイル全体を読むことなくサブイメージを得ることができます。例: stream -extract 8x8+16+16 large.jpeg block.rgbを使用して、(16,16)で始まる8x8ブロックを取得します。

+0

私は学習と開発に興味があります将来顔認識ソフトウェア。しかし、今のところ私は基本を学びたい。 – NiVeR

関連する問題