拍照或者相册图片裁剪后返回图片

转载: http://www.cnblogs.com/w-y-f/p/4028379.html

首先展示 相机的:

    打开相机:打开相机之前要在intent中  定义字段 MedisStore.EXTRA_OUTPUT ,值为拍照后存照片的路径。  首先定义存相机拍照的照片的路径 ,这个路径你可以存在你想存的地方, 接下来是定义照片的名字 ,这里取 当前系统时间+.jpg 作为照片名称 

      照片的路径=  文件夹路径+ 文件名+ .jpg ;

public void openCamare() {
    String state = Environment.getExternalStorageState();
    if (state.equals(Environment.MEDIA_MOUNTED)) {
        String aa = path + "mass/";
        File file = new File(aa);
        if (!file.exists()) {
            file.mkdir();
        }
        String fileName = getPhoneFileName() + ".jpg";
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        phoneUri = Uri.fromFile(new File(aa + fileName));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, phoneUri);
        startActivityForResult(intent, REQUEST_CAMERA);
    }
}

相机 中的 图片 返回 onActivityResult 中:

case REQUEST_CAMERA://相机返回的图片

  Uri uri = null;

    if (data != null && data.getData() != null) {
        uri = data.getData();}
    if (uri == null) {
        if (phoneUri != null) {
            uri = phoneUri;}}
    //imgPhone.setImageURI(uri);
    camCropUri = uri;
    cropImageUri(uri, 400, 400, REQUEST_XIANGJI);

  注意 ,这里返回的 data.getData( )可能是 空的,如果是空的,可以取上面 存储的phoneUri ,uri 类似 File 。可以通过uri找到 图片。 

相机对应的 裁剪方法:

     void cropImageUri(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");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", outputX);
    intent.putExtra("outputY", outputY);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    intent.putExtra("return-data", false);//这里是 false的 话 ,返回 Uri ,若为true的则返回小的 bitmap
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", true); // no face detection
    startActivityForResult(intent, requestCode);
}

对应的 onActivityResult 中 裁剪之后的图片的返回  

case REQUEST_XIANGJI://相机图片 的 裁剪
    Toast.makeText(this, "返回相机裁剪的图片", Toast.LENGTH_SHORT).show();
    imgPhone.setImageURI(camCropUri);
    break;

其中 打开裁剪的 intent中 ,一个参数 return-data,值为 true ,则返回 小图bitmap; 值为false 则返回 uri ,uri可以记录操作,还要注意一下 字段   outputFormat

如果对 URI 足够了解的话,应该知道 URI与File 相似,你所有的操作如裁剪将数据都保存在 URI中,你已经持有了相应的URI,也就无需多此一举,在返回bitmap了

相册 返回裁剪的图片也是这样 。 Android 4.4 之后,相册返回的Uri 是经过封装的,这个Uri 应该经过处理一下, 

代码如下:

/**
* android 4.4以上的Uri 返回形式如下:
* content://com.android.providers.media.documents/document/image%3A8302
* content://com.android.providers.downloads.documents/document/5
* content://media/external/images/media/8302
* 我们不能直接通过前两种Uri直接获取到对应的表,所以需要翻译一下
* 这个方法是 给 相册返回的 uri 使用的
*/
private String handleImageOnKitKat(Uri uri) {
String imagePath = null;
if (DocumentsContract.isDocumentUri(this, uri)) {//第一种处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
Log.i(">>>>>", uri.toString());
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {//第二种,处理
Log.i(">>>>>", uri.toString());
Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
Log.d(">>>>>", "content: " + uri.toString());
imagePath = getImagePath(uri);
}
Log.i(">>>>>>", "imagePath" + imagePath);
return imagePath;
}

打开相机或者相册 获取  对应返回图片的 Uri ,然后 把uri 传递到裁剪方法中 ,然后 打开裁剪框,裁剪之后  回调onActivityResult ,在 裁剪回调中获取 裁剪之后的图片 ,完成这一操作。

好了 ,打开相机和相册的裁剪说到这里



参考:http://www.cnblogs.com/w-y-f/p/4028379.html



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值