对BitMap进行缩略

1,sdk提供的方法

  //sdk提供的的方法
        Bitmap bmp = ThumbnailUtils.extractThumbnail(bitmap, 60, 60,
                ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

2,goole推荐的方法

//指定采样率 来缩小图片的分辨率,降低了图片尺寸,有效避免OOM
    public Bitmap decodeBmpFromResource(Resources res, int resId,
                                        int reqWidth, int reqHeight) {
        // 设置inJustDecodeBounds = true ,表示先不加载图片
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);

        // 计算合适的 采样率inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);
        // 修改图片 编码格式
        /*
        Bitmap.Config ARGB_8888:一个像素点占8+8+8+8=32位
        Bitmap.Config ARGB_4444:一个像素点占4+4+4+4=16位
        Bitmap.Config RGB_565:一个像素点占5+6+5=16位
        Bitmap.Config ALPHA_8:只有透明度,没有颜色,那么一个像素点占8位。
        */
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        // inJustDecodeBounds 置为 false 真正开始加载图片
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }

    // 计算 采样率inSimpleSize的值的方法
    /*
       当inSimpleSize为1时,图片的分辨率就是原来的分辨率,也就是1200*800
       当inSimpleSize为2时,表示图片的宽和高都是为原来的1/2,所整张图变成了原来的1/4
       当inSimpleSize位4时,表示图片的宽和高都是为原来的1/4,所以整张图也就变成原来的1/16
       */
    public int calculateInSampleSize(BitmapFactory.Options options,
                                     int reqWidth, int reqHeight) {
        if (reqWidth == 0 || reqHeight == 0) {
            return 1;
        }

        // 获取图片原生的宽和高
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        // 如果原生的宽高大于请求的宽高,那么将原生的宽和高都置为原来的一半
        if (height > reqHeight || width > reqWidth) {
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
            // 主要计算逻辑
            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize)
                    >= reqWidth) {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }

3,把bitmap压缩成指定尺寸的图片

public static Bitmap compressBmp(Bitmap bitmap, double maxSize) {
		if (null == bitmap) {
			return null;
		}
		if (bitmap.isRecycled()) {
			return null;
		}
		// 单位:从 Byte 换算成 KB
		double currentSize = bmp2ByteArray(bitmap, false).length / 1024;
		// 判断bitmap占用空间是否大于允许最大空间,如果大于则压缩,小于则不压缩
		while (currentSize > maxSize) {
			// 计算bitmap的大小是maxSize的多少倍
			double multiple = currentSize / maxSize;
			// 开始压缩:将宽带和高度压缩掉对应的平方根倍
			// 1.保持新的宽度和高度,与bitmap原来的宽高比率一致
			// 2.压缩后达到了最大大小对应的新bitmap,显示效果最好
			bitmap = compressBmp(bitmap,
					bitmap.getWidth() / Math.sqrt(multiple), bitmap.getHeight()
							/ Math.sqrt(multiple));
			currentSize = bmp2ByteArray(bitmap, false).length / 1024;
		}
		return bitmap;
	}

	public static Bitmap compressBmp(Bitmap bitmap, double newWidth,
			double newHeight) {
		if (null == bitmap) {
			return null;
		}
		if (bitmap.isRecycled()) {
			return null;
		}
		if (newWidth <= 0 || newHeight <= 0) {
			return null;
		}
		// 获取图片的宽和高
		float width = bitmap.getWidth();
		float height = bitmap.getHeight();
		// 创建操作图片的matrix对象
		Matrix matrix = new Matrix();
		// 计算宽高缩放率
		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;
		// 缩放图片动作
		matrix.postScale(scaleWidth, scaleHeight);
		Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, (int) width,
				(int) height, matrix, true);
		return bmp;
	}

	private static byte[] bmp2ByteArray(Bitmap bitmap, boolean needRecycle) {
		if (null == bitmap) {
			return null;
		}
		if (bitmap.isRecycled()) {
			return null;
		}

		ByteArrayOutputStream output = new ByteArrayOutputStream();
		bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
		if (needRecycle) {
			bitmap.recycle();
		}

		byte[] result = output.toByteArray();
		try {
			output.close();
		} catch (Exception e) {
			Log.e(TAG, e.toString());
		}
		return result;
	}

点击打开链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值