ギャラリーから取得した写真を正しい向きで表示

アルバムにある写真に加工するプログラムを作るために、
[ギャラリーから画像を取得する](http://seesaawiki.jp/w/moonlight_aska/d/%A5%AE%A5%E3%A5%E9%A5%EA%A1%BC%A4%AB%A4%E9%B2%E8%C1%FC%A4%F2%BC%E8%C6%C0%A4%B9%A4%EB)
を試したら、簡単に取得できた！
が、なぜか全て横向き表示・・・。
**調べてみると、写真の向きが機種によって違い、向きを指定する必要があるらしい。**

で、
[ギャラリーから呼び出す画像の向きを取得する](http://androidkaihatu.blog.fc2.com/blog-entry-22.html)
を参考に向きを取得。
**ExifInterfaceを使ったサンプルを記載しているサイトはいろいろあったが、画像ファイルの場所がわかっている前提のばかりで、ギャラリーから取得した画像のファイル名を取得しているのはここくらい。**

向きがわかったので、
[Exif情報を利用して、写真の向きを正しく表示する](http://blog.livedoor.jp/esper776/archives/65818185.html)
を参考に、縮尺なども加えてできたのがこれ。

```java
package jp.murapon.sample;

import java.io.InputStream;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout.LayoutParams;

public class MainActivity extends Activity {
    private static final int REQUEST_GALLERY = 0;
    private ImageView imgView;
    private float viewWidth;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgView = (ImageView)findViewById(R.id.imgview_id);
        // ギャラリー呼び出し
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, REQUEST_GALLERY);

        // ウィンドウマネージャのインスタンス取得
        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
        // ディスプレイのインスタンス生成
        Display disp = wm.getDefaultDisplay();
        viewWidth = disp.getWidth();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == REQUEST_GALLERY && resultCode == RESULT_OK) {
            try {
                InputStream in = getContentResolver().openInputStream(data.getData());
                Bitmap bitmap = BitmapFactory.decodeStream(in);
                in.close();

                //dataからfilepathへの変換  
                String[] columns = {MediaStore.Images.Media.DATA };  
                Cursor c = getContentResolver().query(data.getData(), columns, null, null, null);  
                c.moveToFirst();  
                ExifInterface exifInterface = new ExifInterface(c.getString(0));
                // 向きを取得
                int orientation = Integer.parseInt(exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION));

                imgView.setScaleType(ScaleType.MATRIX);
                imgView.setImageBitmap(bitmap);

                // 画像の幅、高さを取得
                int wOrg = bitmap.getWidth();
                int hOrg = bitmap.getHeight();
                imgView.getLayoutParams();
                LayoutParams lp = (LayoutParams) imgView.getLayoutParams();

                float factor;
                Matrix mat = new Matrix();
                mat.reset();
                switch(orientation){
                    case 1://only scaling
                        factor = (float)viewWidth/(float)wOrg;
                        mat.preScale(factor, factor);
                        lp.width = (int)(wOrg*factor);
                        lp.height = (int)(hOrg*factor);
                        break;
                    case 2://flip vertical
                        factor = (float)viewWidth/(float)wOrg;
                        mat.postScale(factor, -factor);
                        mat.postTranslate(0, hOrg*factor);
                        lp.width = (int)(wOrg*factor);
                        lp.height = (int)(hOrg*factor);
                        break;
                    case 3://rotate 180
                        mat.postRotate(180, wOrg/2f, hOrg/2f);
                        factor = (float)viewWidth/(float)wOrg;
                        mat.postScale(factor, factor);
                        lp.width = (int)(wOrg*factor);
                        lp.height = (int)(hOrg*factor);
                        break;
                    case 4://flip horizontal
                        factor = (float)viewWidth/(float)wOrg;
                        mat.postScale(-factor, factor);
                        mat.postTranslate(wOrg*factor, 0);
                        lp.width = (int)(wOrg*factor);
                        lp.height = (int)(hOrg*factor);
                        break;
                    case 5://flip vertical rotate270
                        mat.postRotate(270, 0, 0);
                        factor = (float)viewWidth/(float)hOrg;
                        mat.postScale(factor, -factor);
                        lp.width = (int)(hOrg*factor);
                        lp.height = (int)(wOrg*factor);
                        break;
                    case 6://rotate 90
                        mat.postRotate(90, 0, 0);
                        factor = (float)viewWidth/(float)hOrg;
                        mat.postScale(factor, factor);
                        mat.postTranslate(hOrg*factor, 0);
                        lp.width = (int)(hOrg*factor);
                        lp.height = (int)(wOrg*factor);
                        break;
                    case 7://flip vertical, rotate 90 
                        mat.postRotate(90, 0, 0);
                        factor = (float)viewWidth/(float)hOrg;
                        mat.postScale(factor, -factor);
                        mat.postTranslate(hOrg*factor, wOrg*factor);
                        lp.width = (int)(hOrg*factor);
                        lp.height = (int)(wOrg*factor);
                        break;
                    case 8://rotate 270
                        mat.postRotate(270, 0, 0);
                        factor = (float)viewWidth/(float)hOrg;
                        mat.postScale(factor, factor);
                        mat.postTranslate(0, wOrg*factor);
                        lp.width = (int)(hOrg*factor);
                        lp.height = (int)(wOrg*factor);
                        break;
                }
                imgView.setLayoutParams(lp);
                imgView.setImageMatrix(mat);
                imgView.invalidate();
            } catch (Exception e) {
                Log.e(e.toString(), "Error");
            }
        } 
    }
}
```