2017年1月14日土曜日

画像ビューア

メインで使ってるデスクトップPCには画像ビューアとしてPicasaが入っていて、大抵の用事はこれで足りてる。が、今回、高解像度な画像を表示できない事が発生してきた。
具体的には、16384x16384(Zoom6の世界地図規模)だと問題ないが、23040x22528(Zoom10で日本全国規模)では表示できない。前者はPNGで100MBほど、後者は45MBほどなので、画像自体の容量とかは問題ではないと思う。もちろん圧縮データの大きさなんて比較しても意味ないのだけど。

PicasaはPNGの透過も扱えるので、1ピクセル32bitとして前者は、1GiBちょうど、後者は1.93GiBくらいある。Picasaは32bitで、使用できるメモリ量は2GBに制限されるため、画像データを展開するメモリを確保するだけでいっぱいいっぱいで、展開作業とか、画面への表示とかを行う余裕もないのだと思う。

ということで、1辺2^14ピクセル四方くらいの画像より大きい画像を開くには何か別のプログラムが必要になる。
画像ビューアとして快適かというと微妙なところだが、とりあえず手元にあるアプリではPaint.netが問題なく開けた。64bit版が入ってるので、CPU速度の制限程度しかない。ま、非圧縮時で2GBのデータを開くと考えれば妥当な待ち時間だと思う。

他に何か良いのないかなと思ってぐぐったところ、Honeyviewというアプリが出てきた。これも64bit版があり、大容量の画像を開くのは問題ない。ただし操作感がいままでに触ったことがない感じで、マウス操作の挙動も独特だから慣れるのが大変かも。



世間を探すと、学術目的の画像ビューア(というかデータビューア)があって、超高精度の美術品スキャンデータとかみたいなものを見る用途で有るらしい。僕の用途も高解像度地図を開きたいわけで、この方向性になる。詳しく調べてないけど、学術用途なりの値段がしそうだなーという感じ。
博物館が所蔵品の高解像度スキャンとかを一般に公開するような時代になれば、その流れで大容量画像を表示するソフトウェアも普及するのかもしれない。でも、表示手段がないから博物館が出し渋ってる、みたいな卵鶏問題になるのかも。
元データがどれくらいで、公開にあたってどれくらいリサイズされてるのかわからないけど、スミソニアンのデジタルアーカイブだと長辺3000pxくらいの常識的なサイズだった。表示手段が一般的でない以上はこれくらいが落とし所なんだろうなぁ。


ベントレー、530億ピクセルの超高解像画像を公開 - 【自動車業界ニュース】 - carview! - 自動車
530億ピクセルの正方形画像として、1辺23万pxくらい。とはいえWebブラウザで表示できる程度に(ものすごく)縮小された画像を見てるだけだし、必要に応じてトリミングしてリサイズした画像を出してるだけだろうから、高解像度って言うとなんかびみょーな気がする。
同様に、こういう話題性みたいなので出て来る高解像度画像はいくつか有るらしいが、たぶん似たようなもんだと思う。


とりあえず、比較的低解像度(非圧縮32bit/pxで1GB程度まで)はPicasaが操作性や動作速度ともに問題なし。それ以上になると読み込みに時間がかかるがPaint.netが優位、という感じかな。
Paint.netはスケーリング時にリサイズされた画像を生成するらしく、その時に引っかかりが有る。スケーリングしないでスクロールだけなら結構サクサク動く。ただしビューアじゃなくエディタだから、マウス左クリックとかすると書き込まれるという難点が有る。これは慣れるしかないかなぁ。


ズーム12で北海道地域を画像化すると横3万、縦2万くらいの解像度になる。z14だと1辺4倍で12万x8万くらい。かなりでかいね。未圧縮で8GBの画像データかぁ。それでも高精細デジタルアーカイブに比べればケタ違いに小さいらしいんだけど。


あと画像ビューアからは少し離れるが、C#を64bitビルドにしてもSystem.Drawing.Bitmapのライブラリは32bitに制限を受けてるっぽい。解像度が23170x23170までは問題ないが、23170x23171になるとコンストラクタで例外が発生する。前者は32bit/pxで1.9999918GiBくらい、後者は2.000004GiBくらいで、ちょうど2GiBの境目にいる。ちなみにFormat24bppRgbをコンストラクタに渡すと、24bit/pxになるため、26754x26754くらいまでは作成できる。微々たる違いだけど。64bitネイティブのコアライブラリってないのかね。せっかく画像データの大半が解像度を32bitで管理してるのに15bitも使えないなんて。
コレについてはもしかしたら32/64bitの話ではなく、C#の設定で逃げれるっぽいけど、長くなったので今日はここまで。

0 件のコメント:

コメントを投稿