当前位置: 首页 > 知识库问答 >
问题:

在Android Lollipop中从Uri裁剪照片后返回的总是空?

权玉泽
2023-03-14
public static void cropImage(Uri uri, Activity activity, int action_code) {
    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", 600);
    intent.putExtra("outputY", 600);
    intent.putExtra("scale", true);
    intent.putExtra("return-data", true);
    if (intent.resolveActivity(activity.getPackageManager()) != null) {
        activity.startActivityForResult(intent, action_code);
    } else {
        Toast.makeText(activity, "No Crop App Available", Toast.LENGTH_SHORT).show();
    }
}

并重写OnActivityResult(),如下所示:

if (resultCode == Activity.RESULT_OK && requestCode == Utils.CODE_CROP_IMAGE) {
    Bundle extras = data.getExtras();
    showCenterToast("ccc");
    if (extras != null) {
        showCenterToast("CCC");
        Bitmap photo = extras.getParcelable("data");
        ivAvatar.setImageBitmap(photo); // display image in ImageView
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(Utils.AVATAR_FILE);
            photo.compress(Bitmap.CompressFormat.PNG, 100, fos);// (0-100)compressing file
            showCenterToast("DDD");
            Utils.AVATAR_FILE_TMP.delete();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
           IoUtil.closeSilently(fos);
        }
    }
}

在Android Pre-Lollipop的设备上,我能够获得位图照片并将其显示在ImageView中。但是,在Android Lollipop上,我总是从data.getExtras();得到null

我在谷歌上搜索了很多,但关于在AndroidLollipop上裁剪图像的有用信息很少。

共有1个答案

漆雕奇
2023-03-14

我认为你的问题与Android版本无关,而是你想要裁剪的图像。在类com.android.gallery3d.filtershow.crop.cropActivity#BitmapioTask中处理的裁剪图像。当图像太大无法返回时,它会尝试返回图像的thumb,有时会返回null。为了避免这种情况,您可以通过设置intent.putextra(纵隔.extra_output,tmpUri);来获得裁剪图像的uri,而不是位图,其中tmpUri是为保存结果而创建的uri。然后您可以从tmpuri中获取位图。

示例代码:

private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";//temp file
private static Uri tmpUri = Uri.parse(IMAGE_FILE_LOCATION);//The Uri to store the big bitmap

public static void cropImage(Uri uri, Activity activity, int action_code) {
    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", 600);
    intent.putExtra("outputY", 600);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, tmpUri);
    if (intent.resolveActivity(activity.getPackageManager()) != null) {
        activity.startActivityForResult(intent, action_code);
    } else {
        Toast.makeText(activity, "No Crop App Available", Toast.LENGTH_SHORT).show();
    }
}

并且在函数OnActivityResult中:

if (resultCode == Activity.RESULT_OK && requestCode == Utils.CODE_CROP_IMAGE) {
    // Bundle extras = data.getExtras();
    Uri uri = data.getData();
    showCenterToast("ccc");
    if (uri != null) {
        showCenterToast("CCC");
        // Bitmap photo = null;
        // if (tmpUri != null) {
        //     photo = decodeBitmapFromUri(tmpUri); // Get bitmap from uri.
        // }

        Bitmap photo = decodeUriAsBitmap(uri);
        ivAvatar.setImageBitmap(photo); // display image in ImageView
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(Utils.AVATAR_FILE);
            photo.compress(Bitmap.CompressFormat.PNG, 100, fos);// (0-100)compressing file
            showCenterToast("DDD");
            Utils.AVATAR_FILE_TMP.delete();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
           IoUtil.closeSilently(fos);
        }
    } else {
        showCenterToast("Uri is NULL");
    }
}

private Bitmap decodeUriAsBitmap(Uri uri){
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }
    return bitmap;
}
 类似资料:
  • 问题内容: 我想用PHP裁剪图像并保存文件。我知道您应该使用GD库,但我不确定如何使用。有任何想法吗? 谢谢 问题答案: 您可以用来裁剪图像的必需部分。该命令如下所示: 来自PHP.net的代码- 从源图像中裁剪出一个80x40像素的图像

  • 裁剪是移去部分照片以打造焦点或加强构图效果的过程。在 Photoshop 中使用裁剪工具裁剪并拉直照片。裁剪工具是非破坏性的,您可以选择保留裁剪的像素以便稍后优化裁剪边界。裁剪工具还提供直观的方法,可让您在裁剪时拉直照片。 对于所有操作,可视化指南都提供了交互式预览。在您裁剪或拉直照片时,实时反馈可帮助您以可视的方式呈现最终结果。 裁剪照片 在工具栏中,选择裁剪工具。裁剪边界显示在照片的边缘上。

  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 问题内容: 在OpenCV中返回旋转的矩形。如何裁剪矩形内图像的这一部分? 返回旋转矩形的角点的坐标,以便可以通过遍历框内的点来访问像素,但是有没有一种更快的Python裁剪方法? 编辑 请参阅下面的答案。 问题答案: 您没有给出示例代码,所以我也没有代码也回答。您可以按以下步骤进行: 从矩形的角确定相对于水平轴的旋转角度α。 按alpha旋转图像,以使裁剪后的矩形与图像边界平行。确保临时图像的尺

  • 我正在尝试鲁棒地提取轮廓的旋转边界框。我想拍一张图像,找到最大的轮廓,得到它旋转的边界框,旋转图像使边界框垂直,并裁剪到大小。 为了演示,这里有一个原始图像链接在下面的代码中。我想最终把那只鞋旋转到垂直方向,裁剪成合适的尺寸。这个答案中的以下代码似乎适用于opencv行等简单图像,但不适用于照片。 最终得到这个,旋转和裁剪错误: 编辑:将阈值类型更改为,它现在已正确旋转,但裁剪错误: 如何获得正确

  • 我正试图单击image from camera并显示到imageview,但onactivityresult URI返回NULL。但是下面的代码在JellyBean、ICS上运行良好,具有裁剪功能。 呼叫意图