文档章节

android 图片质量压缩代码

枫TI
 枫TI
发布于 2017/08/29 16:42
字数 374
阅读 25
收藏 0
    /**
     * 质量压缩方法
     *
     * @param imagePath 原图片路劲
     * @param size      压缩图片到多少KB以内(单位KB)
     * @return 返回压缩后图片的绝对路径
     */
    public static File compressImageToSD(String imagePath, long size) {
        Log.i("======开始压缩图片======");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Bitmap image = BitmapFactory.decodeFile(imagePath);

        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到字节流中
        int options = 90;
        long fileSize = baos.toByteArray().length / 1024;
        if (fileSize / size > 5) {
            options = 20;
        } else if (fileSize / size > 4) {
            options = 25;
        } else if (fileSize / size > 3) {
            options = 30;
        } else if (fileSize / size > 2) {
            options = 50;
        }

        while (fileSize > size && options > 0) { // 循环判断如果压缩后图片是否大于1024kb,大于继续压缩
            baos.reset(); // 重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到字节流中
            Log.i("=压缩到原来=" + options + "%");
            options -= 10;// 每次都减少10
            fileSize = baos.toByteArray().length / 1024;
        }
        Log.i("===图片压缩结束===");
        InputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的字节存放到ByteArrayInputStream中
        Context application = BaseApplication.getContext();
        File appDir = new File(application.getExternalFilesDir(null), "temp");
        if (!appDir.exists() && appDir.mkdir()) {
            Log.d("", appDir.getName() + "目录创建成功");
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            Log.i("==压缩后的图片保存到SD==");
            FileOutputStream fos = new FileOutputStream(file);
            int temp = isBm.available();
            int bytesRead;
            byte[] buffer = new byte[isBm.available()];
            while ((bytesRead = isBm.read(buffer, 0, temp)) != -1) {
                LogUtil.i("==" + bytesRead);
                fos.write(buffer, 0, bytesRead);
            }
            fos.flush();
            fos.close();
            isBm.close();
            Log.i("==保存到SD成功==");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    //计算图片的缩放值
    public static int calculateInSampleSize(BitmapFactory.Options options) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        float reqWidth = (((float) height) / 10) * 9;
        float reqHeight = (((float) width) / 10) * 9;
        if (reqWidth > 480 && reqHeight > 800) {
            inSampleSize = 2;
        }
        return inSampleSize;
    }

 

© 著作权归作者所有

上一篇: Android Studio
下一篇: Gradle tasks
枫TI
粉丝 14
博文 106
码字总数 63527
作品 2
东城
私信 提问
Android性能优化——图片优化(二)

图片的加载和显示是每个商业APP都避免不了的问题,对于图片重度依赖类APP,例如壁纸类应用,图片社交类应用,对于图片的处理将会影响到整个APP的用户体验。 在正式了解Android中如何优化图片...

落地吃鸡
2017/04/21
361
0
Android图片压缩-大小与质量压缩

之前写过服务端实现图片压缩 Java与PHP生成缩略图或者大小压缩的方式 Android 项目中通常也有2种压缩方式 Android中图片有四种属性,分别是: ALPHA8:每个像素占用1byte内存 ARGB4444:每个...

IamOkay
2015/08/22
2.8K
2
android图片压缩的3种方法实例

android图片压缩的3种方法实例 发布:shangke 字体:[增加 减小] 类型:转载 这篇文章介绍了android图片压缩的3种方法实例,有需要的朋友可以参考一下 android 图片压缩方法:第一:质量压缩...

wanyang
2014/02/20
97
0
bitmap的六种压缩方式,Android图片压缩

转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/51955467 Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道b...

guozhendan
2018/06/26
0
0
Android中Bitmap,byte[],Drawable相互转化

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象...

守夜之星
2012/08/16
4.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部