android实现图片压缩
16lz
2022-04-05
android在开发时常用到的图片的压缩后在操作,实现类BitmapUtils.java
import android.app.Activity;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.widget.ImageView;/** * @author Administrator * @content * @date 2018/1/26 */public class BitmapUtils { /** * @description 计算图片的压缩比率 * * @param options 参数 * @param reqWidth 目标的宽度 * @param reqHeight 目标的高度 * @return */ private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源图片的高度和宽度 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; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while (halfHeight / inSampleSize > reqHeight && halfWidth / inSampleSize > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } /** * @description 通过传入的bitmap,进行压缩,得到符合标准的bitmap * * @param src * @param dstWidth * @param dstHeight * @return */ private static Bitmap createScaleBitmap(Bitmap src, int dstWidth, int dstHeight, int inSampleSize) { Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false); if (src != dst) { // 如果没有缩放,那么不回收 src.recycle(); // 释放Bitmap的native像素数组 } return dst; } /** * @description 从Resources中加载图片 * * @param res * @param resId * @param reqWidth * @param reqHeight * @return */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 设置成了true,不占用内存,只获取bitmap宽高 BitmapFactory.decodeResource(res, resId, options); // 读取图片长宽,目的是得到图片的宽高 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 调用上面定义的方法计算inSampleSize值 // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; Bitmap src = BitmapFactory.decodeResource(res, resId, options); // 载入一个稍大的缩略图 return createScaleBitmap(src, reqWidth, reqHeight, options.inSampleSize); // 通过得到的bitmap,进一步得到目标大小的缩略图 } /** * @description 从SD卡上加载图片 * * @param pathName * @param reqWidth * @param reqHeight * @return */ public static Bitmap decodeSampledBitmapFromFile(String pathName, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(pathName, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; Bitmap src = BitmapFactory.decodeFile(pathName, options); return createScaleBitmap(src, reqWidth, reqHeight, options.inSampleSize); } /** * 大图压缩 * @param context * @param resourcesId * @param imageView */ public static void loadBitmap(Activity context, int resourcesId, ImageView imageView) { int bmSize = 0; Bitmap bm = null; if (true) { // 通过工具类来产生一个符合ImageView的缩略图,因为ImageView的大小是50x50,所以这里得到的缩略图也应该是一样大小的 bm = BitmapUtils.decodeSampledBitmapFromResource(context.getResources(), resourcesId, imageView.getWidth(), imageView.getHeight()); } else { // 直接加载原图 bm = BitmapFactory.decodeResource(context.getResources(), resourcesId); } imageView.setImageBitmap(bm); bmSize += bm.getByteCount(); // 得到bitmap的大小 int kb = bmSize / 1024; int mb = kb / 1024; }}
更多相关文章
- Android(安卓)图片旋转(使用Matrix.setRotate方法)
- Android根据电量变化为不同图片的方法【电池电量提示】
- Android日常应用记录
- 实现调用Android手机的拍照功能
- android JNI处理图片的例子
- Android分享图片
- Android腾讯微薄客户端开发十四:首页menu菜单
- Android之关于手势操作图片的缩放与移动
- 自己写的Android(安卓)Contacts操作类,以后还会补充