2016年11月6日日曜日

Paint.NetでPNGやBMPで保存したときに非可逆な処理をされる

画像を加工したりして遊んでるときに気がついたことですが、Paint.Net(V4.0.12)でPNGやBMP等の「可逆圧縮」もしくは「非圧縮」で保存した場合に、細かなデータが消えてしまうことが有りました。ここでの細かいデータというのは高周波なデータという意味ではなく、ある地点と隣の地点の輝度差が赤だけ1明るいというようなデータです。
本来BMPファイルは輝度情報を直接保存しますから、微妙な輝度差が捨てられることは有りえません。PNGのフォーマットは詳しく知りませんが、可逆圧縮を期待して保存している以上は、微妙な輝度差であっても残っていてほしいものです。

結論から言うと、Paint.Netの保存オプションでビット深度を「自動検出」にしていると細かな輝度情報が消えてしまうようです。ということでPNGなら32bitやBMPなら24bitを明示的に指示して保存する必要があります。

この問題は保存フォーマットを自動で検出する際に明らかに使用している色が少ない場合はインデックスカラーが選択されるわけですが、RAWデータからカラーパレットを作る際に、まず輝度を平滑化して細かな輝度情報を捨てるという処理をしているようです。これについてはアルゴリズムの最適化の問題であり、そもそも輝度が1変化することに意味を持つ画像というのはあまりありませんから、バグというよりは道具を使う方の問題です。


あとコレはバグと言うには微妙な問題ですが、保存ダイアログでフォーマットをPNG、ファイル名の拡張子をBMPにした場合、拡張子はBMPでファイルフォーマットがPNGという残念なデータになってしまいます(おそらく他の組み合わせでもそのような挙動になると思います)。
そもそも近年の画像を扱うプログラムでは拡張子は無視してファイルヘッダのマジックナンバー等でフォーマットを見分けており、実質的に拡張子はプログラムに対する関連付け以上の意味を持っていません。ということでこれも使う側の問題といえばそうなのですが。

0 件のコメント:

コメントを投稿