Android图片压缩实现过程及代码
2016-01-07 08:30:16 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:Android图片压缩实现过程及代码

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;
}

是不是就很好理解了。

tags:

上一篇  下一篇

相关:

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

杨佩洁30岁庆生 许愿使坏

言言(左)帮杨佩洁庆生。(鸿言娱乐提供) 导演叶天伦(右)及言言(左起)帮杨佩洁庆生。(鸿言娱乐提供) 演员杨

2015年最流行的10个Linux发行版

本文由玩赚乐(www.banghui.org)– 蒋丽丽原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划

方舲穿神V内衣吸爆眼球 走秀惊魂糗Hold不住Nu Bra

方舲穿粉色内衣加小短裤,诠释运动时也可以很性感。(张祐铭摄) 方舲练肌健健美。(取材自脸书) 伊林娱

廖芳洁《十点不一样》10年有成

廖芳洁在播报前习惯先分析新闻,并亲自撰写每则新闻稿头导言。 TVBS《十点不一样》播出届满10年,除培养出

小猪Pose王 王大陆甘拜下风

? 1995 - 2016 China Times Inc. 请尊重智慧财产权勿任意转载违者依法必究。

站长推荐: