Android三种常见的图片压缩方式

下面就为大家带来3种比较常见的压缩方式

先给出一组数据

原图:width:2976; height:2976
原图实际:--->byte:2299820 Mb:2.19328
质量压缩 size--->:byte:1599831 kb:1562.33496
按比例压缩 size--->:byte:191707 kb:187.21387
鲁班压缩 size--->:byte:143792 kb:140.42188

压缩效果:鲁班压缩 > 按比例压缩 > 质量压缩

1、质量压缩

 public void getBitmap(String imgPath, String outPath) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        newOpts.inJustDecodeBounds = false;
        newOpts.inPurgeable = true;
        newOpts.inInputShareable = true;
        // Do not compress
        newOpts.inSampleSize = 1;
        newOpts.inPreferredConfig = Config.RGB_565;
        storeImage(bitmap, outPath); //保存图片
    }

注意

  • 质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,这也是为什么该方法叫质量压缩方法。所以这种方法,很可能不会减少图片的大小
  • 如果是bit.compress(CompressFormat.PNG, quality, baos);这样的png格式,quality就没有作用了,bytes.length不会变化,因为png图片是无损的,不能进行压缩

保存图片

/**
     * 把bitmap转化成图片存储在本地
     *
     * @param bitmap
     * @param outPath 本地的存储路径
     * @throws FileNotFoundException
     */
    public static boolean storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException {
        FileOutputStream os = new FileOutputStream(outPath);
        boolean compressResult = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
        return compressResult;
    }

2、按比例压缩(尺寸压缩、采样率压缩)

/**
     * 按比例压缩
     *
     * @param path    原图片路径
     * @param targetW 压缩后宽度
     * @param targetH 压缩后高度
     * @return 压缩后的图片的保存路径
     */
    public static String compressScale(String path,, String outPath, int targetW, int targetH) throws FileNotFoundException {
        // 获取option
        BitmapFactory.Options options = new BitmapFactory.Options();
        // inJustDecodeBounds设置为true,这样使用该option decode出来的Bitmap是null,
        // 只是把长宽存放到option中
        options.inJustDecodeBounds = true;
        // 此时bitmap为null
        Bitmap bitmap = BitmapFactory.decodeFile(path, options);
        int inSampleSize = 1; // 1是不缩放
        // 计算宽高缩放比例
        int inSampleSizeW = options.outWidth / targetW;
        int inSampleSizeH = options.outHeight / targetH;
        // 最终取大的那个为缩放比例,这样才能适配,例如宽缩放3倍才能适配屏幕,而
        // 高不缩放就可以,那样的话如果按高缩放,宽在屏幕内就显示不下了
        if (inSampleSizeW > inSampleSizeH) {
            inSampleSize = inSampleSizeW;
        } else {
            inSampleSize = inSampleSizeH;
        }
        // 一定要记得将inJustDecodeBounds设为false,否则Bitmap为null
        options.inJustDecodeBounds = false;
        // 设置缩放比例(采样率)
        options.inSampleSize = inSampleSize;
        bitmap = BitmapFactory.decodeFile(path, options);
        boolean isSuccess = storeImage(bitmap, outPath);
        if (isSuccess) {
            return outPath;
        }
        return "";
    }

这种方法是设置图片的采样率,降低图片像素,通过缩放图片像素来减少图片大小。

那么我又是如何来获取图片压缩前后的大小的呢?

注意:这里的图片的大小是指图片的实际大小,不是bitmap在内存中所占的大小,看压缩效果,就得看图片在文件中所占的大小。

