2015年5月9日土曜日

メモリを節約しながら画面サイズに合わせたBitmapの表示方法

CanvasにBitmap(画像ファイル)を表示させるときに、縮小もしくは拡大して表示したいということがある。 このときよく使われる方法はBitmap.createBitmapを呼び出してサイズを変更したBitmapを新しく作る方法であるが、 createという言葉の通り新しくBitmapオブジェクトが生成されることになるためメモリを食ってしまう。

 もっと良い方法が無いか試してみたところ、drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)を 使えばメモリを消費せずに描画できることがわかった。 
第二引数のRectはnullで良いらしいので、第三引数のRectに表示したい画像の座標を入れてやればOKで無事に メモリを節約した状態で拡大縮小表示ができた。

2015年5月7日木曜日

Gralleryから選択した画像のMD5値を取得する

GralleryにIntentを投げて選択した画像が過去に選択したものかを判断するためにMD5値を計算してそれを比べることにした。

まず、GralleryにIntentを投げる。
 @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, 100);
    }

onActivityResultにて帰ってきたIntentからMD5値を計算する。
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 100 && resultCode == RESULT_OK) {
            try {
                ContentResolver contentResolver = getContentResolver();

                // Intentより画像ファイルのパスを取得する
                String[] columns = { ImageColumns.DATA };
                Cursor cursor = contentResolver.query(data.getData(), columns, null, null, null);
                if(cursor==null) return;
                cursor.moveToFirst();
                String path = cursor.getString(cursor.getColumnIndex(ImageColumns.DATA));
                
                // ファイルを読んでMD5値を計算する
                FileInputStream fis = new FileInputStream(path);

                MessageDigest md = MessageDigest.getInstance("MD5");
                DigestInputStream dis = new DigestInputStream(fis, md);

                byte [] buffer = new byte[1024];
                while(dis.read(buffer) == 1024) { }

                byte[] digest = md.digest();
                StringBuilder md5 = new StringBuilder();
                for (int i = 0;i < digest.length;i++) {
                    md5.append(Integer.toHexString(digest[i] >> 4 & 0xf));
                    md5.append(Integer.toHexString(digest[i]& 0xf));
                }
                Log.v(TAG, md5.toString());

                fis.close();
                cursor.close();
            } catch (Exception e) {

            }
        }
    }