android打开相册选取图片或打开相机拍照并进行裁剪
16lz
2021-01-26
首先是打开本地相册选取图片:
Intent albumIntent = new Intent(Intent.ACTION_PICK);//打开系统的相册albumIntent.setType("image/*");startActivityForResult(albumIntent, 0x1004);
选取完图片后在onActivityResult编写取数据的操作:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (data==null) {if (isNull) {}else { if (requestCode==0x1004) {//从相册选取图片getClipPhotoByPickPicture(data.getData(),data.getExtras());}}}获得返回数据对图片进行裁剪:
/** * 取得返回的照片信息 * @param uri 传进返回数据的uri * @param bundle 传进返回数据的bundle */private void getClipPhotoByPickPicture(Uri uri, Bundle bundle) {if (uri == null) {/** * */} else {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);// aspectX是宽高的比例,这里设置的是正方形(长宽比为1:1)intent.putExtra("aspectY", 1);intent.putExtra("outputX", 400); // outputX outputY 是裁剪图片宽高intent.putExtra("outputY", 400); //不知怎么了,我设置不能设太大,<640intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);intent.putExtra("return-data", true);intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); startActivityForResult(intent, 0x1006);}}
调用系统相机拍照并裁剪:
boolean isNull=false;//判断照相机返回数据是否为空 Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");File file = new File(Environment.getExternalStorageDirectory()+ "/Elephant/accountImg/accountImg.jpg");if (file.exists()) {file.delete();}//指定uri存储相片getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));isNull = true;startActivityForResult(getImageByCamera, 0x1005);
同样在onActivityResult中编写接收数据,但此时发现,返回的数据为空,此时得多加一个判断:
if (data==null) {if (isNull) {//当返回的data为空,并且isNull为true,说明相机所拍的照片已保存File fileImg = new File(Environment.getExternalStorageDirectory()+ "/Elephant/accountImg/accountImg.jpg");Uri uriFromImg=Uri.fromFile(fileImg);//提取uri//裁剪图片Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uriFromImg, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);// aspectX是宽高的比例,这里设置的是正方形(长宽比为1:1)intent.putExtra("aspectY", 1);intent.putExtra("outputX", 400); // outputX outputY 是裁剪图片宽高intent.putExtra("outputY", 400); //不知怎么了,我设置不能设太大,<640intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, uriFromImg);intent.putExtra("return-data", true);intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, 0x1006);Log.d("logd", "uri后面");isNull=false;}}else {//当data!=null}
同样在onActivityResult中编写,让裁剪后的图片显示在imageView上:
if (requestCode == 0x1006) {//接收裁剪好的图片信息并保存到本地文件夹Bitmap bmap = data.getParcelableExtra("data");iv_show_img.setImageBitmap(bmap);// 图像保存到文件中FileOutputStream foutput = null;try {File fileDir = new File(Environment.getExternalStorageDirectory()+ "/Elephant/accountImg/");if (!fileDir.exists()) {fileDir.mkdirs();}File fileImg = new File(fileDir, "accountImg.jpg");if (fileImg.exists()) {fileImg.delete();}foutput = new FileOutputStream(fileImg);bmap.compress(Bitmap.CompressFormat.JPEG, 50, foutput); // 压缩图片} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (null != foutput) {try {foutput.close();} catch (IOException e) {e.printStackTrace();}}}}
参考:
http://blog.csdn.net/beyond0525/article/details/8939984
http://blog.csdn.net/it_transformers/article/details/42060775#comments
更多相关文章
- 2016~4.12Android(安卓)之图片处理
- android图像绘制(五)——画布保存为图片
- Android控制软键盘的现实与隐藏
- Android中的ImageView的一些有用的属性
- Android(安卓)OOM ,回收布局文件中ImageView占用的内存.Bitmap O
- RadioGroup没有文字只显示图片,图片居中问题
- Android(安卓)Material Design 中的CorrdinatorLayout使用详解
- android 下载图片到本地 sdcard
- Android(安卓)ZoomControls放大缩小图片