一、问题描述
android取相册或者调用摄像头拍照的图片,经过裁剪保存的时候,报错“无法保存裁剪图片”。(在Nexus5机器上出现)
二、解决过程
由于Nexus5机器上也只是部分图片出现这样的情况。比对2种图片发现,一个小于1M一个大于1M。所以尝试把大图进行一下压缩,再去裁剪,问题解决。
三、具体代码
<pre name="code" class="java">//裁剪函数 public void startPhotoZoom(Uri uri) { //有些损毁的图片,会导致闪退 if (uri.toString().equals("file:///")){ Toast toast = Toast.makeText(this, "此文件不可用", Toast.LENGTH_SHORT); toast.show(); return; } Bitmap bitmap = null; try { bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //这里做了判断 如果图片大于 512KB 就进行压缩 if(bitmap.getRowBytes()*bitmap.getHeight() > 512*1024){ bitmap = compressImage(bitmap); uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null,null)); } Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, IMAGE_UNSPECIFIED); intent.putExtra("crop", "true"); intent.putExtra("aspectX",bitmap.getWidth() ); // intent.putExtra("aspectY",bitmap.getHeight()); // intent.putExtra("outputX", 175); intent.putExtra("outputY", 175); intent.putExtra("outputFormat", "PNG");// 图片格式 intent.putExtra("return-data", true); startActivityForResult(intent, PHOTORESOULT); } //图片压缩 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 / 1024>200) { //循环判断如果压缩后图片是否大于200kb,大于继续压缩 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; }
<p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>