为啥我裁剪的图像很小?

Posted

技术标签:

【中文标题】为啥我裁剪的图像很小?【英文标题】:Why is my cropped image little?为什么我裁剪的图像很小? 【发布时间】:2017-12-15 16:22:26 【问题描述】:

我正在尝试编写一个代码,允许用户从图库中选择图片并使用 Intent 对其进行裁剪,以便最终将其显示在 ImageView 中(用于个人资料图片目的)。

一切正常,可以选择图像,可以裁剪并显示在自定义对话框中的 ImageView 中。问题是我的自定义对话框中的 ImageView 非常少,即使我将 wrap_content 设置为宽度和高度,所以用户几乎看不到裁剪后的图像。

这是截图:Little image

代码:

我的自定义对话框(custom_dialog_pp.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_
android:background="@drawable/style_layout_rounded_white">


<TextView
    android:id="@+id/useit_customdialog_pp_TV"
    android:layout_
    android:layout_
    android:padding="10dp"
    android:gravity="center"
    android:text="@string/usethispic"
    android:textSize="25sp"
    android:textColor="@color/white"
    android:background="@drawable/style_tv_toproundcorner"/>

<ImageView
    android:contentDescription="@string/profilpic"
    android:id="@+id/pp_customdialog_pp_IV"
    android:layout_
    android:layout_

/>

<Space
    android:layout_
    android:layout_ />

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:padding="10dp">

    <Button
        android:layout_
        android:layout_weight="1"
        android:layout_
        android:id="@+id/cancel_customdialog_pp_BTN"
        android:background="@drawable/style_button_primary"
        android:text="@string/cancel"
        />

    <Space
        android:layout_
        android:layout_
        android:layout_weight="1"/>

    <Button
        android:layout_
        android:layout_weight="1"
        android:layout_
        android:id="@+id/done_customdialog_pp_BTN"
        android:background="@drawable/style_button_primary"
        android:text="@string/done"
        />

</LinearLayout>

在我的 MainActivity 中:

 ////////////////////
ChangeProfilPic.onClickListener 
 Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryIntent, 2);

 ////////////////////

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 4 && resultCode == RESULT_OK && data != null) 

        Bundle extras = data.getExtras();
        Bitmap selectedImage = extras.getParcelable("data");


        android.support.v7.app.AlertDialog.Builder mBuilderLoading = new android.support.v7.app.AlertDialog.Builder(MainActivity.this);
        View mViewLoading = getLayoutInflater().inflate(R.layout.custom_dialog_pp,null);

        final ImageView pp_customdialog_pp_IV = mViewLoading.findViewById(R.id.pp_customdialog_pp_IV);

        pp_customdialog_pp_IV.setImageBitmap(selectedImage);


        mBuilderLoading.setView(mViewLoading);
        final android.support.v7.app.AlertDialog dialogLoading = mBuilderLoading.create();
        dialogLoading.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialogLoading.show();


     else if(requestCode == 2 && resultCode == RESULT_OK && data != null) 
        ImageCropFunction(data.getData());
    



public void ImageCropFunction(Uri imguri) 
    try 
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        cropIntent.setDataAndType(imguri, "image/*");
        cropIntent.putExtra("crop", "true");
        cropIntent.putExtra("aspectX", 1);
        cropIntent.putExtra("aspectY", 1);
        cropIntent.putExtra("outputX", 128);
        cropIntent.putExtra("outputY", 128);
        cropIntent.putExtra("return-data", true);
        startActivityForResult(cropIntent, 4);

     catch (ActivityNotFoundException ignored) 

    

Ps:我想保留裁剪选项

【问题讨论】:

您有outputXoutputY 作为128。你得到的图像是 128x128 的吗?也许这就是问题 @th3pat3l 无论我输入 128 或 1000 还是 50000,它都会得到相同的结果。 看看下面我的回答。这样做,您仍然需要将 128 更改为更高的数字。试试 512x512 之类的尺寸 @th3pat3l 我照你说的做了,但我的 uri 总是为空 【参考方案1】:

像这样更改您的onActivityResult()

您得到的是缩略图 (128x128)。您必须使用 Uri 来获取完整图像。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 2 && resultCode == RESULT_OK && data != null) 
        Uri selectedImage = data.getData();
        String[] filePathColumn =  MediaStore.Images.Media.DATA ;

        if (selectedImage == null) 
            return;
        

        Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);

        if (cursor == null) 
            return;
        

        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();


        if (picturePath != null) 
            Log.d("TAG", "picturePath " + picturePath);

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(picturePath, options);

            if(bitmap != null) 
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                // you can change the quality here. for dialog, you might only want 50 instead of 100..
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

                AlertDialog.Builder mBuilderLoading = new AlertDialog.Builder(MainActivity.this);
                View mViewLoading = getLayoutInflater().inflate(R.layout.custom_dialog_pp,null);

                final ImageView pp_customdialog_pp_IV = mViewLoading.findViewById(R.id.pp_customdialog_pp_IV);
                pp_customdialog_pp_IV.setImageBitmap(bitmap);
                mBuilderLoading.setView(mViewLoading);

                final AlertDialog dialogLoading = mBuilderLoading.create();
                dialogLoading.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialogLoading.show();
             else 
                Log.e("TAG", "bitmap is null?!");
            
        
    

【讨论】:

我的 Uri selectedImage 总是 == null...为什么? 啊!我明白为什么了。您正在使用startActivityForResult(galleryIntent, 2); 发送2 的值。所以if 语句必须更改为if(requestCode == 2...)。我编辑了我的答案。试试看 @MelvinAuvray 我有机会测试了上面的例子。它完美地工作 我之前必须添加一些权限检查,但它可以工作,问题是使用这种方法,裁剪功能不再存在:/ 我该怎么做才能让它回来? @MelvinAuvray 您可以按照您的方式进行裁剪,但我真的不建议这样做。 com.android.camera.action.CROPIntent 操作中仅适用于 AOSP 相机。这意味着我确信它可以在您的手机上运行,​​但它不会在每部手机上运行。我个人会使用库将裁剪功能作为您应用程序的一部分,这样您就不会依赖 Android 手机的相机应用程序。【参考方案2】:

我相信默认行为是在返回结果中返回缩略图。因此您可能还需要使用 URI 在返回时获取完整尺寸的图像。

【讨论】:

以上是关于为啥我裁剪的图像很小?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我粘贴的图像在 LibreOffice Writer 中看起来被裁剪了?

为啥裁剪后的图像颜色会变深?

Python and OpenCV - 为啥用 OpenCV 处理的裁剪图像仍然可以影响原始图像?

当我改变相机的方向进行裁剪图像时,为啥我会丢失数据?

为啥我需要指定裁剪分辨率?

为啥此裁剪代码会导致图像旋转?