- 浏览: 41197 次
- 性别:
- 来自: 北京
最新评论
Android Thumbnail Images
在上次关于使用GridView显示Sdcard中的图片Thumbnail图片,然后点击再显示原始图片。在上次的代码中我是通过直接对原始图片进行了Scale制作为100*80的图片,然后显示出来,这样操作的话,当处理大图片的时候会浪费大量的VM内存,所以在上次提出了使用DCIM中thumbnail的缩略图文件的方法,这里图片的尺寸一般都在10-50k的大小。
接着上次关于显示Thumbnails的问题,这里针对如何获取Android thumbnails的图片以及如何和原始图片关联,说先看一下手机内部SDcard中的Thumbnail文件(参照附件1),使用Linux下的 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(可参看附件2)。
因为存储于Sdcard属于外部存储,主要信息存储于external*.db,我们查看一下此数据库的表信息。其中主要关注images 和 thumbnails 两个表。
查看两个表的数据我们可以看出Thumbnails图片和原始图片之间的映射关系。
从上面两个表中可以看出,表thumbnails和Image 之间的关联是通过image_id实现的,通过会这个_id,就可以找出来thumbnails表中的图片和images表中图片的映射关系了。可以就可以获取到原始图片的位置,字段为images表中的_data字段的值。
参考代码可以查看过程
- package com.daisy.android.components;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.Context;
- import android.content.Intent;
- import android.database.Cursor;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.net.Uri;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.GridView;
- import android.widget.ImageView;
- import android.widget.ListAdapter;
- import android.widget.SimpleAdapter;
- import android.widget.Toast;
- import android.widget.AdapterView.OnItemClickListener;
- import android.provider.MediaStore.Images.Thumbnails;
- import android.provider.MediaStore.Images.Media;
- /**
- *@author Andrew.Lee
- *@create 2011-6-9 下午01:17:03
- *@version 1.0
- *@see
- */
- public class ThumbnailActivity extends Activity {
- public static String TAG = "Thumbnails";
- private GridView gridView;
- private ArrayList<HashMap<String, String>> list;
- private ContentResolver cr;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- findViews();
- }
- private void findViews() {
- gridView = (GridView) findViewById(R.id.gridview);
- list = new ArrayList<HashMap<String, String>>();
- cr = getContentResolver();
- String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
- Thumbnails.DATA };
- Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
- null, null, null);
- getColumnData(cursor);
- String[] from = { "path" };
- int[] to = { R.id.imageView };
- ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,
- to);
- gridView.setAdapter(adapter);
- gridView.setOnItemClickListener(listener);
- }
- private void getColumnData(Cursor cur) {
- if (cur.moveToFirst()) {
- int _id;
- int image_id;
- String image_path;
- int _idColumn = cur.getColumnIndex(Thumbnails._ID);
- int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);
- int dataColumn = cur.getColumnIndex(Thumbnails.DATA);
- do {
- // Get the field values
- _id = cur.getInt(_idColumn);
- image_id = cur.getInt(image_idColumn);
- image_path = cur.getString(dataColumn);
- // Do something with the values.
- Log.i(TAG, _id + " image_id:" + image_id + " path:"
- + image_path + "---");
- HashMap hash = new HashMap();
- hash.put("image_id", image_id + "");
- hash.put("path", image_path);
- list.add(hash);
- } while (cur.moveToNext());
- }
- }
- OnItemClickListener listener = new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- // TODO Auto-generated method stub
- String image_id = list.get(position).get("image_id");
- Log.i(TAG, "---(^o^)----" + image_id);
- String[] projection = { Media._ID, Media.DATA };
- Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,
- Media._ID + "=" + image_id, null, null);
- if (cursor != null) {
- cursor.moveToFirst();
- String path = cursor.getString(cursor
- .getColumnIndex(Media.DATA));
- Intent intent = new Intent(ThumbnailActivity.this,
- ImageViewer.class);
- intent.putExtra("path", path);
- startActivity(intent);
- } else {
- Toast.makeText(ThumbnailActivity.this, "Image doesn't exist!",
- Toast.LENGTH_SHORT).show();
- }
- }
- };
- class GridAdapter extends SimpleAdapter {
- public GridAdapter(Context context,
- List<? extends Map<String, ?>> data, int resource,
- String[] from, int[] to) {
- super(context, data, resource, from, to);
- // TODO Auto-generated constructor stub
- }
- // set the imageView using the path of image
- public void setViewImage(ImageView v, String value) {
- try {
- Bitmap bitmap = BitmapFactory.decodeFile(value);
- Bitmap newBit = Bitmap
- .createScaledBitmap(bitmap, 100, 80, true);
- v.setImageBitmap(newBit);
- } catch (NumberFormatException nfe) {
- v.setImageURI(Uri.parse(value));
- }
- }
- }
- }
发表评论
-
Android的onSaveInstanceState和onRestoreInstanceState用法
2012-03-17 16:40 1036很多不明白Activity类中包含的onSaveInstanc ... -
Android的PreferenceActivity
2012-03-16 15:40 725在开发应用程序的过程中我们有很大的机会需要用到参数设置功能,那 ... -
Android原理揭秘系列之VacantCell缓存
2012-03-15 11:01 760操作过Android手机的朋友应该对在待机界面拖动图标的交互效 ... -
android view的一些常用触发方法
2012-02-28 21:23 1127onFinishInflate() 当View中所有的子控件 ... -
在android模拟器中删除系统应用程序
2012-02-27 21:38 2250首先启动android模拟器。 打开cmd命令行窗口。 ... -
使用Android的 hidden API
2012-02-26 17:17 2221Hidden API之所以被隐藏,是想阻止开发者使用SDK中那 ... -
[转]详解Android中的Parcelable
2012-02-26 17:04 2685一: 转自: http://blog.sina.com. ... -
使用LinkedHashMap构建LRU的Cache
2012-02-24 14:44 1414顾名思义LinkedHashMap ... -
四大主流移动开发框架介绍
2011-04-08 09:27 671移动Web开发语言被称为 ... -
Android应用程序打包签名
2011-04-02 22:43 1322转自: http://www.cppblog.com/fwxj ... -
学习Android的几大主攻方向
2011-04-02 16:50 824“苹果(Apple)公司的应用程序商店(app store)和 ... -
Android开发环境搭建
2011-03-31 21:22 890一、软件、开发包清单 Android开发首先需要搭建完 ...
相关推荐
读取文件夹下图片生成略缩图并点击显示大图
前端项目-lg-thumbnail,LightGallery的缩略图模块。
帮你快速的建立HTML网页相簿或图库,提供了基本的设置和HTML的模板,但你也可以自己修改版面,建立自己的模板,完成后就可以导出HTML文件,支持各种图像格式(jpg,gif,tiff,bmp,png等)。
方便查看thumbs.db. ehthumbs.db, thumbcache_*.db files等缩略图文件的源代码
今天我们要给大家介绍一款相对比较实用的jQuery焦点图插件,这款焦点图插件的特点有2个,一个是每一张图片都有一个同比例尺寸的缩略图,所有缩略图都排列在下方,点击缩略图即可切换到对应的图片;另外一个特点是...
jQuery thumbnail 惟美的图片Tip提示效果,鼠标放到每一个格子上面,立即变换成文字,提示图片的内容,一时半会还不知如何形容这种效果,自己下载看吧。
DDS_viewer(DDS文件在windows下显示缩略图的补丁
系统构架是对已确定的需求的技术实现构架、作好规划,运用成套、完整的工具,在规划的步骤下去完成任务。抽象来说,它是计算机系统结构,或称计算机体系结构,是一个系统在其所处环境中最高层次的概念;它确定一台...
react-native-create-thumbnail是 (iOS)和 (Android)的包装 入门 从npm安装库 npm i react-native-create-thumbnail 或者 yarn add react-native-create-thumbnail 链接本机代码 带有自动链接(React本机0.60...
thumbnail.db-shm
thumbnail.db-wal
Laravel开发-thumbnail 视频缩略图
Windows 下获取屏幕和窗口的缩略图,并使用 DuiLib 显示出来
wordpress模板,wordpress教程。基本都是最新版,购买后可联系我www.52bangqi.com绑定资源后续有新版本更新都是免费。
提供对使用Cordova在Android上呈现视频缩略图的支持。 动机 在网上搜索了一个视频缩略图插件后,我似乎找不到一个“开箱即用”的插件。 我决定自己创建一个可以生成base64编码字符串的字符串。 使用图像元素的src...
以缩略图的形式在Windows资源浏览器中显示自定义格式图片
1.添加功能 ...add_theme_support('post-thumbnails'); 插入之后会在后台编辑...php the_post_thumbnail(); ?> 既可以调用,例如插入入在首页的大循环中。 3.后续改进 (1)如果没有缩略图时调用其他图片 复制代码代