- ベストアンサー
Jpegデータに関して
同一の画格、同一のJpegヘッダ情報を持つ、二つのJepgファイルを下記方法で 1つのファイルにしようとするとViwerでの表示に乱れが生じます。 何故乱れが生じるのかご教授お願いします。。。 画像は被写体こそ違いますが、どちらもYCbCr:4:2:0で、160x160のサイズです 1:画像2のイメージパートを画像1のイメージパートの直後にコピー 2:SOF0マーカー内にあるサイズを160x160から160*320に変更 スタート/エンドマーカ等必要はマーカは全て存在しています 乱れといっても全く見れない訳ではなく二つの画像の境界付近からした半分が 白黒のようのボヤけて表示されてしまいます 各々のファイルで圧縮かけたものなので無理なのかもしれませんが 乱れをなくしたいです。 操作後のファイルを添付しています
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No2です。 もうひとつ重要な事を忘れていました。 jpegでは、画像の交流成分は各ブロックごとに個別に扱われますが、直流成分は違います。 直流成分は色ごとに、直前のブロックとの差分で記録されています。 ですから、1番目の画像の最後のブロックの直流成分が「0」でない限り、正常には表示されません。 No2で述べた1/8で正常表示というのはこれを考慮していませんでした。一応1/8の確率でノイズは無くなりますが、上下で色の濃さが違ってしまいます。 なおjpegでは色を-1024~1023の値で扱っていますが、色コードは0~255で表しますので、この「0」というのは色コードでは128の灰色を表します。 なので解決策としては、1番目の画像の右下の1ブロック(通常は最大16×16ドット)を128の灰色にする方法もありますが、No2で述べたリスタートマーカーはこの直流成分も0にリセットしますのでこちらがお勧めです。
その他の回答 (2)
- SortaNerd_
- ベストアンサー率59% (309/522)
繋ぎ目でビット単位の空白が生じているのでしょう。 jpegの圧縮データはビット単位で構成されていますので、単純にバイト単位で繋げただけでは間に空白ができてしまい、そこを誤って読み取ってしまいます。 色々なデータで合成してみて、1/8の確率で正常に読めれば間違いないでしょう。 解決策としては画像2のデータをビット単位で全てずらすか、あるいはリスタートマーカーを入れればそこでバイト境界にリセットされますのでバイト単位でも結合が可能になります。 ただし、リスタートインターバルをちょうど画像の最後にマーカーが来るように設定しなければなりません。また、画像中のマーカーが8の倍数でない場合マーカーの番号を変える必要があり面倒です。
- hashioogi
- ベストアンサー率25% (102/404)
DHTテーブルの内容は両者とも同じですか ? SOSの中のDHTの番号は一致していますか ?
補足
ありがとうございました。 助かりました 画像間にリスタートマーカーをいれ、ヘッダにもRSTを付記。RSTのブロック間隔は画角とサンプリングファクタから調整する事で正常に表示出来ました!YCbCr:4:2:0の場合だと、MCUを考えサイズ/(16*16)にしてます。実際他の方法で試した際に画像はきれいに表示できてもじっと見ないと分からない程度ながら濃淡の差があったので気になっていましたこれだったのですね