/**
     * 获取本地文件大小
     *
     * @param imgPath 图片的路径
     * @return 图片实际的大小,单位byte
     */
    public static int getFileSize(String imgPath) {
        int size = 0;
        try {
            FileInputStream fis = new FileInputStream(new File(imgPath));
            size = fis.available();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return size;
    }

3、鲁班压缩(推荐)

鲁班压缩是根据一种算法得出来的,压缩效果基本上和微信一致,差不多在200k以内,图片不失真。

鲁班压缩:
https://github.com/Curzibn/Luban

build.gradle添加依赖

compile 'top.zibin:Luban:1.1.3'
private void lunBanPress(String path) {
        String pressPath = Environment.getExternalStorageDirectory().getPath();
        Luban.with(this)
                .load(path)                                   // 传人要压缩的图片列表
                .ignoreBy(100)                                  // 忽略不压缩图片的大小
                .setTargetDir(pressPath)                        // 设置压缩后文件存储位置
                .setCompressListener(new OnCompressListener() { //设置回调
                    @Override
                    public void onStart() {
                        // TODO 压缩开始前调用,可以在方法内启动 loading UI
                        Log.i(TAG, "onStart:开始鲁班压缩 ");
                    }

                    @Override
                    public void onSuccess(File file) {
                        // TODO 压缩成功后调用,返回压缩后的图片文件
                        Glide.with(activity).load(file).into(iv2);
                        Log.i(TAG, "onSuccess: 鲁班压缩成功 :");
                        try {
                            int size = new FileInputStream(file).available();
                            Log.i("tag", "鲁班压缩 size--->:" + "byte:" + size + "    kb:"
                                    + (float) size / 1024);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        // TODO 当压缩过程出现问题时调用
                        Log.i(TAG, "onError: 鲁班压缩出错");
                    }
                }).launch();    //启动压缩
    }

源码地址:
https://github.com/zhouxu88/ImgCompress

到这里就结束啦~

以上就是Android三种常见的图片压缩方式的详细内容,更多关于Android 图片压缩的资料请关注我们其它相关文章!

(0)

相关推荐

  • android图片压缩工具类分享

    本文实例为大家分享了android图片压缩工具类的具体代码,供大家参考,具体内容如下 import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; imp

  • Android 基于Bitmap的四种图片压缩方式

    知识点介绍 Android 中图片主要以 Bitmap 的形式存在,所以压缩图片主要就是减少 Bitmap 的大小.Bitmap 的大小可以通过如下的公式计算得到:size = width * height * 单个像素所占字节数.因此压缩图片通过改变公式中的三个变量即可实现. 单个像素所占空间大小在 Android 中有多种,详见如下 格式 所占空间 说明 Bitmap.Config.ALPHA_8 1B 该种格式表示图片只有透明度没有颜色,1个像素占用8位 Bitmap.Config.ARG

  • Android整理好的图片压缩工具类

    Android设备的内存有限,对于大图片,必须进行压缩后再进行显示,否则会出现内存溢出:OOM: 处理策略: 1.使用缩略图(Thumbnails): Android系统会给检测到的图片创建缩略图:可以操作Media内容提供者中的Image对图片进行操作: 2.手动压缩: (1)根据图片和屏幕尺寸,等比压缩,完美显示: (2)降低图片质量,压缩图片大小: 以下是自己整理的小工具类(对于按比例缩放后,在此并未再进行质量缩放,此时图片大小有可能超出我们期望的限制:假如我们有严格的大小限制需求,可先进

  • Android Tiny集成图片压缩框架的使用

    为了简化对图片压缩的调用,提供最简洁与合理的api压缩逻辑,对于压缩为Bitmap根据屏幕分辨率动态适配最佳大小,对于压缩为File优化底层libjpeg的压缩,整个图片压缩过程全在压缩线程池中异步压缩,结束后分发回UI线程. 支持的压缩类型 Tiny图片压缩框架支持的压缩数据源类型: 1.Bytes 2.File 3.Bitmap 4.Stream 5.Resource 6.Uri(network.file.content) Tiny支持单个数据源压缩以及批量压缩,支持的压缩类型: 1.数据源

  • Android开发之图片压缩实现方法分析

    本文实例讲述了Android开发之图片压缩实现方法.分享给大家供大家参考,具体如下: 由于Android本身的机制限定 由于系统对每个应用内存分配规则的限制,如果加载过大图片很有可能会导致OOM 即闪退或者卡屏现象 但是手机上拇指大小的图片,超清是完全没有必要的 这是我们就需要对 对片进行压缩处理: 大多数人采用先生成bitmap对象,反复压缩bitmap至100k一下的方法,对图片进行反复压缩,但如果是超级大图,bitmap生成本身就已经会导致OOM,所以我们应先对bitmap进行设置: pu

  • Android图片压缩的实例详解

    Android图片压缩的实例详解 在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己记忆,于是总结如下. android图片压缩主要有两种方式:1.压缩图片分辨率 2.压缩图片质量 一.先看压缩图片分辨率,很好理解,如本来1280*768的图片压缩为640*384大小.废话不说,直接上代码: /** * 按比例压缩图片分辨率 * @para

  • Android图片压缩方法并压缩到指定大小

    一.图片质量压缩 /** * 质量压缩方法 * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

  • Android 高效图片压缩的实现

    使用libjpeg-turbo进行图片压缩 1. JEPG 是什么? 相信有一部分使用 iPhone 手机用微信发送图片的时候,明明图片大小只有 1M ,但清晰度比 Android 手机 5 M 图片大小的还要清晰,那么这是为什么呢 ?. 当时谷歌开发 Android 的时候,考虑了大部分手机的配置并没有那么高,所以对图片处理使用的是 Skia.当然这个库的底层还是用的 jpeg 图片压缩处理.但是为了能够适配低端的手机(这里的低端是指以前的硬件配置不高的手机,CPU 和内存在手机上都非常吃紧,

  • Android LuBan与Compressor图片压缩方式

    1,LuBan压缩问题    https://github.com/Curzibn/Luban 之前选择压缩图片库,在github上找的这个star最多的,使用方法是传入图片数组,在异步线程中回调返回的结果.接下来就出现问题了,压缩的图片质量模糊,虽然可以设置多少KB一下不压缩,在正常手机屏幕压缩没太大问题.但是在平板,同一张图片,压缩就会模糊. Luban.with(this) .load(photos) // 传人要压缩的图片列表 .ignoreBy(100) // 忽略不压缩图片的大小 .

  • Android开发之图片压缩工具类完整实例

    本文实例讲述了Android图片压缩工具类.分享给大家供大家参考,具体如下: 这里共享一个图片压缩工具类: package com.sanweidu.TddPay.util2; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class Im

随机推荐