在做一个项目的时候有个要求就是固定大小取图像的缩略图,android2.2以前的话都是通过BitmapFactory.Options 设置Options通过一定的宽高比例来得到一个缩略图,但是得到的并不是要求的固定大小的缩略图,而是宽和高按一定比例缩放后的,android2.2以后提供了一个新的类ThumbnailUtils类可以直接获取,但是考虑到2.2以版本的兼容性ThumbnailUtils虽然很好但是不适用,通过对ThumbnailUtils类的解析,项目中抽出了一个新的类把ThumbnailUtils类中与图片不相关的内容剔除出来,这样就可以兼容所有的版本:

上代码:

private static class ImageZoom {

private static final int OPTIONS_SCALE_UP = 0x1;

public static final int OPTIONS_RECYCLE_INPUT = 0x2;

private static final int OPTIONS_NONE = 0x0;

public static Bitmap extractThumbnail(Bitmap source, int width, int height)

{

return extractThumbnail(source,width,height,OPTIONS_NONE);

}

private static Bitmap extractThumbnail(

Bitmap source, int width, int height, int options) {

if (source == null) {

return null;

}

float scale;

if (source.getWidth() < source.getHeight()) {

scale = width / (float) source.getWidth();

} else {

scale = height / (float) source.getHeight();

}

Matrix matrix = new Matrix();

matrix.setScale(scale, scale);

Bitmap thumbnail = transform(matrix, source, width, height,

OPTIONS_SCALE_UP | options);

return thumbnail;

}

private static Bitmap transform(Matrix scaler,

Bitmap source,

int targetWidth,

int targetHeight,

int options) {

boolean scaleUp = (options & OPTIONS_SCALE_UP) != 0;

boolean recycle = (options & OPTIONS_RECYCLE_INPUT) != 0;

int deltaX = source.getWidth() - targetWidth;

int deltaY = source.getHeight() - targetHeight;

if (!scaleUp && (deltaX < 0 || deltaY < 0)) {

Bitmap b2 = Bitmap.createBitmap(targetWidth, targetHeight,

Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b2);

int deltaXHalf = Math.max(0, deltaX / 2);

int deltaYHalf = Math.max(0, deltaY / 2);

Rect src = new Rect(

deltaXHalf,

deltaYHalf,

deltaXHalf + Math.min(targetWidth, source.getWidth()),

deltaYHalf + Math.min(targetHeight, source.getHeight()));

int dstX = (targetWidth - src.width()) / 2;

int dstY = (targetHeight - src.height()) / 2;

Rect dst = new Rect(

dstX,

dstY,

targetWidth - dstX,

targetHeight - dstY);

c.drawBitmap(source, src, dst, null);

if (recycle) {

source.recycle();

}

return b2;

}

float bitmapWidthF = source.getWidth();

float bitmapHeightF = source.getHeight();

float bitmapAspect = bitmapWidthF / bitmapHeightF;

float viewAspect = (float) targetWidth / targetHeight;

if (bitmapAspect > viewAspect) {

float scale = targetHeight / bitmapHeightF;

if (scale < .9F || scale > 1F) {

scaler.setScale(scale, scale);

} else {

scaler = null;

}

} else {

float scale = targetWidth / bitmapWidthF;

if (scale < .9F || scale > 1F) {

scaler.setScale(scale, scale);

} else {

scaler = null;

}

}

Bitmap b1;

if (scaler != null) {

b1 = Bitmap.createBitmap(source, 0, 0,

source.getWidth(), source.getHeight(), scaler, true);

} else {

b1 = source;

}

if (recycle && b1 != source) {

source.recycle();

}

int dx1 = Math.max(0, b1.getWidth() - targetWidth);

int dy1 = Math.max(0, b1.getHeight() - targetHeight);

Bitmap b2 = Bitmap.createBitmap(

b1,

dx1 / 2,

dy1 / 2,

targetWidth,

targetHeight);

if (b2 != b1) {

if (recycle || b1 != source) {

b1.recycle();

}

}

return b2;

}

}

更多相关文章

  1. android view层次与位置大小
  2. android音量控制曲线和调用过程
  3. Android(安卓)Studio系列教程(二)
  4. Android增量升级的方法和原理详细介绍
  5. 在Eclipse中 每次右击工程名 选择 properties 后点击 Android后
  6. Android获取内部和SDCard的存储空间
  7. Android(安卓)自定义Spinner字体、颜色、大小
  8. Android(安卓)SDK中的强大工具——Monitor(一)
  9. android屏幕分类与屏幕相关参数定义

随机推荐

  1. springboot+vue项目实战-天猫商城
  2. 打造一款 刷Java 知识的小程序(二)
  3. 08. SpringCloud实战项目-配置Git
  4. 个人搭建网站要如何选择服务器?
  5. 09. SpringCloud实战项目-初始化项目和添
  6. 01. SpringCloud实战项目-五分钟搞懂分布
  7. 只因一个 Redis 误操作,程序员被开除!
  8. 02. SpringCloud实战项目-快速搭建Linux
  9. 个人用户怎样选择最适合的阿里云服务器?
  10. 11. SpringCloud实战项目-初始化数据库和