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. 言未及之而言,谓之躁;言及之而不言,谓之隐;未见颜色而言,谓之瞽(gǔ)

    前言 一个高效的团队离不开leader和组员之前,组员和组员之前的通力合作.而合作的基础便是彼此之间的商讨与协调,意见的统一,进而在达成共识的前提下行动.那么如何才能和组员达成共识呢? 和组员之间的沟 ...

  2. cglib源码学习交流

    背景 前段时间在工作中,包括一些代码阅读过程中,spring aop经常性的会看到cglib中的相关内容,包括BeanCopier,BulkBean,Enancher等内容,以前虽大致知道一些内容,原 ...

  3. oschina应用工具

    应用工具 22思维导图软件 9博客客户端 15加密/解密/破解 120浏览器 78邮件工具 327文档/文本编辑 31杀毒软件 177终端/远程登录 195IM/聊天/语音工具 74下载工具 64文件 ...

  4. 基于visual Studio2013解决算法导论之042单源最短路径

     题目 单源最短路径 解决代码及点评 // 26单源最短路径bellmanford.cpp : 定义控制台应用程序的入口点. // #include <iostream> #incl ...

  5. mongodb副本集自动切换修复节点解决方案

    副本集部署 1.启动mongod 在每台运行mongod服务的机器上增加配置文件/etc/mongodb-rs.conf,内容为: [root@MongodbF-A etc]# vi /etc/mon ...

  6. Spark Core源代码分析: Spark任务模型

    概述 一个Spark的Job分为多个stage,最后一个stage会包含一个或多个ResultTask,前面的stages会包含一个或多个ShuffleMapTasks. ResultTask运行并将 ...

  7. Storm 配置图文解析

    Storm 配置图文解析 參考阅读:http://www.xiaofateng.com/? p=959 ============================== | sample-topology ...

  8. 第三方系统打开EAFC的实现

    前言:EAFC是我们公司的一个框架,一个项目上,客户的OA系统要调用我们推送过去的代办任务,希望能打开我们的代办处理界面,我们的代办处理界面是winform的.引出给出了以下的一个方案.在此备存. - ...

  9. HDOJ 1272 并查集 不相同父节点

    判断两点:1.任何2点的父节点不能相同->否则会导致2点间有多条通路2.所有点只有1个集合 存在一个小坑,就是第一次输入 0 0 的时候,应该输出 Yes , 否则会WA MY AC Code ...

  10. 判断程序是否在VMWare内运行

    现在有许多用户都喜欢用虚拟机来测试他们的软件,以避免对真实机器环境造成损害.但是在虚拟机中,有些功能是受限,甚至不可能完成的,因此,需要在程序中判断虚拟机的环境,如果程序在虚拟机内运行,则就要把虚拟机 ...