android 图片压缩方法:

第一:质量压缩法:

private Bitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
       
image.compress(Bitmap.CompressFormat.JPEG, 100,
baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
        int options =
100;
        while ( baos.toByteArray().length / 1024>100) {   
//循环判断如果压缩后图片是否大于100kb,大于继续压缩       
           
baos.reset();//重置baos即清空baos
            options -=
10;//每次都减少10
            image.compress(Bitmap.CompressFormat.JPEG, options,
baos);//这里压缩options%,把压缩后的数据存放到baos中

}
       
ByteArrayInputStream isBm = new
ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
       
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null,
null);//把ByteArrayInputStream数据生成图片
        return bitmap;
   
}

第二:图片按比例大小压缩方法(根据路径获取图片并压缩):

private Bitmap getimage(String srcPath)
{
        BitmapFactory.Options newOpts = new
BitmapFactory.Options();
        //开始读入图片,此时把options.inJustDecodeBounds
设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap =
BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空

newOpts.inJustDecodeBounds = false;
        int w =
newOpts.outWidth;
        int h = newOpts.outHeight;
       
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
        float hh =
800f;//这里设置高度为800f
        float ww = 480f;//这里设置宽度为480f
       
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
        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);
        }
        if (be <= 0)
            be = 1;
       
newOpts.inSampleSize = be;//设置缩放比例
       
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
        bitmap =
BitmapFactory.decodeFile(srcPath, newOpts);
        return
compressImage(bitmap);//压缩好比例大小后再进行质量压缩
    }

图片比例压缩时, 我看到一个算法,说比较快。。
be = (int) ((w / STANDARD_WIDTH + h/
STANDARD_HEIGHT) / 2);
结论二:图片比例压缩倍数 就是 (宽度压缩倍数+高度压缩倍数)/2..

第三:图片按比例大小压缩方法(根据Bitmap图片压缩):

private Bitmap comp(Bitmap image)
{

ByteArrayOutputStream baos = new
ByteArrayOutputStream();       
       
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        if(
baos.toByteArray().length / 1024>1024)
{//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出   
           
baos.reset();//重置baos即清空baos
           
image.compress(Bitmap.CompressFormat.JPEG, 50,
baos);//这里压缩50%,把压缩后的数据存放到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;
       
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
        float hh =
800f;//这里设置高度为800f
        float ww = 480f;//这里设置宽度为480f
       
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
        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);
        }
        if (be <= 0)
            be = 1;
       
newOpts.inSampleSize = be;//设置缩放比例
        newOpts.inPreferredConfig =
Config.RGB_565;//降低图片从ARGB888到RGB565
       
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
        isBm = new
ByteArrayInputStream(baos.toByteArray());
        bitmap =
BitmapFactory.decodeStream(isBm, null, newOpts);
        return
compressImage(bitmap);//压缩好比例大小后再进行质量压缩
    }

android图片压缩的3种方法实例的更多相关文章

  1. android图片压缩方法

    android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...

  2. Android 图片压缩各种方式

       前言:由于公司项目当中需要用到压缩这块的相应技术,之前也做过的图片压缩都不是特别的理想, 所以这次花了很多心思,仔细研究和在网上找到了很多相对应的资料.为了就是 以后再做的时候直接拿来用就可以了 ...

  3. Android 图片压缩器

    概述 Android 图片压缩器:一款高效的图片压缩器库,支持批量压缩,异步压缩.多线程多任务压缩,压缩比设置等特性. 详细 代码下载:http://www.demodashi.com/demo/12 ...

  4. Android图片压缩上传(二)

    之前有用到libjpeg,还是有一定的局限性,最近用了一个新的方式,效果还是挺不错,随着作者的版本更新,Bug也随之变少,目前项目中运用已上线. 1.之前的方式Android图片压缩,不失真,上线项目 ...

  5. Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案

    1.Android一整套图片解决方案 http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820998&idx=1& ...

  6. 【转】c# Image获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  7. Android 抗锯齿的两种方法

    Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))   在Android中,目前,我知道有两种出现锯齿 ...

  8. android emulator启动的两种方法详解

    android emulator启动的两种方法详解    转https://blog.csdn.net/TTS_Kevin/article/details/7452237 对于android学习者,模 ...

  9. c# pictureBox1.Image的获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

随机推荐

  1. [置顶] 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面

    [Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...

  2. JavaScript学习笔记(四十四) 装饰器

    装饰器模式(Decorator) 在装饰器模式中,可以在运行时给一个对象动态的添加额外的功能.当和静态类打交道的时候(static classes),这可能是一个挑战.但在JavaScript中,对象 ...

  3. erlang 初体验

    近期測试了一下 erlang的坑... 如不出意外.... 大家第一眼看到这语法... 心里第一句一定是"我擦.这TM都是啥!!!!!" 没有变量!!! 没有结构体!!! 没有循环 ...

  4. 我对国内两大购书站点的感受(dearbook和china-pub)

    我在china-pub和dearbook都是老用户了(china-pub五星,dearbook钻石VIP).说一下近来我对两个站点的感觉. 1. Dearbook和当当合作以后送货速度比china-p ...

  5. mockito中两种部分mock的实现,spy、callRealMethod

    什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现). 为什么需要部分mock? A:当需要测试一个 ...

  6. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

  7. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  8. 【COCOS2D-HTML5 开发之三】演示样例项目附源代码及执行的GIF效果图

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d- ...

  9. SMTP命令 发送邮件 DOS命令

    1.实例:从qq邮箱 发送到其他地址的邮箱 >telnet smtp.qq.com 25 >helo qq.com >auth login >NzI3MTU0MTg3QHFxL ...

  10. 在Windows上使用CodeLite+MinGW+Clang进行开发

    前几天听说clang 3.4已经release了,然后我又手痒就折腾一下,在这里记录一下折腾的经过. 在以前就试过clang-cl+VC的开发环境,编译代码到是没发现什么大问题,有不少警告而已,不过c ...