なかなかこれっていうAndroid用の画像ビューワーが無いので自作。 WindowsMobile用のArcbirdを移植。 って言っても言語が違うから大雑把な構造を参考にするくらいだけど。 しかしネーミングはWMからそのままだが、紛らわしいなw
とりあえず実装した機能は ・ZIPファイル読み込み ・画面サイズにフィット表示 ・オーバースキャン設定 ・先読みキャッシュ ・しおり ・見開き(右開きのみ) ・起動時動作選択 といったところ。 機能の設定画面と、ファイルリスト/しおりリスト画面も製作。
初期段階では見開きはもっと後でやるかもしれない、くらいだったんだが 7インチ画面は予想以上に効果があって見開きでもギリギリいける。 (よく考えればT-01Aの4インチ縦と同じだけの高さが確保できる) ただ問題になったのが縮小時のモアレ。 縮小アルゴリズムの問題だろうと、他のアルゴリズム探したけど見つからない。 どうやらAndroidには縮小アルゴリズム指定がないっぽい。 (WindowsMobileですらあったのに)
仕方が無いので幾つかアルゴリズムを実装してみた。 最近傍画素法は意味がないので外すとして以下辺りを順に。 ・Bilinear ・Bicubic ・Lanczos ・平均画素法 BilinearとBicubicは基本なのでまずこれから。 次にBicubicの拡張的なアルゴリズムでいけてほぼ理想といわれるLanczos。 最後に縮小なら負荷も考えるとこれがベストといわれる平均画素法へ。
色々ミスがあって上手く動かなかったりもしたもののとりあえず全部OK。 ただJava上の実装なのでかなり重い。 それぞれのアルゴリズムは1出力画素を作るのに参照する画素数が違うわけだが 最近傍画素法が1、Bilinearが4、Bicubicが16、Lanczosが2の時に16となる。 ただLanczosは計算が重いのでBicubicの倍相当くらいか。 平均画素法は縮小比率によって変わってきて、縮小比率の2乗になる。 (2分の1なら2x2で4画素参照)
対モアレという意味だと平均画素法以外は大差ない結果。 他はどれも同程度にモアレが出てきついという感じ。 ただBilinearと同程度と試した中では早い部類ではあるけど、遅い。 Bilinearですら2秒程度かかっているので、Lanczosなんてお話にならない。 (まともに計測はしてない。がLanczosは1枚に20秒程度という遅さw) 先読みを使ってもちょっと常用は厳しいレベル。 そこそこに最適化はかけてあるんでこれ以上となるとNDKを使うしかないかも。 技術的に難しいわけじゃなくて、環境を作るのが面倒って言うのがまた微妙。
|