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

http://www.oschina.net/question/157182_54038

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

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

Android thumbnail 缩略图的获取及与原始图片的映射关系_第1张图片

提取图片和视频的缩略图可以直接访问:
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,如图:

Android thumbnail 缩略图的获取及与原始图片的映射关系_第2张图片

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

Android thumbnail 缩略图的获取及与原始图片的映射关系_第3张图片

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

Android thumbnail 缩略图的获取及与原始图片的映射关系_第4张图片

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

以下为参考代码

001 package com.daisy.android.components;
002  
003 import java.util.ArrayList;
004 import java.util.HashMap;
005 import java.util.List;
006 import java.util.Map;
007  
008 import android.app.Activity;
009 import android.content.ContentResolver;
010 import android.content.Context;
011 import android.content.Intent;
012 import android.database.Cursor;
013 import android.graphics.Bitmap;
014 import android.graphics.BitmapFactory;
015 import android.net.Uri;
016 import android.os.Bundle;
017 import android.util.Log;
018 import android.view.View;
019 import android.widget.AdapterView;
020 import android.widget.GridView;
021 import android.widget.ImageView;
022 import android.widget.ListAdapter;
023 import android.widget.SimpleAdapter;
024 import android.widget.Toast;
025 import android.widget.AdapterView.OnItemClickListener;
026 import android.provider.MediaStore.Images.Thumbnails;
027 import android.provider.MediaStore.Images.Media;
028  
029 /**
030  *@author  Andrew.Lee
031  *@create  2011-6-9 下午01:17:03
032  *@version 1.0
033  *@see
034  */
035  
036 public class ThumbnailActivity extends Activity {
037     public static String TAG = "Thumbnails";
038     private GridView gridView;
039     private ArrayList> list;
040     private ContentResolver cr;
041  
042     @Override
043     protected void onCreate(Bundle savedInstanceState) {
044         // TODO Auto-generated method stub
045         super.onCreate(savedInstanceState);
046         setContentView(R.layout.main);
047         findViews();
048     }
049  
050     private void findViews() {
051         gridView = (GridView) findViewById(R.id.gridview);
052         list = new ArrayList>();
053         cr = getContentResolver();
054         String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
055                 Thumbnails.DATA };
056         Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
057                 null, null, null);
058         getColumnData(cursor);
059  
060         String[] from = { "path" };
061         int[] to = { R.id.imageView };
062         ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,
063                 to);
064         gridView.setAdapter(adapter);
065         gridView.setOnItemClickListener(listener);
066  
067     }
068  
069     private void getColumnData(Cursor cur) {
070         if (cur.moveToFirst()) {
071             int _id;
072             int image_id;
073             String image_path;
074             int _idColumn = cur.getColumnIndex(Thumbnails._ID);
075             int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);
076             int dataColumn = cur.getColumnIndex(Thumbnails.DATA);
077  
078             do {
079                 // Get the field values
080                 _id = cur.getInt(_idColumn);
081                 image_id = cur.getInt(image_idColumn);
082                 image_path = cur.getString(dataColumn);
083  
084                 // Do something with the values.
085                 Log.i(TAG, _id + " image_id:" + image_id + " path:"
086                         + image_path + "---");
087                 HashMap hash = new HashMap();
088                 hash.put("image_id", image_id + "");
089                 hash.put("path", image_path);
090                 list.add(hash);
091  
092             } while (cur.moveToNext());
093  
094         }
095     }
096  
097     OnItemClickListener listener = new OnItemClickListener() {
098  
099         @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                 Listextends Map> 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 }

转载于:原文链接

标签: Android
补充话题说明»


你可能感兴趣的:(Android)