android 固定大小取图片缩略图 抽出ThumbnailUtils 兼容所有版本

http://ancoder.blog.51cto.com/3582305/766014

在做一个项目的时候有个要求就是固定大小取图像的缩略图,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;

   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值