2011-07-21 20 views
8

CでJPEG/JFIFエンコーダとデコーダを一から書き込もうとしていますが、サンプルJPEGファイルを試しましたが、MSのペイント、Firefoxを使用して開くことができないようです。しかし、JPEGsnoop(http://www.impulseadventure.com/photo/jpeg-snoop.html?ver=1.5.2)とhttp://nothings.org/stb_image.cを使ってデコードできます。私はサンプルのJPEGファイルがJPEG/JFIF標準に準拠していると思いますが、私はMSのペイントやFirefoxのようなアプリケーションがそれを開くことができないのはなぜ分かりません。ここでjpegファイル形式の質問

はサンプルJPEGがどのように見えるかです:

 

    SOI 
     APP0 segment 
     DQT segment (contains two quantization tables) 
     COM segment 
     SOF0 segment 
     DHT segment (contains four Huffman tables) 
     SOS segment 
     huffman encoded data 
    EOI 

サンプルのJPEGファイルは3つの成分Y CbとCrを持っています。 Cb Cr成分のサブサンプリングはありません。 2つの量子化テーブルはすべて1で埋められます。 DHTセグメントにおける 四のハフマンテーブルはすべて同一であり、それはすべてのコードがエンコードは、本当にデータを圧縮していないので、ハフマン8ビット、ある意味、この

 

     [0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0] 
     [0,1,2, ... , 254] 

のように見えます。

ハフマン符号化されたデータは、次のようになります。

 

     [0x0000(DC) 0x0000(AC)](Y) 
     [0x0000(DC) 0x0000(AC)](Cb) 
     [0x0000(DC) 0x0000(AC)](Cr) for all (i, j) MCUs except (10, 10) 

     the data in (10, 10) MCU: 
     [0x0008(DC) 0x0000(DC), 0x0000(AC)](Y) 
     [0x0000(DC) 0x0000(AC)](Cb) 
     [0x0000(DC) 0x0000(AC)](Cr) 

誰もがこのサンプルのJPEGファイルと間違っているものを私に伝えることができますか?ありがとう。ここで

は、私は(私は最初からそれを書いていないが)いくつかのPNGコードで同様の問題を持っていた数年前のサンプルのJPEGファイル(ha.jpg)http://www.guoxiaoyong.net/ha.jpg

+1

サンプルファイルへのリンクを提供できますか? –

+0

なぜ閉じる?ポスターはたくさんの仕事をしており、明確に質問し、彼らが何をしているのかを説明しました。 –

答えて

4

へのリンクです。私のコードは、Windowsやいくつかのブラウザなどのライブラリよりも標準に準拠していたことが判明しました。標準的なケースではうまくいきましたが、標準と完全に一致していても異常な画像や工夫された画像で窒息します。それらを引き上げる一般的な方法は、画像に奇数ピクセル幅を使用することでした。私のテストスイートのほぼ半分はWindowsで見ることができませんでした。 (これはWindows 95のような以前のバージョンでした。)Windowsのコーデックは大幅に改善されました。

私はオープンソースのPNGライブラリを構築し、参考実装として使用しました。私のコードが生成したイメージがリファレンス実装によって解析され、その逆も可能である限り、私はそれを良いものと呼びました。また、私のコードでWindowsが表示できる画像が表示されることを確認しました。私がバグを発見するたびに、私はそれを修正する前にイメージをテストスイートに追加しました。それは私のプロジェクトにとって十分だった。

同じことができます。リファレンス実装として広く使われているオープンソースのJPEGライブラリがあると思います。

Firefoxを使って画像を開くことができない理由を本当に理解したい場合は、Firefoxで開いている画像から始めてみてください。失敗したイメージのようにするために、小さな変更(例えば、16進エディタ)を徐々に行います。これは、画像のどの部分がアプリケーションをトリプルしているかを絞り込むのに役立ちます。確かに、それらのステップのいくつかは試しにくいかもしれません。

0

あなたのファイルは非常に非合理的にコード化されていると思います。私はあなたが参照ファイルを見つけ、その構造を模倣しようとお勧めします。また、標準のサンプルテーブルを使用します。あなたのハフマンデータは0でいっぱいになり、すべてのDC値は0になり、ブロックの終わりになります。

jpegsnoopを見ると、画像は2つの色合いになりますが、均質でなければなりません。私の推測では、あなたが指定した解像度でイメージをコーディングするのに十分なデータがないということです。私は多くのデコーダがあなたのファイルが壊れているということを想定していると思います。

0

Firefox(および多くの他のアプリAFAIK)は、Independent JPEG groupのオープンソースのJPEGライブラリに基づいています。

あなたはこれのソースをダウンロードして、あなたのファイルが好きではない理由と時期を正確に確認することができます。

また、車輪を改革する手間を省くことができます: