在android中裁剪图像

时间:2017-06-12 07:10:00

标签: java android image

每次使用camera裁剪图片时,我都会收到错误Unable to load image。但就gallery而言,它运作良好。

Uri uriPath = StoreAndFetchImageFromFile.getInstance(ParentDetails.this).getImageUri(partFilename);
                selectedimagepath =  getPath(uriPath);

                Bitmap myBitmap = BitmapFactory.decodeFile(selectedimagepath);
                parentimage.setImageBitmap(myBitmap);
                performCropCamera(uriPath);

imagecrop的方法是:

 private void performCropCamera(Uri picUri) {
    // take care of exceptions
    try {
        // call the standard crop action intent (the user device may not
        // support it)
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        // indicate image type and Uri
        cropIntent.setDataAndType(picUri, "image/*");
        // set crop properties
        cropIntent.putExtra("crop", "true");
        int asp = (int) (DeviceDimensions.getScreenWidth() - 80)/187;
        // indicate aspect of desired crop
        cropIntent.putExtra("aspectX", asp);
        cropIntent.putExtra("aspectY", 3);
        // indicate output X and Y
        cropIntent.putExtra("outputX", DeviceDimensions.getScreenWidth() - 80);
        cropIntent.putExtra("outputY", 187*3);
        // retrieve data on return
        cropIntent.putExtra("return-data", true);
        // start the activity - we handle returning in onActivityResult
        startActivityForResult(cropIntent, PIC_CROP);
    }
    // respond to users whose devices do not support the crop action
    catch (ActivityNotFoundException anfe) {
        Toast toast = Toast
                .makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT);
        toast.show();
    }
}

图片裁剪的OnActivity结果为:

 if (requestCode == PIC_CROP) {
            // get the returned data
            Bundle extras = data.getExtras();
            // get the cropped bitmap
            Bitmap thePic = extras.getParcelable("data");
            parentimage.setImageBitmap(thePic);
        }

1 个答案:

答案 0 :(得分:0)

命令后可能会以不同的格式返回。意图中的文件可以隐藏在几个不同的地方,可以通过几种不同的方式访问它们以使流启动。还有一些具有权限的项目。相机意图可能会以一种方式为您提供数据,并且裁剪意图可能以不同的方式返回裁剪的数据。所以你不能指望两者是一样的。你必须覆盖所有的基础。

请记住,这只是您设备的CROP功能。其他设备不具备裁剪功能,并且它们的工作效果也可能不同。我不会相信他们中的很多人。它实际上是绘制框并在另一个位图中绘制位图。我使用第三方库并将其包含在您的应用中。然后你可以确定它有效。

虽然听起来不错。您无法确定该功能是否存在。更不用说它会以一致的方式发挥作用。

如果我记得该文件可以在文件流中的附加内容中。它可以是content://或file:// object。权限可能会变得非常好。画廊倾向于将它们作为没有命名后缀的content://文件返回,而相机可能会给出可以读取的文件后缀。

我已经看过几次这样的东西,你需要查看从库中返回的东西的名称以了解文件类型,而其他时候它正确包含的URI会给你正确的后缀。

这些和其他原因基本上使作物意图在功能上毫无价值。如果我不得不猜测文件的存储方式与从裁剪返回时的预期方式不同。我用的是:

public Uri getUriFromIntent(Intent intent) {
    Uri uri = intent.getData();
    if (uri != null) return uri;

    Bundle bundle = intent.getExtras();
    if (bundle == null) return null;

    Object object = bundle.get(Intent.EXTRA_STREAM);
    if (object instanceof Uri) {
        return (Uri) object;
    }
    return null;
}

希望找到它可能的位置,因为不同的东西将文件放在一堆不同的地方,如果你不确定提供给他们的确切服务,试图找到它们真的很难找给你的URI。