ベテラン・プログラマの密かなつぶやき

日々の仕事で得たプログラミングの知識を咀嚼してまとめています

Android 画像のファイル保存

AndroidStudioでAndroidアプリのお仕事をさせてもらっている。やはり受注の仕事は自分で頭をひねる必要がない分楽。アイデアをひねり出すという作業はそう簡単に習慣化できるものではない。どうしても安易な方向に動いてしまう。

 

ということで、今やっている仕事はそれなりに楽しい。

コーディングでわからないことがあればWeb検索すれば大抵記事が載っていてサンプルコードをコピペすればそれなりに動いてくれる。

それでもいくら調べてもなかなかいい情報が得られず苦悶することもある。

 

画像のファイル保存もそうだった。ピクセルがbyte配列に入っていてそれを画像ファイルとして保存したかったのだが、byte配列をビットマップに変換する、で検索すると

 

Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
 

というコードが出てくるのだが、確かに間違いではない。ただ条件があってその記述がどこにも書かれていない。自分が到達した結論は、ここで使われているbyteArrayにはビットマップヘッダ情報が含まれていなければいけない、ということ。

しかし、やりたいのはbyteArrayにはピクセル情報だけ入っている場合の変換。

結局、ビットマップオブジェクトを作成してピクセル単位にbyte配列の情報を代入してやるしかない、ということが分かった。

 

Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for (int i = 0; i < byteArray.length; i++) {
    int gray_data = byteArray[i] & 0xFF;
    int gray_argb = Color.argb(255, gray_data, gray_data, gray_data);
    bmp.setPixel(i%width, i/width, gray_argb);
}

 

ちょっと苦労したけど、わかってみれば確かにそう考えるのが当たり前。安易に一括で処理してくれる関数はないかと考えたのが甘かった。

 

しかし、時々こういう不親切な情報が中途半端にしか出ていない記事も多く、悩ましい。

 

そういう隙間を埋める記事をここに書くことができれば、このブログの意味もあるのかもしれない。