转载自

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.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,我们查看一下此数据库的表信息。其中主要关注p_w_picpaths 和 thumbnails 两个表。
查看两个表的数据我们可以看出Thumbnails图片和原始图片之间的映射关系。
从上面两个表中可以看出,表thumbnails和Image 之间的关联是通过p_w_picpath_id实现的,通过会这个_id,就可以找出来thumbnails表中的图片和p_w_picpaths表中图片的映射关系了。可以就可以获取到原始图片的位置,字段为p_w_picpaths表中的_data字段的值。
参考代码可以查看过程

Java代码  
  1. package com.daisy.android.components;

  2. import java.util.ArrayList;

  3. import java.util.HashMap;

  4. import java.util.List;

  5. import java.util.Map;

  6. import android.app.Activity;

  7. import android.content.ContentResolver;

  8. import android.content.Context;

  9. import android.content.Intent;

  10. import android.database.Cursor;

  11. import android.graphics.Bitmap;

  12. import android.graphics.BitmapFactory;

  13. import android.net.Uri;

  14. import android.os.Bundle;

  15. import android.util.Log;

  16. import android.view.View;

  17. import android.widget.AdapterView;

  18. import android.widget.GridView;

  19. import android.widget.ImageView;

  20. import android.widget.ListAdapter;

  21. import android.widget.SimpleAdapter;

  22. import android.widget.Toast;

  23. import android.widget.AdapterView.OnItemClickListener;

  24. import android.provider.MediaStore.Images.Thumbnails;

  25. import android.provider.MediaStore.Images.Media;

  26. /**

  27. *@author Andrew.Lee

  28. *@create 2011-6-9 下午01:17:03

  29. *@version 1.0

  30. *@see

  31. */

  32. publicclass ThumbnailActivity extends Activity {

  33. publicstatic String TAG = "Thumbnails";

  34. private GridView gridView;

  35. private ArrayList<HashMap<String, String>> list;

  36. private ContentResolver cr;

  37. @Override

  38. protectedvoid onCreate(Bundle savedInstanceState) {

  39. // TODO Auto-generated method stub

  40. super.onCreate(savedInstanceState);

  41. setContentView(R.layout.main);

  42. findViews();

  43. }

  44. privatevoid findViews() {

  45. gridView = (GridView) findViewById(R.id.gridview);

  46. list = new ArrayList<HashMap<String, String>>();

  47. cr = getContentResolver();

  48. String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,

  49. Thumbnails.DATA };

  50. Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,

  51. null, null, null);

  52. getColumnData(cursor);

  53. String[] from = { "path" };

  54. int[] to = { R.id.p_w_picpathView };

  55. ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,

  56. to);

  57. gridView.setAdapter(adapter);

  58. gridView.setOnItemClickListener(listener);

  59. }

  60. privatevoid getColumnData(Cursor cur) {

  61. if (cur.moveToFirst()) {

  62. int _id;

  63. int p_w_picpath_id;

  64. String p_w_picpath_path;

  65. int _idColumn = cur.getColumnIndex(Thumbnails._ID);

  66. int p_w_picpath_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);

  67. int dataColumn = cur.getColumnIndex(Thumbnails.DATA);

  68. do {

  69. // Get the field values

  70. _id = cur.getInt(_idColumn);

  71. p_w_picpath_id = cur.getInt(p_w_picpath_idColumn);

  72. p_w_picpath_path = cur.getString(dataColumn);

  73. // Do something with the values.

  74. Log.i(TAG, _id + " p_w_picpath_id:" + p_w_picpath_id + " path:"

  75. + p_w_picpath_path + "---");

  76. HashMap hash = new HashMap();

  77. hash.put("p_w_picpath_id", p_w_picpath_id + "");

  78. hash.put("path", p_w_picpath_path);

  79. list.add(hash);

  80. } while (cur.moveToNext());

  81. }

  82. }

  83. OnItemClickListener listener = new OnItemClickListener() {

  84. @Override

  85. publicvoid onItemClick(AdapterView<?> parent, View view, int position,

  86. long id) {

  87. // TODO Auto-generated method stub

  88. String p_w_picpath_id = list.get(position).get("p_w_picpath_id");

  89. Log.i(TAG, "---(^o^)----" + p_w_picpath_id);

  90. String[] projection = { Media._ID, Media.DATA };

  91. Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,

  92. Media._ID + "=" + p_w_picpath_id, null, null);

  93. if (cursor != null) {

  94. cursor.moveToFirst();

  95. String path = cursor.getString(cursor

  96. .getColumnIndex(Media.DATA));

  97. Intent intent = new Intent(ThumbnailActivity.this,

  98. ImageViewer.class);

  99. intent.putExtra("path", path);

  100. startActivity(intent);

  101. } else {

  102. Toast.makeText(ThumbnailActivity.this, "Image doesn't exist!",

  103. Toast.LENGTH_SHORT).show();

  104. }

  105. }

  106. };

  107. class GridAdapter extends SimpleAdapter {

  108. public GridAdapter(Context context,

  109. List<? extends Map<String, ?>> data, int resource,

  110. String[] from, int[] to) {

  111. super(context, data, resource, from, to);

  112. // TODO Auto-generated constructor stub

  113. }

  114. // set the p_w_picpathView using the path of p_w_picpath

  115. publicvoid setViewImage(ImageView v, String value) {

  116. try {

  117. Bitmap bitmap = BitmapFactory.decodeFile(value);

  118. Bitmap newBit = Bitmap

  119. .createScaledBitmap(bitmap, 100, 80, true);

  120. v.setImageBitmap(newBit);

  121. } catch (NumberFormatException nfe) {

  122. v.setImageURI(Uri.parse(value));

  123. }

  124. }

  125. }

  126. }

