偶然縦縞、修正完了

テスト画像

修正前

修正後


ご覧のとおり、修正されました。

                                                                    • -

【豆知識】

JPEGは、(方式にもよりますが)画像をRGB⇒YCbCrという形式に変換してから圧縮します。
これが、ちょっとしたミソになっていて、
RGB(赤、緑、青)という色の表し方では、人間の目にとっては、RもGもBも、等価に価値のあるものですが、
YCbCrという色の表し方では、人間のからすると、Yは重要ですが、CbとCrは、そんなに重要ではありません。

つまり、RGBでは、どれか一つでも値が変わると、人間の目にとって色が変わりやすく
YCbCrでは、CbとCrの値が変わっても、人間の目にとっては、色が変わりにくいという事を表しています。


これを利用して、JPEGの中の圧縮率の高い方式では、
Yは、元の画像サイズと同じだけの量のデータを保存するが、
CbとCrは、元の画像よりも少ない量のデータしか保存しません(1/4とか)

例えば、
画像を、2ピクセル × 2ピクセルのデータ毎に見た場合に、
Yは、2x2で4ピクセル分のデータを保存
CbとCrは、(例えば)左上の1ピクセル分のデータしか保存しない
というような感じです。

これを、ダウンサンプリングと言うと思います。

                                                                    • -

そんなこんなで、今回のバグは、
ダウンサンプリングされている成分のデコードは上手く動いていたが(テスト画像ではCbCr)
ダウンサンプリングされていない成分のデコードの時に、格納する場所を間違えていたので、
8x8ブロック単位で考えた時に、Y方向に、2で割り切れるブロックの値を、-1ブロックした場所に上書きしていた
ので、空白(つまり 0x00 つまり 黒 っぽく)なっていたという事でした。