图片压缩android,图片压缩方法 手机

Android图片压缩-大小与质量压缩以及图片保存

一、前言:

成都创新互联成立与2013年,是专业互联网技术服务公司,拥有项目网站制作、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元辉南做网站,已为上家服务,为辉南各地企业和个人服务,联系电话:13518219792

2.质量压缩

注意:

第二次压缩之前都要先清空 baos.reset(); 再进行压缩 image.compress(Bitmap.CompressFormat.JPEG, quality, baos);

有时候我们采用质量压缩没有效果,有可能是每次压缩的质量过小,所以我们可以尝试修改压缩质量(quality)是10;

quality压缩机提示,0-100。0表示压缩

小尺寸,100意味着最大质量的压缩。一些

格式,如无损的PNG,将忽略质量设定;

3.混合方式压缩

链接:

说说在 Android 中如何压缩图片

1:ByteArrayOutputStream 压缩图片质量,不会改变图片大小

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 / 1024100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩

baos.reset();//重置baos即清空baos

image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

options -= 10;//每次都减少10        }

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片

return bitmap;

}

2:就是改变图片大小

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);//压缩好比例大小后再进行质量压缩    }

可以自定义大小和像素来进行图片压缩的Android压缩库

老规矩 先上依赖

Add it in your root build.gradle at the end of repositories:

allprojects {

repositories {

...   

maven { url '' }

}

}

dependencies {

implementation 'com.github.asnhkl1:X-CompressImage:1.0.1'

}

背景:

对于一些需要对图片进行定制化压缩的场景,如必须图片必须多少多少K以下,或者分辨率有要求的场景。开发此库。

你可以这样用:

CompressConfig  为建造模式去设置参数

CompressConfig compressConfig = CompressConfig.builder()

            .setUnCompressMinPixel(1000) // 最小像素不压缩,默认值:1000

          .setUnCompressNormalPixel(2000) // 标准像素不压缩,默认值:2000

          .setMaxPixel(1200) // 长或宽不超过的最大像素 (单位px),默认值:1200

          .setMaxSize(200 * 1024) // 压缩到的最大大小 (单位B),默认值:200 * 1024 = 200KB

          .enablePixelCompress(true) // 是否启用像素压缩,默认值:true

          .enableQualityCompress(true) // 是否启用质量压缩,默认值:true

          .enableReserveRaw(false) // 是否保留源文件,默认值:true

          .setCacheDir(path) // 压缩后缓存图片路径,默认值:Constants.COMPRESS_CACHE

          .setShowCompressDialog(true) // 是否显示压缩进度条,默认值:false

          .create();

如果你仅仅只是压缩图片  我们给有默认的参数使用getDefaultConfig()

this.unCompressMinPixel =1000;

this.unCompressNormalPixel =2000;

this.maxPixel =1200;

this.maxSize =204800;

this.enablePixelCompress =true;

this.enableQualityCompress =true;

this.enableReserveRaw =true;

下边就是使用了 。很简单 ,传参加回调

CompressImageManager.build(this,compressConfig, photos, new CompressImage.CompressListener() {

      @Override

      public void onCompressSuccess(ArrayListPhoto var1) {

          Log.i("imageCompress","success");

        //do what you want to do

      }

      @Override

      public void onCompressFailed(ArrayListPhoto var1, String var2) {

          Log.e("imageCompress","false",null);

      }

  }).compress();

git 地址:

欢迎指教,互相学习

Bitmap图片压缩

图片压缩就是为了避免我们内存的溢出。而BitMap是android系统中对图像处理最重要的一个类,所以我们可以用他来对图像进行剪切,压缩,一系列操作。常用的压缩方法有质量压缩,采样率压缩,缩放法压缩,RGB_565压缩等。

质量压缩

质量压缩不会减少图片的像素,他是在保持像素的前提下来改变图片的透明度,但是图片的长,宽,像素都不会变,所以他占用的内存也不会改变。

采样率压缩

采样率压缩其实就是缩放bitamp的尺寸,通过调节其inSampleSize参数,比如调节为2,宽高会为原来的1/2,宽高都减少了,内存自然也就减少了。

缩放法压缩

放缩法压缩使用的是通过矩阵对图片进行裁剪,也是通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样

RGB_565压缩

这是通过压缩像素占用的内存来达到压缩的效果,一般不建议使用ARGB_4444,因为画质实在是辣鸡,如果对透明度没有要求,建议可以改成RGB_565,相比ARGB_8888将节省一半的内存开销。

图片二次采样压缩

1.第一次采样