转载于:https://blog.51cto.com/xuewei/1379551

Android thumbnail 图片的获得及与原始图片的映射相关推荐

  1. 提取图片RGB三通道数据+用RGB恢复原始图片

    提取图片的RGB三通道数据+用RGB恢复原始图片 提取图片的RGB三通道数据 用RGB恢复原始图片 功能实现: 提取出一张图片的R.G.B三个通道的值并且将其分别转换为十进制数据存储到R.txt.G. ...

  2. Android开发笔记(九十八)往图片添加部件

    添加圆角 添加圆角的功能,要用到Canvas类的drawRoundRect方法,即把画布裁剪成指定的圆角矩形. 下面是给图片添加圆角的效果截图: 下面是给图片添加圆角的代码片段: public sta ...

  3. Android中使用自定义的view实现圆形图片的效果

    今天给大家讲的是怎么在xml文件找中通过引用自定义的view实现ImageView的圆形图片效果.首先在你的项目中新建一个类,我给它命名为:CircleImageView:然后在res目录下的valu ...

  4. 【经验】为什么Android手机连接USB后查看手机内部图片有些有缩略图,有些显示图标?

    [经验]为什么Android手机连接USB后查看手机内部图片有些有缩略图,有些显示图标? 一.图片内嵌缩略图原理 这是什么原理呢?因为现在JPEG的文件采用了压缩的方式,其过程比较复杂.为了能让大家快 ...

  5. Android apk瘦身之使用TinyPng压缩图片

    1 前言 Android apk太大了怎么办,有的时候需要减小apk的体积,例如上传到服务器的时候有文件大小的限制.百度一下,发现大致有以下几种方法: 使用混淆,减少代码体积 删除不使用的资源 减少使 ...

  6. Android自定义View实现不断旋转的圆形图片

    自定义View是android开发的一个重要技能,用android提供的2/3D绘制相关类可以实现非常多炫酷的效果,需要实打实的编程基础.(吧). 但是自定义View又是我的弱项,所以最近都在摸索.练 ...

  7. ASP.NET将原始图片按照指定尺寸等比例缩放显示图片

    网站上可能会有很多图片,比如产品图片等,而且他们可能大小不一,宽度和高度也不一定一样,有的很大有的很小.如果放在一张网页上,可能会破坏版面,但是如果强制让他们按照指定的宽度和高度显示,因为比例不同还会 ...

  8. Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解...

    2019独角兽企业重金招聘Python工程师标准>>> 今天继续给大家分享下View的相关知识,重点有一下两点:   1.View的几种不同状态属性            2.如何根 ...

  9. [Android] 通过GridView仿微信动态添加本地图片

    原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...

最新文章

  1. html制作水晶状态导航栏,HTML5 CSS3水晶风格的页面头部
  2. mysql sql语句使用技巧
  3. jQuery data
  4. leetcode35 插入的位置
  5. iphone屏幕录制_iphone投屏到电脑详细教程
  6. 一种较方便的MATLAB GUI中popupmenu中选取值得获得方法
  7. 基于UML的人事管理系统
  8. Teclast X80h安装linux,安装android-x86教程。(没法再贴吧发表,只有百度网盘在线阅读...
  9. android HierachyViewer使用
  10. PyQt5+opencv鼠标滚轮设置图片亮度
  11. Ubuntu离线网卡驱动安装
  12. (3)paddle---近视眼睛分类的例子
  13. 蓝桥杯之《人民币金额大写》
  14. Exceeded checkpoint tolerable failure threshould【记一次flink上线异常】
  15. Pyspark回归--IsotonicRegression
  16. PostgreSQL的学习心得和知识总结(八十九)|深入理解PostgreSQL数据库开源MPP扩展Citus再平衡函数rebalance_table_shards的实现原理
  17. 淘宝店铺列表部分示例
  18. 守望先锋,工坊规则封禁源式利用表情卡原地小跳
  19. Vue开发之基础路由
  20. nodemon:运行提示错误:无法加载文件 xxxx

热门文章

  1. 26秒!全球销量第一的AI音箱就被腾讯黑掉了,然后变身窃听器
  2. Mock Serverj
  3. 2018年《环球科学》十大科学新闻:霍金逝世、贺建奎事件位列前二
  4. rabbitmq 更细致的过滤
  5. 这行简单的网址可令Chrome立马崩溃
  6. Linux中进程正常退出return和exit()的区别
  7. ipconfig显示IP地址情况
  8. thinkphp ajax 实例 实现
  9. chrome的cookies
  10. zz在Ubuntu中通过源码安装编译安装软件(MySQL篇)