笔记111--调用相机并裁剪,从相册截图。及原理分析

来源:互联网 发布:ubuntu下php环境搭建 编辑:程序博客网 时间:2024/06/08 01:51
一、调用相机拍照
1、启动相机

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, TAKE_PHOTO_WITH_DATA);

2、在onActivityResult中获取返回数据

Bitmap photo = data.getParcelableExtra("data");

二、裁剪处理

调用时机:启动相机拍完照后,再调用裁剪处理。

 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setType("image/*"); intent.putExtra("data", data); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 128); intent.putExtra("outputY", 128); intent.putExtra("return-data", true); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);

三、调用相机返回原图

调用相机拍照返回的是拍照生成的缩略图,如果要获取原图,还需要一番折腾。其原理是:启动相机拍照后,将图片保存在指定路径,然后再onActivityResult()中再获取图片即可。

当然了,需要验证手机是否有SD卡~~

<pre name="code" class="java">public void onClick(View v) { //先验证手机是否有sdcard String status=Environment.getExternalStorageState(); if(status.equals(Environment.MEDIA_MOUNTED)) { try { File dir=new File(Environment.getExternalStorageDirectory() + "/"+localTempImgDir); if(!dir.exists())dir.mkdirs(); Intent intent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); File f=new File(dir, localTempImgFileName);//localTempImgDir和localTempImageFileName是自己定义的名字 Uri u=Uri.fromFile(f); intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0); intent.putExtra(MediaStore.EXTRA_OUTPUT, u); startActivityForResult(intent, GET_IMAGE_VIA_CAMERA); } catch (ActivityNotFoundException  e) { Toast.makeText(ImpromptuActivity.this, "没有找到储存目录",Toast.LENGTH_LONG).show();  } }else{ Toast.makeText(ImpromptuActivity.this, "没有储存卡",Toast.LENGTH_LONG).show(); } }<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
onActivityResult()中:

@Override   protected void onActivityResult(int requestCode, int resultCode, Intent data) {   if(resultCode==RESULT_OK ) {           switch(requestCode) {           case GET_IMAGE_VIA_CAMERA:               File f=new File(Environment.getExternalStorageDirectory() +"/"+localTempImgDir+"/"+localTempImgFileName);               try {                   Uri u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),                   f.getAbsolutePath(), null, null));                   //u就是拍摄获得的原始图片的uri,剩下的你想干神马坏事请便……               } catch (FileNotFoundException e) {                   e.printStackTrace();               }               break;           }   }   super.onActivityResult(requestCode, resultCode, data);   }

大头戏来了

转自:http://www.cnblogs.com/jun-it/articles/2881826.html#commentform

一、裁剪图片的Intent附件参数的具体意义


看下三个极为重要的选项:data、MediaStore.EXTRA_OUTPUT以及return-data。

二、原理介绍。

data和MediaStore.EXTRA_OUTPUT都是可选的传入数据选项,你可以设置data为Bitmap,或者将相应的数据与URI关联起来,你也可选择是否返回数据(return-data)。

常见用法:

1)使用Bitmap并返还数据。return-data设为true,你将获得一个与内部数据关联的action,并且bitmap以此方法返回:extras.getParcelabel("data")。如果你最终要获取的图片比较大,那么不建议用此方法。

Bundle myExtras = getIntent().getExtras();if (myExtras != null && (myExtras.getParcelable("data") != null || myExtras.getBoolean("return-data"))){    Bundle extras = new Bundle();    extras.putParcelable("data", croppedImage);    setResult(RESULT_OK,(new Intent()).setAction("inline-data").putExtras(extras));    finish();}
2)使用URI返回数据。return-data为false,那么在onActivityResult()中你将不会接收到任何Bitmap,你需要将MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap的。但是有些条件,首先你需要一个短暂的与此uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。
if (mSaveUri != null) {    OutputStream outputStream = null;    try {        outputStream = mContentResolver.openOutputStream(mSaveUri);        if (outputStream != null) {            croppedImage.compress(mOutputFormat, 75, outputStream);        }    } catch (IOException ex) {        // TODO: report error to caller        Log.e(TAG, "Cannot open file: " + mSaveUri, ex);    } finally {        Util.closeSilently(outputStream);    }    Bundle extras = new Bundle();    setResult(RESULT_OK, new Intent(mSaveUri.toString()).putExtras(extras));}
简而言之,截大图用URI,小图用Bitmap。

三、相册截图
1、从相册截大图

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);intent.setType("image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 2);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 600);intent.putExtra("outputY", 300);intent.putExtra("scale", true);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, CHOOSE_BIG_PICTURE);

2、从相册截小图
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);intent.setType("image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 2);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 200);intent.putExtra("outputY", 100);intent.putExtra("scale", true);intent.putExtra("return-data", true);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, CHOOSE_SMALL_PICTURE);
3、onActivityResult()处理返回的数据

switch (requestCode) {case CHOOSE_BIG_PICTURE: Log.d(TAG, "CHOOSE_BIG_PICTURE: data = " + data);//it seems to be null if(imageUri != null){  Bitmap bitmap = decodeUriAsBitmap(imageUri);//decode bitmap  imageView.setImageBitmap(bitmap); } break;case CHOOSE_SMALL_PICTURE: if(data != null){  Bitmap bitmap = data.getParcelableExtra("data");  imageView.setImageBitmap(bitmap); }else{  Log.e(TAG, "CHOOSE_SMALL_PICTURE: data = " + data); } break;default: break;} private Bitmap decodeUriAsBitmap(Uri uri){ Bitmap bitmap = null; try {  bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); } catch (FileNotFoundException e) {  e.printStackTrace();  return null; } return bitmap;}

四、拍照截图

1、





0 0
原创粉丝点击