2011.09.29(二)——— android 图片缩略图

2011.09.29(2)——— android 图片缩略图
2011.09.29(2)——— android 图片缩略图

参考:http://www.eoeandroid.com/thread-101021-1-1.html

前面 我们说过视频缩略图的做法 今天 看一下图片的缩略图获得 直接上代码 一个工具类

package com.lp;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;

public final class BitmapUtil {
	public static Bitmap decodeBitmap(String path, int displayWidth, int displayHeight) {
		BitmapFactory.Options op = new BitmapFactory.Options();
		op.inJustDecodeBounds = true;
		// op.inJustDecodeBounds = true;表示我们只读取Bitmap的宽高等信息,不读取像素。
		Bitmap bmp = BitmapFactory.decodeFile(path, op); // 获取尺寸信息
		// op.outWidth表示的是图像真实的宽度
		// op.inSamplySize 表示的是缩小的比例
		// op.inSamplySize = 4,表示缩小1/4的宽和高,1/16的像素,android认为设置为2是最快的。
		// 获取比例大小
		int wRatio = (int) Math.ceil(op.outWidth / (float) displayWidth);
		int hRatio = (int) Math.ceil(op.outHeight / (float) displayHeight);
		// 如果超出指定大小,则缩小相应的比例
		if (wRatio > 1 && hRatio > 1) {
			if (wRatio > hRatio) {
				// 如果太宽,我们就缩小宽度到需要的大小,注意,高度就会变得更加的小。
				op.inSampleSize = wRatio;
			} else {
				op.inSampleSize = hRatio;
			}
		}
		op.inJustDecodeBounds = false;
		bmp = BitmapFactory.decodeFile(path, op);
		return Bitmap.createScaledBitmap(bmp, displayWidth, displayHeight, true);
		// Bitmap.createScaledBitmap(Bitmap src,int detWidth,int detHeight,boolean filter)
		// 从原Bitmap创建一个给定宽高的Bitmap
	}

	/**
	 * * 采用复杂计算来决定缩放 *
	 * 
	 * @param path
	 *            *
	 * @param maxImageSize
	 *            *
	 * @return
	 */
	public static Bitmap decodeBitmap(String path, int maxImageSize) {
		BitmapFactory.Options op = new BitmapFactory.Options();
		op.inJustDecodeBounds = true;
		Bitmap bmp = BitmapFactory.decodeFile(path, op);
		// 获取尺寸信息
		int scale = 1;
		if (op.outWidth > maxImageSize || op.outHeight > maxImageSize) {
			// Math.pow(double a, double b)表示返回第一个参数的第二个参数的次幂
			// Math.log(double a)返回double的自然对数,底数是e
			// Math.round(double e)返回最接近double的值
			scale = (int) Math.pow(2, (int) Math.round(Math.log(maxImageSize / (double) Math.max(op.outWidth, op.outHeight)) / Math.log(0.5)));
		}
		op.inJustDecodeBounds = false;
		op.inSampleSize = scale;
		bmp = BitmapFactory.decodeFile(path, op);
		return bmp;
	}

	public static Cursor queryThumbnails(Activity context) {
		String[] columns = new String[] {
		// Thumbnails表示的缩略图的意思
				MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.IMAGE_ID };
		return context.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Thumbnails.DEFAULT_SORT_ORDER);
	}

	public static Cursor queryThumbnails(Activity context, String selection, String[] selectionArgs) {
		String[] columns = new String[] { MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.IMAGE_ID };
		// public final Cursor managedQuery (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
		// uri The URI of the content provider to query.
		// projection List of columns to return.
		// selection SQL WHERE clause.
		// selectionArgs The arguments to selection, if any ?s are pesent
		// sortOrder SQL ORDER BY clause.
		return context.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, MediaStore.Images.Thumbnails.DEFAULT_SORT_ORDER);
	}

	// 通过缩略图的ID来查询
	public static Bitmap queryThumbnailById(Activity context, int thumbId) {
		String selection = MediaStore.Images.Thumbnails._ID + " = ?";
		String[] selectionArgs = new String[] { thumbId + "" };
		Cursor cursor = BitmapUtil.queryThumbnails(context, selection, selectionArgs);
		if (cursor.moveToFirst()) {
			String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
			cursor.close();
			return BitmapUtil.decodeBitmap(path, 100, 100);
		} else {
			cursor.close();
			return null;
		}
	}

	public static Bitmap[] queryThumbnailsByIds(Activity context, Integer[] thumbIds) {
		Bitmap[] bitmaps = new Bitmap[thumbIds.length];
		for (int i = 0; i < bitmaps.length; i++) {
			bitmaps[i] = BitmapUtil.queryThumbnailById(context, thumbIds[i]);
		}
		return bitmaps;
	}

	/**
	 * * 获取全部
	 * 
	 * *
	 * 
	 * @param context
	 *            * @return
	 * 
	 * */
	public static List<Bitmap> queryThumbnailList(Activity context) {
		List<Bitmap> bitmaps = new ArrayList<Bitmap>();
		Cursor cursor = BitmapUtil.queryThumbnails(context);
		for (int i = 0; i < cursor.getCount(); i++) {
			cursor.moveToPosition(i);
			String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
			Bitmap b = BitmapUtil.decodeBitmap(path, 100, 100);
			bitmaps.add(b);
		}
		cursor.close();
		return bitmaps;
	}

	public static List<Bitmap> queryThumbnailListByIds(Activity context, int[] thumbIds) {
		List<Bitmap> bitmaps = new ArrayList<Bitmap>();
		for (int i = 0; i < thumbIds.length; i++) {
			Bitmap b = BitmapUtil.queryThumbnailById(context, thumbIds[i]);
			bitmaps.add(b);
		}
		return bitmaps;
	}

	public static Cursor queryImages(Activity context) {
		String[] columns = new String[] { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME };
		return context.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
	}

	public static Cursor queryImages(Activity context, String selection, String[] selectionArgs) {
		String[] columns = new String[] { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME };
		return context.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
	}

	public static Bitmap queryImageById(Activity context, int imageId) {
		String selection = MediaStore.Images.Media._ID + "=?";
		String[] selectionArgs = new String[] { imageId + "" };
		Cursor cursor = BitmapUtil.queryImages(context, selection, selectionArgs);
		if (cursor.moveToFirst()) {
			String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
			cursor.close();
			// return BitmapUtills.decodeBitmap(path, 260, 260);
			return BitmapUtil.decodeBitmap(path, 220);
			// 看看和上面这种方式的差别,看了,差不多
		} else {
			cursor.close();
			return null;
		}
	}

	/**
	 * * 根据缩略图的Id获取对应的大图 *
	 * 
	 * @param context
	 *            *
	 * @param thumbId
	 *            *
	 * @return
	 * */
	public static Bitmap queryImageByThumbnailId(Activity context, Integer thumbId) {
		String selection = MediaStore.Images.Thumbnails._ID + " = ?";
		String[] selectionArgs = new String[] { thumbId + "" };
		Cursor cursor = BitmapUtil.queryThumbnails(context, selection, selectionArgs);
		if (cursor.moveToFirst()) {
			int imageId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));
			cursor.close();
			return BitmapUtil.queryImageById(context, imageId);
		} else {
			cursor.close();
			return null;
		}
	}

}