裁剪图像不会成功

Posted

技术标签:

【中文标题】裁剪图像不会成功【英文标题】:Cropping image won't succeed 【发布时间】:2018-09-23 22:12:37 【问题描述】:

我正在尝试用相机拍照,然后将其裁剪为然后将其显示到 ImageView 中。

不幸的是,您将在下面的代码中看到的crop方法中的startActivityForResult总是会返回错误结果代码。

我想我找到了造成这种情况的坏人,但我不知道如何解决它。

首先是代码:

捕获图像:

/**
 * Starts Intent to open camera and take picture
 */
private void captureImage() 
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (cameraIntent.resolveActivity(getPackageManager()) != null) 

        File photoFile = null;

        try 
            photoFile = createImageFile();
         catch (IOException ex) 
            Toast.makeText(this, "Whoops - could not access external storage!", Toast.LENGTH_SHORT).show();
        
        if (photoFile != null) 
            Uri photoUri = FileProvider.getUriForFile(this, FILEPROVIDER_AUTHORITY, photoFile);
            contact.setImage(Uri.fromFile(photoFile));
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
            try 
                startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
             catch (ActivityNotFoundException e) 
                Toast.makeText(this, "Whoops - something went wrong!", Toast.LENGTH_SHORT).show();
            
        
     else 
        Toast.makeText(this, "Whoops - your device doesn't support capturing images!", Toast.LENGTH_SHORT).show();
    

裁剪图像:

/**
 * Starts (unofficial) Intent to crop chosen image which is likely to fail
 */
private void cropImage() 

    Uri photoUri = FileProvider.getUriForFile(this, FILEPROVIDER_AUTHORITY,new File(contact.getImage().getPath()));
    grantUriPermission("com.android.camera", photoUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

    Intent cropIntent = new Intent("com.android.camera.action.CROP");
    cropIntent.setDataAndType(photoUri, "image/*");

    cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

    cropIntent.putExtra("crop", "true");
    cropIntent.putExtra("aspectX", 1);
    cropIntent.putExtra("aspectY", 1);
    cropIntent.putExtra("outputX", 500);
    cropIntent.putExtra("outputY", 500);
    cropIntent.putExtra("outputFormat", "JPEG");
    cropIntent.putExtra("noFaceDetection", true);
    cropIntent.putExtra("return-data", true);
    cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
    try 
        startActivityForResult(cropIntent, REQUEST_IMAGE_CROP);
     catch (ActivityNotFoundException e) 
        Toast.makeText(this, "Whoops - your device doesn't support the crop action!", Toast.LENGTH_SHORT).show();
    

onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 

    if (resultCode == RESULT_OK) 

        switch (requestCode) 
            case REQUEST_IMAGE_CAPTURE:
                cropImage();
                break;
            case REQUEST_IMAGE_CHOOSE:
                break;
            case REQUEST_IMAGE_CROP:
                Bitmap tmp = data.getExtras().getParcelable("data");
                previewImageView.setImageBitmap(tmp);
                break;
            default:
                super.onActivityResult(requestCode, resultCode, data);
        
     else 
        Toast.makeText(this, "Whoops - something went wrong!", Toast.LENGTH_SHORT).show();
    

现在我认为负责的坏人是 com.android.gallery3d 应用程序,因为每次触发裁剪意图时都会引发此异常:

com.android.gallery3d W/CropActivity: cannot open region decoder for file: content://de.hska.mycontacts.fileprovider/contact_images/CONTACT_20180413_155111_.jpg
java.io.IOException: Image format not supported
    at android.graphics.BitmapRegionDecoder.nativeNewInstance(Native Method)
    at android.graphics.BitmapRegionDecoder.newInstance(BitmapRegionDecoder.java:124)
    at com.android.gallery3d.filtershow.crop.CropActivity$BitmapIOTask.doInBackground(CropActivity.java:483)
    at com.android.gallery3d.filtershow.crop.CropActivity$BitmapIOTask.doInBackground(CropActivity.java:421)
    at android.os.AsyncTask$2.call(AsyncTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761) 

com.android.gallery3d W/CropActivity: cannot decode file: content://de.hska.mycontacts.fileprovider/contact_images/CONTACT_20180413_155111_.jpg

我希望有人可以帮助我:)

【问题讨论】:

Android does not have a CROP Intent。有很多image cropping libraries available for Android。请使用一个。 是的,我也读过,但是有很多条目人们使用我使用的相同方法。显然它的工作但不正确。不过,你有推荐的图书馆吗? “有很多条目人们使用我使用的相同方法”——大约有 10,000 种 Android 设备型号。你打算测试多少? “虽然你有推荐的吗?” -- 我的印象是 uCrop 是最受欢迎的,但您确实应该自己查看它们,因为您的需求可能会有所不同。 好的,我来看看其中的一些。谢谢:) 【参考方案1】:

正如CommonsWare 已经在 cmets 中声明的那样,Intent com.android.camera.action.CROP 不是官方的,并且不适用于大多数设备。因此,最好使用库。

我最终使用了uCrop,它真的很容易使用并且还支持很多自定义。

【讨论】:

以上是关于裁剪图像不会成功的主要内容,如果未能解决你的问题,请参考以下文章

使用javascript裁剪GIF图像而不会丢失动画[重复]

为啥Android裁剪意图不返回ActivityResult?

从图库中获取图像,但不会裁剪

从 iPhone 的照片库中调整方形裁剪图像的正确方法而不会失真

Firefox -moz-border-radius 不会裁剪图像?

Jcrop 裁剪图像无法正常工作,正在裁剪错误的部分