将位图裁剪为特定的宽度和高度,而不会丢失分辨率

Posted

技术标签:

【中文标题】将位图裁剪为特定的宽度和高度,而不会丢失分辨率【英文标题】:Crop a bitmap to particular width and height without losing resolution 【发布时间】:2014-06-18 10:30:15 【问题描述】:

我需要从图库中裁剪图像并保存到服务器。这是我裁剪图像的代码

   private void startCropImage() 

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

    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
        //indicate output X and Y
    intent.putExtra("outputX", 400);
    intent.putExtra("outputY", 487);

    intent.putExtra("return-data", true);
    intent.putExtra("scale", true);
    startActivityForResult(intent, CROP_FROM_GALLERY);

我需要 400*487 的输出,但是在裁剪图像后,当我检查宽度时它在设备上只有 160,但在 AVD 上它显示正确的宽度。为什么会这样?以下是我的onActivityResult代码

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
Bundle extras2 = data.getExtras();
if (extras2 != null) 

Bitmap bm2 = extras2.getParcelable("data");

imgview.setImageBitmap(bm2);

int width = bm2.getWidth();

【问题讨论】:

【参考方案1】:

我不知道你可能知道这个库,它只是我的建议,我没有给出代码方面的答案,我给出了选项

为什么要重新发明*** :)(当然我们可以改进)

https://github.com/edmodo/cropper

【讨论】:

【参考方案2】:

检查这一行:

Bitmap bm2 = extras2.getParcelable("data");

Intent 只能传输有限数量的数据。根据版本或设备,它的范围可能从 200kb 到 1 mb。所以这条线返回裁剪图像的缩略图。要获得完整图像,请执行以下操作。请记住,您无法获得所需的确切宽度。

Uri selectedImage = data.getData();
        String[] filePath = MediaStore.Images.Media.DATA;
        Cursor cursor = getContentResolver().query(
                           selectedImage, filePath, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        cursor.close();
        Bitmap bmp= BitmapFactory.decodeFile(filePath);

您需要裁剪图像的文件系统中的实际路径。 更新 com.android.camera.action.CROP 不是官方的 android 意图。图库和相机等应用程序支持它,但有许多设备不支持此意图。查看@commonsware 的this 博客文章。我已经回答了使用此SO post 中的库的裁剪图像。

【讨论】:

那我该怎么做才能得到准确的图像 有什么方法可以在不使用意图的情况下裁剪图像? 我在 AVD 上得到了准确的宽度,但在手机上却没有 当您裁剪图像时,您指定的纵横比不是您想要的物理像素。您需要进行进一步处理以获得裁剪后所需的确切宽度和高度 让我们continue this discussion in chat.

以上是关于将位图裁剪为特定的宽度和高度,而不会丢失分辨率的主要内容,如果未能解决你的问题,请参考以下文章

将位图图像裁剪为自定义正方形

PHP裁剪图像以固定宽度和高度而不丢失尺寸比

C# WIA 设置分辨率不会增加分辨率,而是增加图像的宽度和高度。在 C# 中

避免图像裁剪并将其投射到固定的图像尺寸

调整位图的大小,保持宽高比,不会出现失真和裁剪

根据android中的矩形坐标裁剪捕获的图像