`
duguyidao
  • 浏览: 138455 次
  • 性别: 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字段的值。
参考代码可以查看过程
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));
			}
		}
	}

}

  • 大小: 52.2 KB
  • 大小: 82.8 KB
  • 大小: 36.4 KB
  • 大小: 213.7 KB
分享到:
评论
5 楼 智在千里2013 2016-11-02  
视频的缩略图在哪里,看了一下MediaStore.Video.Media里面没有视频ID。_ID这个是表的id
4 楼 messigoogle 2012-09-14  
楼主,你的XML文件一并贴出来,让我们学习啊,谢谢
3 楼 zhiying201039 2012-02-23  
谢谢    
2 楼 花泽类 2011-08-17  
可以把布局文件一并补齐么?R.layout.item里边是什么内容?
1 楼 gangbener 2011-07-02  
非常有帮助!谢谢您~~。

相关推荐

    ANDROID 获取最近的相片的缩略图

    在Android开发中,获取最近照片的缩略图是一项...总之,获取Android设备上的最近相片缩略图需要正确查询MediaStore,按时间排序,并选择合适的缩略图生成方式。同时,注意优化性能和内存使用,以提供良好的用户体验。

    Android获取图片、视频缩略图

    在Android开发中,获取图片和视频的缩略图是一项常见的需求,这通常涉及到用户界面的展示,例如在相册应用中预览媒体内容。本文将详细介绍如何在Android中有效地获取这两种类型的媒体文件的缩略图。 一、图片缩略图...

    android图片选择器,仿微信

    在Android应用开发中,用户界面的设计与交互是至关重要的,特别是在涉及到媒体文件处理时,如图片的选择和编辑。"android图片选择器,仿微信"是一个专门为Android平台设计的开源项目,旨在提供类似微信的图片选择...

    thumbnails-android略缩图源码

    - 使用 `Environment.getExternalStorageDirectory()` 获取外部存储的根目录,但注意 Android 10(API 29)及更高版本对此有更改,可能需要使用 `getExternalFilesDir()` 或 `getExternalCacheDir()`。 通过以上...

    Android网络图片轮播

    在Android应用开发中,"Android网络图片轮播"是一个常见的需求,特别是在新闻、电商或社交媒体应用中。这种功能允许用户浏览一系列从网络加载的图片,通常以滑动或自动滚动的方式展示。本节将深入探讨如何实现这样一...

    android 相册图片多选

    在Android开发中,实现“相册图片多选”是一项常见的需求,特别是在构建类似微信朋友圈发布功能的应用时。这个功能允许用户从手机相册中选择多张图片,进行编辑、预览,甚至添加删除操作,从而提供类似微信朋友圈的...

    Android图片选择demo

    在Android开发中,图片选择是一个常见的需求,尤其在社交应用、相册应用或者任何需要用户上传图片的应用场景中。这个“Android图片选择demo”提供了一个实现这一功能的示例,让我们来深入了解一下如何在Android中...

    jQuery thumbnail 经过图片超酷的变化代码.rar

    这个“jQuery thumbnail 经过图片超酷的变化代码.rar”文件显然是一个利用jQuery实现的图片预览功能的示例,特别强调了在网页上创建美观的缩略图和提示效果。 在网页设计中,缩略图是一种常见的展示大量图片的方式...

    基于ASP.NET+C#实现的Image thumbnail 图片缩微处理程序例子代码

    然后,使用`Image.GetWidth()`和`Image.GetHeight()`获取原始尺寸,并根据缩放比例创建新的尺寸。接下来,创建一个新的Bitmap对象,其大小等于缩放后的尺寸,然后使用Graphics类的DrawImage方法将原始图片绘制到新的...

    Android图片浏览全屏缩放

    在Android开发中,实现图片浏览并支持全屏缩放是一项常见的需求,比如在设计一个相册应用时。本文将深入探讨如何实现这一功能,包括图片的加载、显示、手势缩放以及性能优化等方面。 首先,我们需要一个能够处理...

    Android图片框架Glide-3.7.0(最新,很强大)

    Android图片框架Glide-3.7.0(最新,很强大),超好用的图片框架(包含jar和源码) Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频...

    Android 图片多选.rar

    在Android开发中,图片多选是一个常见的功能,广泛应用于各种社交、相册应用中。这个“Android 图片多选.rar”文件很可能包含了一个简单的图片选择器的源代码实现,可以帮助开发者快速集成到自己的项目中。下面我们...

    android获取视频缩略图

    另外,Android 3.0(API 级别 11)及以上版本还提供了`MediaStore.Images.Thumbnails`接口,可以直接获取视频的缩略图。但这通常会返回系统自动生成的缩略图,可能与实际的视频帧不同。使用方法如下: ```java ...

    jQuery thumbnail 惟美的图片Tip提示效果

    在本文中,我们将深入探讨如何使用jQuery库来创建一种唯美的图片thumbnail提示效果。这种效果通常用于提升用户体验,当用户将鼠标悬停在缩略图上时,会弹出一个带有详细信息或预览的提示框。jQuery作为一款强大的...

    android超炫的图片浏览器.rar

    【Android 图片浏览器开发详解】 在Android应用开发中,实现一个功能强大且用户友好的图片浏览器是一项常见的任务。本教程将深入探讨如何构建一个“超炫的图片浏览器”项目,结合给定的“android超炫的图片浏览器”...

    exif-thumbnail-adder:Android应用程序在不包含JPEG图片的JPEG图片的EXIF标签中添加缩略图(批处理)

    Exif缩略图添加器这是一个适用于android设备的应用程序,它将在您的设备上搜索图片(JPEG),如果还没有缩略图,则在EXIF标签中添加缩略图。 它应该可以在android Oreo(android 8,SDK 26)上运行,并且已经在运行...

    10.0任务列表获取缩略图

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

    win8 metro制作一个thumbnail将某一文件夹下的所有图片以缩略图的形式显示到gridview上

    在Windows 8 Metro应用开发中,使用C#和Visual Studio 2013,我们可以创建一个功能丰富的应用程序,展示特定文件夹中的所有图片,并以缩略图的形式在GridView控件中呈现。以下是一些关键知识点的详细说明: 1. **...

    QListWidget显示图片缩略图

    - 如果原始图片过大,为了节省资源并适应`QListWidget`的大小,我们需要创建缩略图。这可以通过`QPixmap`的`scaled()`方法实现,它可以按照指定的比例或尺寸缩放图像。 ```python thumbnail_size = QtCore.QSize...

    glide-lide具有加载本地图片、远程图片、GIF动画等功能.zip

    Glide能够支持Android设备中的所有视频剧照的加载和展示缩略图的支持: 为了减少在同一个view组件里同时加载多张图片的时间,可以调用Glide.with(context).load(“图片路径“).thumbnail(“缩略比例“).into(“view...

Global site tag (gtag.js) - Google Analytics