我是
靠谱客的博主
冷傲乌冬面,最近开发中收集的这篇文章主要介绍
Android 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字段的值。
以下为参考代码
001 | package com.daisy.android.components; |
003 | import java.util.ArrayList; |
004 | import java.util.HashMap; |
005 | import java.util.List; |
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; |
031 | *@create 2011-6-9 下午01:17:03 |
036 | public 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; |
043 | protected void onCreate(Bundle savedInstanceState) { |
045 | super .onCreate(savedInstanceState); |
046 | setContentView(R.layout.main); |
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, |
056 | Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection, |
058 | getColumnData(cursor); |
060 | String[] from = { "path" }; |
061 | int [] to = { R.id.imageView }; |
062 | ListAdapter adapter = new GridAdapter( this , list, R.layout.item, from, |
064 | gridView.setAdapter(adapter); |
065 | gridView.setOnItemClickListener(listener); |
069 | private void getColumnData(Cursor cur) { |
070 | if (cur.moveToFirst()) { |
074 | int _idColumn = cur.getColumnIndex(Thumbnails._ID); |
075 | int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID); |
076 | int dataColumn = cur.getColumnIndex(Thumbnails.DATA); |
080 | _id = cur.getInt(_idColumn); |
081 | image_id = cur.getInt(image_idColumn); |
082 | image_path = cur.getString(dataColumn); |
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); |
092 | } while (cur.moveToNext()); |
097 | OnItemClickListener listener = new OnItemClickListener() { |
100 | public void onItemClick(AdapterView<?> parent, View view, int position, |
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 , |
114 | intent.putExtra( "path" , path); |
115 | startActivity(intent); |
117 | Toast.makeText(ThumbnailActivity. this , "Image doesn't exist!" , |
118 | Toast.LENGTH_SHORT).show(); |
124 | class GridAdapter extends SimpleAdapter { |
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); |
134 | public void setViewImage(ImageView v, String value) { |
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)); |
转载于:原文链接
标签:
Android
补充话题说明»
发表评论 取消回复