首页 > 娱乐前沿 > 热点
Android图片压缩实现过程及代码
佚名 2016-01-07 08:30:16

android图片压缩无非两种,一种质量压缩,一种像素压缩,前者多用于图片上传时,后者多用于本地图片展示缩略图时。

对于质量压缩,主要用到的一个方法就是:

publicbooleancompress(CompressFormatformat,intquality,OutputStreamstream){}

这是Bitmap类里的一个方法,第一个参数表示图片压缩的格式,android中提供了以下格式:

publicenumCompressFormat{
JPEG(0),
PNG(1),
WEBP(2);
CompressFormat(intnativeInt){
this.nativeInt=nativeInt;
}
finalintnativeInt;
}

第二个参数表示压缩的质量,注意这个是压缩的关键,它的取值是0到100,越小表示压缩的越厉害,第三个参数表示把压缩的数据写入了outputstream流中。

OK,来看一个例子:

publicbyte[]compressBitmap(Bitmapbitmap,intmax){
intquality=100;
ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,quality,byteArrayOutputStream);
while(byteArrayOutputStream.toByteArray().length/1024>max){
byteArrayOutputStream.reset();
quality=quality-10;
bitmap.compress(Bitmap.CompressFormat.JPEG,quality,byteArrayOutputStream);
}
returnbyteArrayOutputStream.toByteArray();
}

这个方法的第一个参数不必解释,第二个参数表示你要求的压缩后图片最大可以是多少。最后可以拿到一个byte数组。我们有了这个byte数组就可以转化为file或者bitmap。

注意这种质量压缩后,像素本身没有改变。

对于像素压缩,顾名思义就是压缩像素。这里用到的一个主要的方法就是:

publicstaticBitmapdecodeFile(StringpathName,Optionsopts){
Bitmapbm=null;
InputStreamstream=null;
try{
stream=newFileInputStream(pathName);
bm=decodeStream(stream,null,opts);
}catch(Exceptione){
/*donothing.
Iftheexceptionhappenedonopen,bmwillbenull.
*/
Log.e("BitmapFactory","Unabletodecodestream:"+e);
}finally{
if(stream!=null){
try{
stream.close();
}catch(IOExceptione){
//donothinghere
}
}
}
returnbm;
}

这是BitmapFactory中的一个静态方法,第一个参数表示file的全路径,第二个参数是关键,Options是BitmapFactory类中的一个静态内部类,它有两个非常重要的属性:

/**
*Ifsettotrue,thedecoderwillreturnnull(nobitmap),but
*theout...fieldswillstillbeset,allowingthecallertoquery
*thebitmapwithouthavingtoallocatethememoryforitspixels.
*/
publicbooleaninJustDecodeBounds;
/**
*Ifsettoavalue>1,requeststhedecodertosubsampletheoriginal
*image,returningasmallerimagetosavememory.Thesamplesizeis
*thenumberofpixelsineitherdimensionthatcorrespondtoasingle
*pixelinthedecodedbitmap.Forexample,inSampleSize==4returns
*animagethatis1/4thewidth/heightoftheoriginal,and1/16the
*numberofpixels.Anyvalue<=1istreatedthesameas1.Note:the
*decoderusesafinalvaluebasedonpowersof2,anyothervaluewill
*beroundeddowntothenearestpowerof2.
*/
publicintinSampleSize;

第一个属性inJustDecodeBounds,如果设置为ture,则返回null。

第二个属性inSampleSize表示缩放比例,大于1表示缩小了原来的多少,比如inSampleSize == 4,就表示缩小了原来的四分之一,如果小于1则和1相同。

好了来看看这个网上遍地都是的一个像素压缩的方法:

privateBitmapgetimage(StringsrcPath){
BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds设回true了
newOpts.inJustDecodeBounds=true;
Bitmapbitmap=BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
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了
bitmap=BitmapFactory.decodeFile(srcPath,newOpts);
returnbitmap;
}

是不是就很好理解了。

上一篇  下一篇

I 相关 / Other

GradleforAndroid第三篇(依赖管理)

依赖管理依赖管理是Gradle最闪耀的地方,最好的情景是,你仅仅只需添加一行代码在你的build文件,Gradle会自

GradleforAndroid第四篇(构建变体)

当你在开发一个app,通常你会有几个版本。大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后

GradleforAndroid第五篇(多模块构建)

Android studio不仅允许你为你的app和依赖库创建模块,同时也可为Android wear,Android TV,Google App En

Android程序员必须掌握的三种自动化测试方法

在日常的开发中,尤其是app开发,因为不像web端那样 出错以后可以热更新,所以app开发 一般对软件质量有更高

最全面的2015年全球程序员研究报告

前言开发者调查是Stack Overflow 每年都要进行的一次开发者用户调查问卷活动,调查对象为在 Stack Overflow

I 热点 / Hot