MN #18 - Saving RAW10
04:56. 旅行から戻ってきた。宿の空調をしくじって風邪を引いてしまったため朝寝して回復しよう・・・と思ったものの普通に目が覚めた。
今日は RAW10 をファイルに保存。なのだけど、加工する前には 16bit にしたい。RAW10 で保存しつつ オフラインで 16 bit に re-pack してもいいけれど、そのコードを何で書くかという問題がある。Python は色々厳しい。Unsigned type が欲しいから Java はイヤだけど、かといってこのためだけに Golang やら C++ とかもなー。などと考えていたがふと Kotlin 1.3 には実験的に unsigned type が入っていたのを思い出す。on-device で 16 ビットにしてしまうのがラクかもしらん。Experimental feature に乗っかるのはやや怖いが、coroutine とかと比べるとそんなに moving parts もないだろうし大丈夫でしょう。
ファイルフォーマット。生の配列をバリっと保存してもよいけれど、できれば何らかのコンテナに入れてあげたい。PNG? あるいは TIFF とかなのだろうか。あと Android native のエンコーダは Bitmap クラスを使うが、これは packed RGB なんでだめ。Third party かつ pure java なエンコーダが必要。
探してみると・・・ないね。PNGJ というやつが近いけれど、Google Code shutdown あたりで朽ち果ててしまった模様。おそらく libpng を NDK で使うのが正解なのだろうけれど、いま NDK には寄り道したくないのでバイト列をガっと書き出すことにしましょう。
とりあえず何かは書けた・・・が、中身を見てみるのはまた明日。
Kotlin unsigned arithmetic types について:
- Bit shift が unsigned short や unsigned byte に定義されていない!が、under consideration らしい。これが experimental というやつか・・・
- そんじゃUInt つかっとくか、とうっかり byte の値を toUInt() とでもしようものながら negative number が UInt として round してしまうので、toUByte().toUInt() と書きましょう。
- OutputStream に write(UByte) とかないので若干残念。nio の ByteBuffer も signed だし、このへん暇な若者とかの力で全部 unsigned ready になってくれないとバイトいじり言語としては今ひとつなかんじ。Java の世界でやむをえず unsigned したい今回のようなケースにはまあなあ便利だけれど。