inJustDecodeBounds设置为ture,只会加载图片的边框,不会加载图片的具体内容。

2.根据原图的宽高,结合控件的宽高计算出缩放比例,然后通过inSamplesize(in 三pou Size)对图片进行尺寸的缩放。

3.二次采样时需要将图片加载出来显示,不能只加载图片的框架,因此inJustDecodeBounds属性要设置为false。

Android黑科技,图片终极压缩

一、支持自定义配置、不失真和批量处理

二、图片上传为什么要压缩

1、图片服务器空间限制,磁盘昂贵

2、网络不稳定,大文件需要断点续传

3、尽可能避免安卓OOM异常

4、后台约定的规则200KB

5、需要上传原图的应用有医院临床项目、金融银行

三、图片压缩流程

1、递归每张图片

2、设置图片格式 Bitmap.CompressFormat.JPG

png, jpg,webp

3、质量压缩bitmap.compress(format,quality,baos)

由于png是无损压缩,所以设置quality无效(不适合作为缩略图)

采样率压缩BitmapFactory.Options.inSampleSize

缩小图片分辨率,减少所占用磁盘空间和内存大小

缩放压缩canvas.drawBitmap(bitmap, null,rectF,null)

减少图片的像素,降低所占用磁盘空间大小和内存大小,可用于缓存缩略图

JNI调用JPEG库

Android的图片引擎使用的是阉割版的skia引擎,去掉了图片压缩中的哈夫曼算法

4、像素修复

5、返回压缩

6、完成压缩

demo:

参考:

Luban框架

缺点

1、当没有设定压缩路径时,抛异常无闪退

2、源码中,压缩比率固定值60,无法修改

3、压缩配置,参数不太适应真实项目需求

4、不能指定压缩大小,比如100KB以内

android图片压缩避免OOM

简单吹下牛:很多app都会要加载图片,但是如果不压缩图片就很容易OOM,

个人看来OOM 出现原因总的来说分为两种:

一种是内存溢出(好像在扯淡,OOM本身就是内存溢出)

另一种是:图片过大,一个屏幕显示不完全造成,似乎也是一。。 如有错误纯属扯淡;

为了避免上面的情况:加载图片的时候可以进行压缩,上传的时候要可以进行压缩,在图片不可见的时候进行回收(onDetach()),再吹一句 用了fresco+压缩之后加载图片完全没问题了。

一、质量压缩方法:

privateBitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos =newByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

intoptions =100;

while( baos.toByteArray().length /1024100) {//循环判断如果压缩后图片是否大于100kb,大于继续压缩

baos.reset();//重置baos即清空baos

image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

options -=10;//每次都减少10

}

ByteArrayInputStream isBm =newByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

Bitmap bitmap = BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream数据生成图片

returnbitmap;

}

二、图片按比例大小压缩方法(根据Bitmap图片压缩)

privateBitmap comp(Bitmap image) {

ByteArrayOutputStream baos =newByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,100, baos);

if( baos.toByteArray().length /10241024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出

baos.reset();//重置baos即清空baos

image.compress(Bitmap.CompressFormat.JPEG,50, baos);//这里压缩50%,把压缩后的数据存放到baos中

}

ByteArrayInputStream isBm =newByteArrayInputStream(baos.toByteArray());

BitmapFactory.Options newOpts =newBitmapFactory.Options();

//开始读入图片,此时把options.inJustDecodeBounds 设回true了

newOpts.inJustDecodeBounds =true;

Bitmap bitmap = BitmapFactory.decodeStream(isBm,null, newOpts);

newOpts.inJustDecodeBounds =false;

intw = newOpts.outWidth;

inth = newOpts.outHeight;

//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为

floathh = 800f;//这里设置高度为800f

floatww = 480f;//这里设置宽度为480f

//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

intbe =1;//be=1表示不缩放

if(w  h  w  ww) {//如果宽度大的话根据宽度固定大小缩放

be = (int) (newOpts.outWidth / ww);

}elseif(w  h  h  hh) {//如果高度高的话根据宽度固定大小缩放

be = (int) (newOpts.outHeight / hh);

}

if(be =0)

be =1;

newOpts.inSampleSize = be;//设置缩放比例

//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

isBm =newByteArrayInputStream(baos.toByteArray());

bitmap = BitmapFactory.decodeStream(isBm,null, newOpts);

returncompressImage(bitmap);//压缩好比例大小后再进行质量压缩

}


本文题目:图片压缩android,图片压缩方法 手机
网址分享:http://hbruida.cn/article/hooeso.html