コンテンツにスキップするには Enter キーを押してください

Androidで画像をはる

前回Androidでカメラとギャラリーから画像を得るの続きです。

今回ちょっとめんどくさかったのはスマホによっては画像が曲がってはられてしまうということです。
Pathを利用して画像の情報を取得して正しい向きで画像を貼ろうと思います。

前回は画像のURIとPathが得らることができました。

画像には様々な情報(EXIF)があります。

その一つに画像の「向き」があります。
これを考慮せずに、Bitmapファイルに突っ込むとそのままの向きで定義初期化されてしまいます。

そこで、
Pathを使って画像の情報を取得

画像をmatrixを使って回転

貼る

という流れです。

// orientationを考慮して、matrixを形成
int orientation = 0;
try{
    ExifInterface ei = new ExifInterface(path);
    orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,1);
}catch (Exception e){
    e.printStackTrace();
}
// デコード時のオプション(変更する人)
BitmapFactory.Options = options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// optionをいじる人はここで(詳しくは、下記にある参考の一番上のサイトで)
options.InJustdecodeBounds = false;
Bitmap bmp_ori = BitmapFactory.decodeFile(path, options);
Matrix matrix = getMatrixFromOrientation(orientation, bmp_ori.getWidth(), bmp_ori.getHeight());
Bitmap bmp_new = Bitmap.createBitmap(bmp_ori, 0, 0, bmp_ori.getWidth(), bmp_ori.getHeight(), martix, true);
ImageView.setImageBitmap(bmp_new);

以下はgetMatrixFromOrientation関数です。

private Matrix getMatrixFromOrientation(int orientation, int wOrg, int hOrg){
    Matrix mat = new Matrix();
    mat.reset();
    switch(orientation)
    {
        case 1://only scaling
            mat.preScale(1, 1);
            break;
        case 2://flip horizontal
            mat.postScale(-1, 1);
            mat.postTranslate(wOrg, 0);
            break;
        case 3://rotate 180
            mat.postRotate(180, wOrg/2f, hOrg/2f);
            mat.postScale(1, 1);
            break;
        case 4://flip vertical
            mat.postScale(1, -1);
            mat.postTranslate(0, hOrg*factor);
            break;
        case 5://flip vertical rotate270
            mat.postRotate(270, 0, 0);
            mat.postScale(1, -1);
            break;
        case 6://rotate 90
            mat.postRotate(90, 0, 0);
            mat.postScale(1, 1);
            mat.postTranslate(hOrg, 0);
            break;
        case 7://flip vertical, rotate 90
            mat.postRotate(90, 0, 0);
            mat.postScale(1, -1);
            mat.postTranslate(hOrg, wOrg);
            break;
        case 8://rotate 270
            mat.postRotate(270, 0, 0);
            mat.postScale(1, 1);
            mat.postTranslate(0, wOrg);
            break;
    }
    return mat;
}

 

コードも特に解説するような場所はないと思います。

 

参考にしたサイト

https://corgi-lab.com/android/show-image/

https://blog.livedoor.jp/esper776/archives/65818185.html

https://developer.android.com/reference/android/media/ExifInterface.html?hl=ja#ORIENTATION_NORMAL

 

 




コメントする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です