Thumbnail 缩略图的获取及与原始图片的映射关系

这里针对如何获取Android thumbnails的缩略图以及如何和原始图片关联。

先看一下手机内部SDcard中的Thumbnail文件,使用adb shell 下的 ls -a 命令显示隐藏文件。

提取图片和视频的缩略图可以直接访问: 
android.provider.MediaStore.Images.Thumbnails android.provider.MediaStore.Video.Thumbnails
这两个数据库,即可查询出来缩略图

如何关联文件呢? 
可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,把一个Uri我们可以转成String,这里保存着 Android手机SD卡上的多媒体文件完整路径,有关具体的缩略图可以通过
getThumbnail(ContentResolver cr, long origId, int kind, BitmapFactory.Options options) 

getThumbnail(ContentResolver cr, long origId, long groupId, int kind, BitmapFactory.Options options) 
方法获取。这两种方法返回Bitmap类型,而缩略图的高宽可以从HEIGHT和WIDTH两个字段提取。
在Android上缩略图分为两种,通过读取 KIND字段来获得,分别为MICRO_KIND和MINI_KIND ,分别为微型和迷你两种缩略模式,前者的分辨率更低。这样我们平时获取文件系统的某个图片预览时,可以直接调用系统缩略图,而不用自己重新计算。 
在这里我们先看一下android系统是如何存放Thumbnail图片以及其原始图片的。

大家可以先检查一下/data/data/com.android.provider.media目录下面的databases:external-1014121a.db 和 internal.db,如图:

由于存储于Sdcard属于外部存储,主要信息存储于external*.db,我们查看一下此数据库的表信息。其中主要关注images 和 thumbnails 两个表。 



查看两个表的数据我们可以看出Thumbnails图片和原始图片之间的映射关系。



从上面两个表中可以看出,表thumbnails和images通过thumbnails.image_id与images._id关联的,通过images的_id,就可以找出来thumbnails表中的图片和images表中图片的映射关系了。原始图片的位置就是images表中的_data字段的值。

以下为参考代码

  1 package com.daisy.android.components;
  2  
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7  
  8 import android.app.Activity;
  9 import android.content.ContentResolver;
 10 import android.content.Context;
 11 import android.content.Intent;
 12 import android.database.Cursor;
 13 import android.graphics.Bitmap;
 14 import android.graphics.BitmapFactory;
 15 import android.net.Uri;
 16 import android.os.Bundle;
 17 import android.util.Log;
 18 import android.view.View;
 19 import android.widget.AdapterView;
 20 import android.widget.GridView;
 21 import android.widget.ImageView;
 22 import android.widget.ListAdapter;
 23 import android.widget.SimpleAdapter;
 24 import android.widget.Toast;
 25 import android.widget.AdapterView.OnItemClickListener;
 26 import android.provider.MediaStore.Images.Thumbnails;
 27 import android.provider.MediaStore.Images.Media;
 28  
 29 /**
 30  *@author  Andrew.Lee
 31  *@create  2011-6-9 下午01:17:03
 32  *@version 1.0
 33  *@see 
 34  */
 35  
 36 public class ThumbnailActivity extends Activity {
 37     public static String TAG = "Thumbnails";
 38     private GridView gridView;
 39     private ArrayList<HashMap<String, String>> list;
 40     private ContentResolver cr;
 41  
 42     @Override
 43     protected void onCreate(Bundle savedInstanceState) {
 44         // TODO Auto-generated method stub
 45         super.onCreate(savedInstanceState);
 46         setContentView(R.layout.main);
 47         findViews();
 48     }
 49  
 50     private void findViews() {
 51         gridView = (GridView) findViewById(R.id.gridview);
 52         list = new ArrayList<HashMap<String, String>>();
 53         cr = getContentResolver();
 54         String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
 55                 Thumbnails.DATA };
 56         Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
 57                 null, null, null);
 58         getColumnData(cursor);
 59  
 60         String[] from = { "path" };
 61         int[] to = { R.id.imageView };
 62         ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,
 63                 to);
 64         gridView.setAdapter(adapter);
 65         gridView.setOnItemClickListener(listener);
 66  
 67     }
 68  
 69     private void getColumnData(Cursor cur) {
 70         if (cur.moveToFirst()) {
 71             int _id;
 72             int image_id;
 73             String image_path;
 74             int _idColumn = cur.getColumnIndex(Thumbnails._ID);
 75             int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);
 76             int dataColumn = cur.getColumnIndex(Thumbnails.DATA);
 77  
 78             do {
 79                 // Get the field values
 80                 _id = cur.getInt(_idColumn);
 81                 image_id = cur.getInt(image_idColumn);
 82                 image_path = cur.getString(dataColumn);
 83  
 84                 // Do something with the values.
 85                 Log.i(TAG, _id + " image_id:" + image_id + " path:"
 86                         + image_path + "---");
 87                 HashMap hash = new HashMap();
 88                 hash.put("image_id", image_id + "");
 89                 hash.put("path", image_path);
 90                 list.add(hash);
 91  
 92             } while (cur.moveToNext());
 93  
 94         }
 95     }
 96  
 97     OnItemClickListener listener = new OnItemClickListener() {
 98  
 99         @Override
100         public void onItemClick(AdapterView<?> parent, View view, int position,
101                 long id) {
102             // TODO Auto-generated method stub
103             String image_id = list.get(position).get("image_id");
104             Log.i(TAG, "---(^o^)----" + image_id);
105             String[] projection = { Media._ID, Media.DATA };
106             Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,
107                     Media._ID + "=" + image_id, null, null);
108             if (cursor != null) {
109                 cursor.moveToFirst();
110                 String path = cursor.getString(cursor
111                         .getColumnIndex(Media.DATA));
112                 Intent intent = new Intent(ThumbnailActivity.this,
113                         ImageViewer.class);
114                 intent.putExtra("path", path);
115                 startActivity(intent);
116             } else {
117                 Toast.makeText(ThumbnailActivity.this, "Image doesn't exist!",
118                         Toast.LENGTH_SHORT).show();
119             }
120  
121         }
122     };
123  
124     class GridAdapter extends SimpleAdapter {
125  
126         public GridAdapter(Context context,
127                 List<? extends Map<String, ?>> data, int resource,
128                 String[] from, int[] to) {
129             super(context, data, resource, from, to);
130             // TODO Auto-generated constructor stub
131         }
132  
133         // set the imageView using the path of image
134         public void setViewImage(ImageView v, String value) {
135             try {
136                 Bitmap bitmap = BitmapFactory.decodeFile(value);
137                 Bitmap newBit = Bitmap
138                         .createScaledBitmap(bitmap, 100, 80, true);
139                 v.setImageBitmap(newBit);
140             } catch (NumberFormatException nfe) {
141                 v.setImageURI(Uri.parse(value));
142             }
143         }
144     }
145  
146 }

 

posted @ 2015-09-18 00:54  -小城-  阅读(2613)  评论(0编辑  收藏  举报