Android thumbnail 图片的获得及与原始图片的映射

http://duguyidao.iteye.com/blog/1074012

 

Android Thumbnail Images


在上次关于使用GridView显示Sdcard中的图片Thumbnail图片,然后点击再显示原始图片。在上次的代码中我是通过直接对原始图片进行了Scale制作为100*80的图片,然后显示出来,这样操作的话,当处理大图片的时候会浪费大量的VM内存,所以在上次提出了使用DCIM中thumbnail的缩略图文件的方法,这里图片的尺寸一般都在10-50k的大小。
接着上次关于显示Thumbnails的问题,这里针对如何获取Android thumbnails的图片以及如何和原始图片关联,说先看一下手机内部SDcard中的Thumbnail文件(参照附件1),使用Linux下的 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(可参看附件2)。Android thumbnail 图片的获得及与原始图片的映射_第2张图片
因为存储于Sdcard属于外部存储,主要信息存储于external*.db,我们查看一下此数据库的表信息。其中主要关注images 和 thumbnails 两个表。
Android thumbnail 图片的获得及与原始图片的映射_第3张图片查看两个表的数据我们可以看出Thumbnails图片和原始图片之间的映射关系。Android thumbnail 图片的获得及与原始图片的映射_第4张图片
从上面两个表中可以看出,表thumbnails和Image 之间的关联是通过image_id实现的,通过会这个_id,就可以找出来thumbnails表中的图片和images表中图片的映射关系了。可以就可以获取到原始图片的位置,字段为images表中的_data字段的值。
参考代码可以查看过程

Java代码 复制代码  收藏代码
  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.                 nullnullnull);   
  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, nullnull);   
  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, 10080true);   
  139.                 v.setImageBitmap(newBit);   
  140.             } catch (NumberFormatException nfe) {   
  141.                 v.setImageURI(Uri.parse(value));   
  142.             }   
  143.         }   
  144.     }   
  145.   
  146. }  

你可能感兴趣的:(数据库,android,image,String,null,Path)