笔记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
- 笔记111--调用相机并裁剪,从相册截图。及原理分析
- 调用相机,相册,裁剪
- iOS 从相机或相册获取图片并裁剪
- iOS 从相机或相册获取图片并裁剪
- Android从相机、相册选择图片并裁剪
- iOS 从相机或相册获取图片并裁剪
- Android 从相机或相册获取图片并裁剪
- Android选择图片(从相册或相机)并裁剪
- Android调用相册或相机拍照选取照片并裁剪
- iOS 调用相机 ,相册获取图片 并裁剪为正方形
- Android调用相册或相机拍照选取照片并裁剪
- Android调用相册或相机拍照选取照片并裁剪
- 打开相册/相机 并裁剪
- 调用相机相册+裁剪功能
- Android调用相机实现拍照并裁剪图片,调用手机中的相册图片并裁剪图片
- 实现调用相机并裁剪,调用相册并裁剪的功能
- iOS从相机或相册获取图片并裁剪,再获取裁剪后的图片
- 跳转相机相册并进行裁剪
- Struts2高危漏洞分析和解决方案
- Project Euler:Problem 45 Triangular, pentagonal, and hexagonal
- leetcode--Same Tree
- SpringMVC学习(一)
- Kafka(二):环境搭建&测试
- 笔记111--调用相机并裁剪,从相册截图。及原理分析
- AndroidUI:Android的Holo Theme
- 自定义drawable
- Hibernate - is not mapped
- 解决phpmyadmin上传文件大小的限制
- Android Virtual Devices
- Adaboost 算法的原理与推导
- Stream自行总结的技巧,如果设置一个字节数组接收一个未知长度的流Stream
- 《学生在线学习系统》开发心得