Android拍照、相册选取、裁剪图片综合Demo

《Android相机、相册获取图片显示并保存到SD卡》中说明了在直接调用Android相机拍照时返回Bitmap所引发的一个问题。今天,把在上篇附上的Demo加强了一下,增加了截图的功能。具体需求是:拍照或相册选取完毕后,先进入系统裁剪界面,裁剪完毕后再显示或保存图片,下面看下截图部分所要调用的代码:

//截取图片
	public void cropImage(Uri uri, int outputX, int outputY, int requestCode){
		//裁剪图片意图
		Intent intent = new Intent("com.android.camera.action.CROP");  
        intent.setDataAndType(uri, "image/*");  
        intent.putExtra("crop", "true");
        //裁剪框的比例,1:1
        intent.putExtra("aspectX", 1);  
        intent.putExtra("aspectY", 1);
        //裁剪后输出图片的尺寸大小
        intent.putExtra("outputX", outputX);   
        intent.putExtra("outputY", outputY);
        //图片格式
        intent.putExtra("outputFormat", "JPEG");
        intent.putExtra("noFaceDetection", true);
        intent.putExtra("return-data", true);  
	    startActivityForResult(intent, requestCode);
	}

例如,从相册选择图片后先调用裁剪功能代码如下:

Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
openAlbumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(openAlbumIntent, REQUEST_CODE);

接下来在onActivityResult里面对裁剪后的图片进行处理,调用上面的cropImage()方法,将URI传入,500是指定裁剪后图片的尺寸,最后一个参数为标识码:

Uri uri = data.getData();
cropImage(uri, 500, 500, CROP_PICTURE);

处理裁剪后的图片就和之前一样,这里只贴出代码片段仅供参考:

case CROP_PICTURE:
	Bitmap photo = null;
	Uri photoUri = data.getData();
	if (photoUri != null) {
	     photo = BitmapFactory.decodeFile(photoUri.getPath());
	}
	if (photo == null) {
		Bundle extra = data.getExtras();
		if (extra != null) {
		     photo = (Bitmap)extra.get("data");  
		     ByteArrayOutputStream stream = new ByteArrayOutputStream();  
		     photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);
		}  
	}
	iv_image.setImageBitmap(photo);
break;

在制作这个Demo中发现一个问题,由于在处理拍照显示和裁剪这个过程中,我采取的方法是先将拍照后的图片保存在SD卡,然后再取出来进行处理,直接拍照并显示没有出现问题,但在拍照后裁剪时,发现每次传入裁剪界面的图片都是之前第一次拍的,进入SD卡也检查了,存放的临时图片也确实是我刚拍摄的,但是显示的却始终是之前第一次拍的,这里迷惑到我了。索性没有去管了,先解决问题再说(希望发现这个问题的朋友能提出改进方法)。既然在裁剪时我传入的图片名字都一样,那干脆就换一个名字,所以我每次用System.currentTimeMillis()来作为临时图片文件名,显示或处理完成后,再将该临时文件删除。Demo中还附上了一个关于图片和SD卡操作的工具类ImageTools.java作为赠品。最后功能还是实现了,但是还有很大的优化空间。先提出问题,感兴趣的同学可以下载Demo并改进,后续我会继续整理一些Demo然后开源到Github上,欢迎大家持续支持、改进。


界面截图:(相册选取时,选择的是小弟半裸球场照大笑


附上Demo下载地址:点击下载

作为辛苦劳动成果,设置了3分的下载小费,没分的同学可以想办法获取积分,好的社区需要大家一同建设,杜绝伸手党!


加入我们的或微信公众账号请查看: Ryan's zone公众账号及


觉得文章对你有用,点击右下角的转发按钮分享给更多人!

同时欢迎关注我的新浪微博和我交流:@唐韧_Ryan


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Android拍照或者从相册选取图片加载在imageview上的具体步骤: 1. 在AndroidManifest.xml文件中添加相机和存储权限: ``` <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 在布局文件中添加一个ImageView: ``` <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 3. 在Activity中定义以下变量: ``` private static final int REQUEST_IMAGE_CAPTURE = 1; private static final int REQUEST_IMAGE_PICK = 2; private ImageView imageView; private Uri imageUri; ``` 4. 在需要拍照或者从相册选取图片的地方,添加以下代码: 拍照: ``` Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { File photoFile = null; try { photoFile = createImageFile(); } catch (IOException e) { e.printStackTrace(); } if (photoFile != null) { imageUri = FileProvider.getUriForFile(this, "com.example.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } ``` 从相册选取图片: ``` Intent pickPhotoIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(pickPhotoIntent, REQUEST_IMAGE_PICK); ``` 5. 在Activity中添加以下方法: ``` @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == REQUEST_IMAGE_CAPTURE) { imageView.setImageURI(imageUri); } else if (requestCode == REQUEST_IMAGE_PICK) { imageUri = data.getData(); imageView.setImageURI(imageUri); } } } private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File imageFile = File.createTempFile(imageFileName, ".jpg", storageDir); return imageFile; } ``` 以上就是Android拍照或者从相册选取图片加载在ImageView上的完整代码,希望可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值