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

Android裁剪图像刚从相机中取出,并通过从图库中选择显示

缪茂勋
2023-03-14

在我的应用程序中有一个活动,从相机中拍摄一张照片,保存它并显示在ImageView Follingby上。我使用FilePath类来指出将其存储在路径上的位置,CameraUtils类来获取file:uri并将图像转换为位图。现在我的任务是添加一个crop功能,以摆脱我们感兴趣的区域。裁剪功能应该在屏幕上激活,刚拍摄了一张照片,然后裁剪的照片需要保存才能显示。在此之前,请参阅添加crop前的工作代码:

    /*  Capture Image Method  */
        private void captureImage() {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//Start intent with Action_Image_Capture
            fileUri = CameraUtils.getOutputMediaFileUri(this);//get fileUri from CameraUtils
            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);//Send fileUri with intent
            //intent.putExtra("return-data",true); // Should be for crop
            startActivityForResult(intent, CAMERA_REQUEST_CODE);//start activity for result with CAMERA_REQUEST_CODE
        }
    /*  Show Captured over ImageView  */
        private void showCapturedImage() {
            if (!getImageUrl.equals("") && getImageUrl != null)
                imageView.setImageBitmap(CameraUtils.convertImagePathToBitmap(getImageUrl, false));
            else
                Toast.makeText(this, R.string.capture_image_failed, Toast.LENGTH_SHORT).show();
        }
private void CropImage() {

        try {
            Intent CropIntent = new Intent("com.android.camera.action.CROP");
            CropIntent.setDataAndType(uri, "image/*");

            CropIntent.putExtra("crop", "true");
            CropIntent.putExtra("outputX", 180);
            CropIntent.putExtra("outputY", 180);
            CropIntent.putExtra("aspectX", 3);
            CropIntent.putExtra("aspectY", 4);
            CropIntent.putExtra("scaleUpIfNeeded", true);
            CropIntent.putExtra("return-data", true);

            startActivityForResult(CropIntent, 1003);
        } catch (ActivityNotFoundException ex) {
            //
        }
    }

onActivityResult()方法:

/**
 * public static final int PERMISSION_REQUEST_CODE = 1001;//request code for Camera and External Storage permission
 * private static final int CAMERA_REQUEST_CODE = 1002;//request code for capture image
 * private static final int CROP_REQUEST_CODE = 1003;//request code for crop
 */

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {

            case CAMERA_REQUEST_CODE:
                try {
                    //When image is captured successfully
                    if (resultCode == RESULT_OK) {
                        //Check if device SDK is greater than 22 then we get the actual image path via below method
                        if (Build.VERSION.SDK_INT > 22)
                            getImageUrl = FilePath.getPath(MainActivity.this, fileUri);
                        else
                            //else we will get path directly
                            getImageUrl = fileUri.getPath();

                        //After image capture show captured image over image view
                        showCapturedImage();

                    } else
                        Toast.makeText(this, R.string.cancel_message, Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }
    }

在此之前,所有的工作都很好,但是当涉及到插入crop函数时,我正在努力将具有所需请求代码的if else/语句添加到switch/case语句中,因为它会抛出未知错误。你能帮我创建正确的逻辑与多个请求代码,并使其工作,请?

共有1个答案

邵城
2023-03-14

在做了以下更改后,我可以使它工作。

首先,CropIntent通过键对值传递值,而键对值应该通过mediastore.extra_output传递,并且uri没有用正确的名称定义。

private void CropImage() {

        try {
            Intent CropIntent = new Intent("com.android.camera.action.CROP");
            CropIntent.setDataAndType(fileUri, "image/*");
            fileUri = CameraUtils.getOutputMediaFileUri(this);

            CropIntent.putExtra("crop", "true");
            CropIntent.putExtra("outputX", 180);
            CropIntent.putExtra("outputY", 180);
            CropIntent.putExtra("aspectX", 3);
            CropIntent.putExtra("aspectY", 4);
            CropIntent.putExtra("scaleUpIfNeeded", true);
            CropIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

            startActivityForResult(CropIntent, CROP_REQUEST_CODE);

        } catch (ActivityNotFoundException ex) {
            //
        }
    }
 类似资料:
  • 我必须做一个按钮,将提供从画廊或从相机选择图像。 结果是有效的。如果我从图库中选择,图像查看器将查看它,如果我选择从相机拍照,它也有效。问题是,在我的show FileChooser()方法中,我所有的意图都在同时运行,所以当我从图库中选择时,相机仍然运行。我选择相机,图库也在打开。我认为我应该在切换案例模式下实现我的代码,但我不明白如何做到这一点。请帮助解决我的初学者问题。

  • 问题内容: 我需要在手机中打开我的画廊,然后选择一张在活动中在imageview中打开的图片..没什么困难..但是我在模拟器(genymotion)中有完美的代码和thise代码可以运行..但是在小米Mi4上却没有。 打开画廊选择项目,什么也没有。 我没有更多的电话了:( 我尝试下载一些与此主题相关的示例,并且每个示例都是相同的。 您是否有一些从图库中选择图像并在imageview中显示的项目?如

  • 我的代码在下面..在中 在onActivityResult(int requestCode,int resultCode,Intent data)中

  • 编辑:我调试了应用程序,并用初始化了。这消除了错误,但是现在ImageView没有得到更新,但是当我从Gallery中选择image时,它已经更新了。

  • 本文向大家介绍Android开发从相机或相册获取图片裁剪,包括了Android开发从相机或相册获取图片裁剪的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了。 以上代码很简单,相信大家都可以看的懂吧,欲了解更多信息请持续关注本站,谢谢。

  • 有没有一个标准的方法来调用对话框选择从相机或从图库(如内置电话簿或Skype)的图像? 我看了一下这个,但是代码打开了图库,没有建议从相机中选择它。 设备:Samsung Galaxy Tab Android:2.3.3