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

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

这里针对如何获取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字段的值。

以下为参考代码

001package com.daisy.android.components;
002 
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.List;
006import java.util.Map;
007 
008import android.app.Activity;
009import android.content.ContentResolver;
010import android.content.Context;
011import android.content.Intent;
012import android.database.Cursor;
013import android.graphics.Bitmap;
014import android.graphics.BitmapFactory;
015import android.net.Uri;
016import android.os.Bundle;
017import android.util.Log;
018import android.view.View;
019import android.widget.AdapterView;
020import android.widget.GridView;
021import android.widget.ImageView;
022import android.widget.ListAdapter;
023import android.widget.SimpleAdapter;
024import android.widget.Toast;
025import android.widget.AdapterView.OnItemClickListener;
026import android.provider.MediaStore.Images.Thumbnails;
027import 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 
036public class ThumbnailActivity extends Activity {
037    public static String TAG = "Thumbnails";
038    private GridView gridView;
039    private ArrayList<HashMap<String, String>> 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<HashMap<String, String>>();
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                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}

转载于:原文链接

标签: Android
补充话题说明»


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值