android 图片压缩

1:根据Picasso 获取图片的宽高

 Picasso.with(this).load(uri).transform(transformation).into(image_first);
 
 Transformation transformation = new Transformation() {
    @Override
    public Bitmap transform(Bitmap source) {
        int targetWidth = 0;
        Log.e(TAG, "source.getHeight()=" + source.getHeight());
        Log.e(TAG, "source.getWidth()=" + source.getWidth());
        Log.e(TAG, "targetWidth=" + targetWidth);
        if (source.getWidth() == 0) {
            return source;
        }

        //如果图片小于设置的宽度,则返回原图
        if (source.getWidth() < targetWidth) {
            return source;
        } else {
            //如果图片大小大于等于设置的宽度,则按照设置的宽度比例来缩放
            double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
            Log.e(TAG, "transform: aspectRatio=" + aspectRatio);
            int targetHeight = (int) (targetWidth * aspectRatio);
            Log.e(TAG, "transform: targetHeight=" + targetHeight);
            if (targetHeight != 0 && targetWidth != 0) {
                Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
                if (result != source) {
                    // Same bitmap is returned if sizes are the same
                    Log.e(TAG, "transform: result.getWidth()=" + result.getWidth());
                    Log.e(TAG, "transform: result.getHeight()=" + result.getHeight());
                    source.recycle();
                }
                return result;
            } else {
                return source;
            }
        }
    }

    @Override
    public String key() {
        return "transformation" + " desiredWidth";
    }
};
Glide 获取图片宽高
 
  //获取图片真正的宽高
    Glide.with(this).asBitmap().load(str).into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            Log.e(TAG, "onResourceReady: width=" + width);
            Log.e(TAG, "onResourceReady: height=" + height);
            image_second.setImageBitmap(compressQualityBitmap(bitmap));
            image_third.setImageBitmap(compressScale(bitmap));
        }
    });

//质量压缩
public Bitmap compressQualityBitmap(Bitmap bitmap) {
    Log.e(TAG, "compressQualityBitmap: bitmap.getWidth=" + bitmap.getWidth());
    Log.e(TAG, "compressQualityBitmap: bitmap.getHeight=" + bitmap.getHeight());
    Log.e(TAG, "compressQualityBitmap: bitmap.getDensity=" + bitmap.getDensity());
//        Log.e(TAG, "compressQualityBitmap: bitmap.getByteCount="+bitmap.getByteCount() +",内存="+formatFloat(Float.valueOf((float) (bitmap.getByteCount()*1.0/1024))));
    float f = Float.valueOf(formatFloat(Float.valueOf((float) (bitmap.getByteCount() * 1.0 / 1024))));
    Log.e(TAG, "compressQualityBitmap: 内存=" + formatFloat(f / 1024));

    if (bitmap != null) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int options = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

        while (baos.toByteArray().length / 1024 > 100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
            Log.e(TAG, "compressQualityBitmap: baos.toByteArray().length=" + baos.toByteArray().length);
            baos.reset();
            options -= 5;
            if (options < 0) {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 5, baos);
                break;
            }
            bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos); //这里压缩options%,把压缩后的数据存放到baos中
        }
        byte[] bitmapArray = baos.toByteArray();
        Log.e(TAG, "compressQualityBitmap: bitmapArray=" + bitmapArray.length);
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中

        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 开始读入图片,此时把options.inJustDecodeBounds 设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap newBitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
        newOpts.inJustDecodeBounds = false;
        newOpts.inPreferredConfig = Bitmap.Config.RGB_565;//降低图片从ARGB888到RGB565
        // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
        isBm = new ByteArrayInputStream(baos.toByteArray());
        newBitmap = BitmapFactory.decodeStream(isBm, null, newOpts);

        if (newBitmap != null) {
            Log.e(TAG, "compressQualityBitmap: !=null");
            Log.e(TAG, "compressQualityBitmap: newBitmap.getWidth" + newBitmap.getWidth());
            Log.e(TAG, "compressQualityBitmap: newBitmap.getHeight" + newBitmap.getHeight());
            Log.e(TAG, "compressQualityBitmap: newBitmap.getDensity" + newBitmap.getDensity());
            Log.e(TAG, "compressQualityBitmap: newBitmap.getByteCount" + newBitmap.getByteCount());

            float f2 = Float.valueOf(formatFloat(Float.valueOf((float) (newBitmap.getByteCount() * 1.0 / 1024))));
            Log.e(TAG, "compressQualityBitmap:新内存= " + formatFloat(f2 / 1024));
            return newBitmap;
        } else {
            Log.e(TAG, "compressQualityBitmap: ==null");
            return null;
        }


    } else {
        return null;
    }
}
/**
 * 保留两位小数
 */
public String formatFloat(Float value) {
    if (value == null) {
        return "0.00";
    }
    DecimalFormat df = new DecimalFormat("0.00");
    df.setRoundingMode(RoundingMode.HALF_UP);
    return df.format(value);
}


/**
 * 图片按比例大小压缩方法
 *
 * @param image (根据Bitmap图片压缩)
 *              be 控制压缩比例
 * @return
 */
public static Bitmap compressScale(Bitmap image) {
    Log.e(TAG, "compressScale: " + image.getWidth());
    Log.e(TAG, "compressScale: " + image.getHeight());
    Log.e(TAG, "compressScale: " + image.getDensity());
    Log.e(TAG, "compressScale: " + image.getByteCount());
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
    BitmapFactory.Options newOpts = new BitmapFactory.Options();
    // 开始读入图片,此时把options.inJustDecodeBounds 设回true了
    newOpts.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
    newOpts.inJustDecodeBounds = false;
    int w = newOpts.outWidth;
    int h = newOpts.outHeight;
    Log.e(TAG, w + "---------------" + h);
    // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
    // float hh = 800f;// 这里设置高度为800f
    // float ww = 480f;// 这里设置宽度为480f
    float hh = 300f;
    float ww = 400f;
    // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
    int be = 1;// be=1表示不缩放
    if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
        be = (int) (newOpts.outWidth / ww);
    } else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放
        be = (int) (newOpts.outHeight / hh);
    }
    Log.e(TAG, "compressScale: be=" + be);
    if (be <= 0)
        be = 1;
//        newOpts.inSampleSize = be; // 设置缩放比例
    newOpts.inSampleSize = 2; // 测试缩放两倍 be=2
    // newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565
    // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
    isBm = new ByteArrayInputStream(baos.toByteArray());
    bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
    Log.e(TAG, "compressScale: bitmap.getWidth()=" + bitmap.getWidth());
    Log.e(TAG, "compressScale: bitmap.getHeight()=" + bitmap.getHeight());
    Log.e(TAG, "compressScale: bitmap.getDensity()=" + bitmap.getDensity());
    Log.e(TAG, "compressScale: bitmap.getByteCount() =" + bitmap.getByteCount());
    return bitmap;// 压缩好比例大小后再进行质量压缩
    //return bitmap;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一声紫金,一生紫金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值