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. docker学习笔记18:Dockerfile 指令 VOLUME 介绍

    在介绍VOLUME指令之前,我们来看下如下场景需求: 1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上.一旦容器删除后,这些数 ...

  2. 基于visual Studio2013解决算法导论之051区间树

     题目 区间树 解决代码及点评 #include <stdio.h> #include <string.h> #include <iostream> #def ...

  3. Linux 下IOport编程訪问

    曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...

  4. 距离变换DT

    距离变换:计算区域中的每个点与最接近的区域外的点之间距离,把二值图象变换为灰度图象. 对于目标中一个点,距离变换的定义为改点与目标边界最近的距离. 目标点离边界约近则值越小,转换的点越暗:越远,值越大 ...

  5. C#反射 入门学习 01

    前言     获取方法的相关信息的两种形式 反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象: 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法 ...

  6. java--内部类访问final成员

    局部类只能访问外包方法中的final成员.位于方法内部的局部类,可以访问局部类之外,外包方法之内的所以变量和方法,但是生命周期不同,延长生命周期的办法就是将变量设置为final类型. 1)从程序设计语 ...

  7. 【转】java--final

    1.final数据 许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”.常数主要应用于下述两个方面: (1) 编译期常数,它永远不会改变 (2) 在运行期初始化的一个值,我们不希望它发生变化 ...

  8. 演练5-3:Contoso大学校园管理系统3

    在前面的教程中,我们使用了一个简单的数据模型,包括三个数据实体.在这个教程汇中,我们将添加更多的实体和关系,按照特定的格式和验证规则等自定义数据模型. Contoso大学校园管理系统的数据模型如下. ...

  9. android一个页面上多个listview

    android一个页面上多个listview,在滚动的时候,需要两个listview能够一起滚动,看起来是一个view. 这个功能的具体实现,参考: http://blog.csdn.net/xia2 ...

  10. java设计模式之——适配器模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...