图片压缩大小清晰度测试

2025-04-13 05:34:33

1、需求:昨天客户发来需求说app里面图片不清晰,需要修改图片清晰度。

2、原因:之前的代码由于app的图片要上传到图片服务器,为了节省流量和减少上传时的耗时,所以图片应该尽量小,但却导致了图片不清晰。

3、解决思路:好吧,问题来了,如何找一个让客户满意,图片大小和清晰度合适的参数呢? 我想了下,写了个测试工具给客户,让客户自己选择,希望这个工具对大家都有用。 图片压缩,可以看做是分辨率和压缩率的结合;

4、具体操作:先设置分辨率大小,压缩率大小,建议压缩率30 不失真,拍照获取图片,可以通过具体设置的路径,查看原始图片和压缩过的图片大小和清晰度。看核心代码:bt_pic.setOnClickListener(newOnClickListener(){ @OverridepublicvoidonClick(Viewv){ captureImage(MainActivity.this,IMAGE_CAPTURE);//拍照 }});

5、调用系统拍照:publicvoidcaptureImage(Activityactivity,intrequestCode){Intentintent=newIntent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); Filephoto=newFile(getTempDirectoryPath(activity),TMP_IMAGE);//临时存放的原始图片,按现在手机的分辨率,一般都有1M以上大小 intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo)); activity.startActivityForResult(intent,requestCode);}

6、获取临时存放文件夹路径 :protectedstaticStringgetTempDirectoryPath(Contextctx){Filecache=null; //存放在外部存储(此目录查看原始图片)if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){cache=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Android/data/"+ctx.getPackageName()+"/cache1/");}//存放在内部存储else{cache=ctx.getCacheDir();} //创建文件夹if(!cache.exists()){cache.mkdirs();} returncache.getAbsolutePath();}

7、重写onActivityResult方法,处理拍照得到的图片,压缩,打水印,保存等,处理结果result为true,就适配和显示图片。protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(resultCode==Activity.RESULT_OK){if(requestCode==IMAGE_CAPTURE){//拍照createTime=getDateFormatForFile();imageFile=fileDirStr+createTime+".jpg";booleanresult=handlePictureAndWatermarkForIntent(this,data,imageFile,getCurrentTime()+"来自百度分享",width.getText().toString().trim(),height.getText().toString().trim());if(result){addAttach(imageFile,AttachInfo.JPG_TYPE);}else{Toast.makeText(this,"获取图片失败,请重试!",Toast.LENGTH_LONG).show();}}}super.onActivityResult(requestCode,resultCode,data);}

8、获取图片并打水印 :publicbooleanhandlePictureAndWatermarkForIntent(Activityactivity,Intentdata,Stringfile,intwidth,intheight,Stringmark){booleanresult=false;Bitmapbitmap=handlePictureForIntent(activity,data,width,height);if(bitmap!=null){bitmap=watermark(bitmap,mark);try{saveBitmap(file,bitmap,compression_ratio.getText().toString().trim());result=true;}catch(IOExceptione){e.printStackTrace();}finally{if(bitmap!=null){bitmap.recycle();bitmap=null;}}}returnresult;}

9、获取系统拍照返回的图片:publicstaticBitmaphandlePictureForIntent(Activityactivity,Intentdata, intwidth,intheight){ Bitmapbitmap=null; //从文件中获取bitmap,临时的原始图片(几M) StringtmpFile=getTempDirectoryPath(activity)+File.separator+TMP_IMAGE;bitmap=handlePictureForFile(tmpFile,width,height); returnbitmap;}

10、处理文件图片 :publicstaticBitmaphandlePictureForFile(Stringfile,intwidth,足毂忍珩intheight){Bitmapbitmap=null;finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();//只获取图片大小options.inJustDecodeBounds=true;BitmapFactory.decodeFile(file,options);//获取bitmapoptions.inJustDecodeBounds=false;options.inSampleSize=Math.max(options.outWidth/width,options.outHeight/height);bitmap=BitmapFactory.decodeFile(file,options);if(bitmap!=null&&bitmap.getWidth()>bitmap.getHeight()){//旋转图片bitmap=rotateBitmap(bitmap,90);}returnzoomBitmap(bitmap,width,height);}

11、保存压缩图片:publicstaticvoidsaveBitmap(Stringfile,Bitmapbitmap,Stringcompression_ratio)throwsIOException{//压缩图片并保存至文件Filephoto=newFile(file);Stringdir=photo.getParent();if(dir!=null){newFile(dir).mkdirs();}if(!photo.exists()){photo.createNewFile();}FileOutputStreamoutStream=newFileOutputStream(photo);bitmap.compress(CompressFormat.JPEG,Integer.valueOf(compression_ratio),outStream);outStream.flush();outStream.close();}

12、通过以上方法可以查看:Environment.getExternalStorageDirectory().getAbsolutePath()+"/Android/data/"+ctx.getPackageName()+"/cache1/"路径下的原始图片大小清晰度。和查看Environment.getExternalStorageDirectory()+getResources().getString(R.string.kdumpda_filepath)+"/"+getDateFormatForFile()+"/"压缩过后的图片大小和清晰度。demo路径:https://pan.baidu.com/s/1o8AZtV0?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