« たぶん不幸じゃない | メイン | iPhoneアプリ「PiPict」がfacebook対応しました »

2011年2月16日

andoridでサムネイル画像を正しい向きで表示する

最近androidの開発はじめました。
iOSとは違うところが多くて、あちこちで躓いていますがなんとか元気です。

で、ちょっとSDカードに保存されている画像の一覧をGalleryウィジェットに表示しようと思いまして。
コンテンツプロバイダ経由で、サムネイルを表示しようと思ったわけなんですが、これが、なんか、撮った写真の向きとは違うサムネイルが表示されちゃうわけですよ。
うまい方法ないかなーと探してたんだけど、なかなか見つからず、必死でひねり出してみました。

で、こんな感じのアダプターを作ってみたのです。

    public class ImageAdapter extends BaseAdapter {
        Context context;
        Cursor curusor;
        ContentResolver cr;
        public ImageAdapter(Context c) {
            context = c;
            cr = getContentResolver();                  
            Uri uri = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;  
            curusor = cr.query(uri, null, null, null, null); 
      
            curusor.moveToFirst();  

        }
        public int getCount() {
            return curusor.getCount();
        }
        public Object getItem(int position) {
            return position;
        }
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = (ImageView)convertView;
              if (i == null) {                                        
                 i = new ImageView(context);
                 try {
                     curusor.moveToPosition(position);  

                     long image_id = curusor.getLong(curusor.getColumnIndexOrThrow("image_id"));
                     
                     Bitmap obm = MediaStore.Images.Thumbnails.getThumbnail(
                             cr, 
                             image_id,
                             MediaStore.Images.Thumbnails.MICRO_KIND,
                             null);
                     
                     Uri uri = ContentUris.withAppendedId(
                             MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                             image_id); 
                     Cursor c = cr.query(uri,
                                new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
                                null, null, null);
                     c.moveToFirst();
                     int orientation = c.getInt(0);
                            
                     int width = obm.getWidth();  
                     int height = obm.getHeight();  

                     Matrix matrix = new Matrix();
                     
                     Bitmap bm;
                     if (orientation == 0) {
                         bm = obm;
                     } else {
                         matrix.postRotate(orientation);  
                         bm = Bitmap.createBitmap(obm, 0, 0, width, height, matrix, true);  
                     }
                     
                     i.setImageBitmap(bm);
                     i.setScaleType(ImageView.ScaleType.FIT_XY);
                 } catch (Exception e) { 
                 } 
              }
              return i;
        } 
    } 

サムネイルを取得するときに、元の画像のorientationを取得してそれに合わせてサムネイルを回転させるという寸法。
サムネイル自身に、orientation情報があればよかったのだけど、なんか、見つからなかった。これが取れちゃえば一発なんだけども。
でも、なんかもっとうまい解決方法があるような気もする......。

で、こんな感じに使うとギャラリーにサムネイルが表示されるよーって感じ。

        Gallery g = (Gallery) findViewById(R.id.Gallery01);
        g.setAdapter(new ImageAdapter(this));  

いやいや、違うよ! とか、もっと良い方法あるよ! とか教えてもらえるとうれしいですー。

投稿者 CHEEBOW : 2011年2月16日 16:03 このエントリーを含むはてなブックマーク

[ android ]
【お知らせ】音楽に関することはこちらのブログで書いています。くじら音楽部::BLOG