`
zhiying201039
  • 浏览: 42892 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android Thumbnail 技术介绍

 
阅读更多

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字段的值。 
参考代码可以查看过程
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. }  
转载自:http://duguyidao.iteye.com/blog/1074012
分享到:
评论

相关推荐

    thumbnails-android略缩图源码

    在Android开发中,生成图像的略缩图是一项...这个“thumbnails-android略缩图源码”项目将这些技术结合在一起,为开发者提供了一个参考实现。学习并理解这些概念,对于提升Android应用的性能和用户体验具有重要意义。

    10.0任务列表获取缩略图

    "10.0任务列表获取缩略图"是一个关于如何在Android 10.0版本中实现类似Android 7.0 UI的任务列表缩略图加载的技术点。这个功能涉及到系统的用户界面库、特定的Java类以及相关的资源文件。 首先,`SystemUISharedLib...

    android 浏览器 数据存储

    在Android平台上,数据存储是应用程序持久化数据的关键技术。Android提供了多种存储机制,包括SQLite数据库、SharedPreferences、文件系统以及ContentProvider。本篇文章将主要聚焦于SQLite数据库在Android浏览器中...

    usinglistview show thumbnail

    综上所述,"UsingListView show thumbnail"这个主题涵盖了许多Android开发中的核心技能,包括ListView的基本操作、图像处理、性能优化和自定义Adapter的使用。通过掌握这些知识点,开发者能够构建出流畅、高效的图片...

    android图片选择器,仿微信

    此组件可能采用了延迟加载、thumbnail(缩略图)机制等技术,提高图片加载速度,减少内存占用。 7. **用户体验**:仿微信的设计意味着它可能注重用户体验,比如流畅的动画效果,直观的操作流程,以及清晰的用户反馈...

    android遍历sd卡视频文件

    总的来说,遍历SD卡中的视频文件并显示列表,不仅涉及到文件操作,还涵盖了多媒体信息获取、性能优化和UI设计等多个技术点。在实际开发中,应根据设备性能和用户需求灵活调整策略,提供最佳的用户体验。

    Android 点击缩略图显示大图 Demo

    在Android开发中,有时我们需要实现一个功能:当用户点击一个小的缩略图时,能够弹出一个全屏的大图查看器来展示详细内容。这个"Android 点击缩略图显示大图 Demo"就是用来演示如何实现这一功能的。下面我们将深入...

    Android系统录制视频(适配7.0)

    Bitmap thumbnail = BitmapFactory.decodeByteArray(thumbnailData, 0, thumbnailData.length); // 显示或保存缩略图 ``` 最后,关于适配Android 7.0的Intent管理,主要是处理返回的`Uri`。在Android 7.0及以上版本...

    Android实现微信分享功能.zip

    以上步骤详细介绍了在Android应用中集成QQ和微信分享功能的具体流程和技术要点。开发者可以根据实际需求调整分享的内容和形式,以满足用户的各种分享需求。在开发过程中,遵循官方文档和最佳实践,能够帮助你更顺利...

    android录制视频,缩略图播放视频

    在Android平台上,录制和播放视频以及生成缩略图是常见的功能需求,对于开发者来说,理解和掌握这些技术至关重要。本文将详细讲解如何实现这些功能,并提供相关的编程知识点。 首先,我们来探讨如何录制视频。...

    android开发资料

    Android提供了`Bitmap.createBitmap()`和`MediaStore.Images.Thumbnails.getThumbnail()`等方法,用于根据需求生成不同大小和质量的缩略图,同时需要注意内存管理和图片解码策略,防止内存溢出。 6. 文件操作:...

    android listview实现新闻列表展示效果 (1).zip

    总的来说,这个项目展示了如何使用Android的ListView组件和自定义适配器来实现新闻列表的展示效果,涉及到的关键技术包括ListView、适配器模式、数据绑定以及视图复用。通过这种方式,开发者可以高效地处理大量数据...

    Android 图片多选.rar

    下面我们将深入探讨Android平台上的图片多选功能及其相关技术。 1. **Intent选择器**: 在Android中,我们可以利用内置的`Intent`系统服务来调用系统相册,实现图片的选择。通过创建一个`Intent`,设置其类型为...

    android超炫的图片浏览器.rar

    通过学习这个项目,开发者不仅可以掌握Android图像处理的核心技术,还能提升整体的开发技能和用户体验设计意识。同时,源码分析有助于深入理解这些知识点的实现细节,从而在实际项目中灵活运用。

    android实现相册功能

    MediaStore提供了一个获取缩略图的方法,`MediaStore.Images.Thumbnails.getThumbnail()`。对于大量图片的展示,我们还需要处理加载策略,比如懒加载和缓存机制。 最后,如果需要更高级的相册功能,比如多选、裁剪...

    android 实现截屏、拍照、浏览功能

    如果确实需要截取包含Toast的屏幕,可能需要利用反射等技术,但这并不是标准做法,也不总是可靠。 接下来,我们讨论**图片浏览**。在Android中,展示大量图片时,为了防止内存溢出,通常会采用缩略图的方式。我们...

    Android 拍多张照片以缩略图的形式显示(3张)

    下面将详细讲解这个过程涉及的技术点和步骤。 首先,我们需要利用Android系统的Camera API或者CameraX库来实现拍照功能。Camera API是Android系统早期提供的相机接口,适用于低版本系统;而CameraX是Google推出的...

    Android 制作一款短视频app软件可在线观看(视频实时更新)

    在Android平台上制作一款短视频应用程序,实现在线观看和实时更新功能,涉及到多个技术栈和关键步骤。下面将详细探讨这些知识点: 1. **Android Studio与SDK**:开发Android应用的首选工具是Android Studio,它集成...

    android_手机本地视频列表

    在Android开发中,展示手机本地视频并实现播放功能是一个常见的需求。这个项目“android_手机本地...开发者需要理解`ContentResolver`、`GridView`、`VideoView`以及媒体数据处理等相关技术,才能成功实现类似的功能。

    android 手机可以设置的拍照参数

    随着移动设备技术的发展,现代智能手机的摄像头功能日益强大。用户不仅可以简单地拍摄照片,还可以通过调整多种参数来优化摄影体验。以下是从标题、描述以及部分配置信息中提取出的关键拍照参数及其作用: #### 1. ...

Global site tag (gtag.js) - Google Analytics