优就业Android教程Android图片压缩实现过程及代码Word文档格式.docx
《优就业Android教程Android图片压缩实现过程及代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《优就业Android教程Android图片压缩实现过程及代码Word文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
![优就业Android教程Android图片压缩实现过程及代码Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/30/d5bc6317-8551-4910-a72e-c44532367062/d5bc6317-8551-4910-a72e-c445323670621.gif)
this.nativeInt=nativeInt;
}
finalintnativeInt;
第二个参数表示压缩的质量,注意这个是压缩的关键,它的取值是0到100,越小表示压缩的越厉害,第三个参数表示把压缩的数据写入了outputstream流中。
OK,来看一个例子:
publicbyte[]compressBitmap(Bitmap
bitmap,intmax){
intquality=100;
ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();
press(Bitmap.CompressFormat.JPEG,quality,byteArrayOutputStream);
while(byteArrayOutputStream.toByteArray().length/1024>
max){
byteArrayOutputStream.reset();
quality=quality-10;
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){
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>
hh){//如果高度高的话根据宽度固定大小缩放
be=(int)(newOpts.outHeight/hh);
if(be<
=0)
be=1;
newOpts.inSampleSize=be;
//设置缩放比例
//重新读入图片,注意此时已经把options.inJustDecodeBounds设回false了
bitmap=BitmapFactory.decodeFile(srcPath,newOpts);
returnbitmap;
这样就完成了。