【问题标题】:Image cropping problems (IDE :- Android Studio (Java))图像裁剪问题(IDE :- Android Studio (Java))
【发布时间】:2016-03-09 05:51:50
【问题描述】:

我浏览了许多链接并检查了各种代码,但它还不符合我的要求。

这是我的要求;

  1. 我想从手机内存或 sd 卡中选择图像(给用户选择图像目录的选项)并裁剪它。

其中的问题,在棒棒糖操作系统中,当我从图库中选择图像时,它不提供裁剪选项,因此 getData 返回 null 但如果我从照片中选择图像,它会裁剪图像并保存它,因此 getData 返回 URI 但原始图像被这个裁剪的覆盖。

  1. 在 Jellybean 中情况正好相反,如果我从图库中选择图像,一切正常,但从照片中,裁剪选项不会出现。

下面是代码sn-p..

public void selectImageFromGallery() 
{
        try
        {
            Globals g = (Globals) getApplication();
            int iWidthDP = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, g.screenWidth, getResources().getDisplayMetrics());
            int iHeightDP = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.putExtra("crop", "true");
            intent.putExtra("aspectX", 0);
            intent.putExtra("aspectY", 0);
            intent.putExtra("outputX", iWidthDP);
            intent.putExtra("outputY", iHeightDP);
            intent.putExtra("return-data", true);
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_FROM_GALLERY);
        }
        catch(Exception ex)
        {
            Toast toast = Toast.makeText(this, "exception occurred in selectImageFromGallery" +
                    ex.getMessage().toString(), Toast.LENGTH_SHORT);
            toast.show();
        }
}


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

        try
        {
            if ((requestCode == PICK_FROM_GALLERY || requestCode == PICK_FROM_CAMERA)
                    && resultCode == RESULT_OK && null != data)
            {
                if (resultCode == RESULT_OK)
                {
                    Bitmap bitmap = null;
                    Uri selectedImage = null;
                    if(requestCode == PICK_FROM_GALLERY || requestCode == PICK_FROM_CAMERA) {
                        selectedImage = data.getData();
                        if(selectedImage == null)
                            selectedImage = (Uri)data.getExtras().get("data");
                    }
                    if (Build.VERSION.SDK_INT < 19)
                    {
                        String[] filePathColumn = {MediaStore.Images.Media.DATA};
                        Cursor cursor = getContentResolver().query(selectedImage,
                                filePathColumn, null, null, null);
                        cursor.moveToFirst();
                        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                        String picturePath = cursor.getString(columnIndex);
                        cursor.close();
                        bitmap = BitmapFactory.decodeFile(picturePath);
                    }
                    else
                    {
                        ParcelFileDescriptor parcelFileDescriptor;
                        try {
                            parcelFileDescriptor = getContentResolver().openFileDescriptor(selectedImage, "r");
                            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
                            bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
                            parcelFileDescriptor.close();
                        } catch (FileNotFoundException ex) {
                            Toast toast = Toast.makeText(this, "exception occurred in onActivityResult" + ex.getMessage().toString(), Toast.LENGTH_SHORT);
                            toast.show();
                        } catch (Exception ex) {
                            Toast toast = Toast.makeText(this, "exception occurred in onActivityResult" + ex.getMessage().toString(), Toast.LENGTH_SHORT);
                            toast.show();
                        }
                    }


                    image.setScaleType(ImageView.ScaleType.FIT_XY);
                    image.setImageBitmap(bitmap);
                }
            }
        }
        catch(Exception ex)
        {
            Toast toast = Toast.makeText(this, "exception occurred in onActivityResult" + ex.getMessage().toString(), Toast.LENGTH_SHORT);
            toast.show();
        }
    }
}

提前谢谢..

【问题讨论】:

  • 从图库或相机中选择图像时是否要裁剪图像?
  • 两者兼而有之,但现在让我们先关注图库。
  • 我建议你使用库,这很容易
  • 你能建议使用哪个库或给我链接,我会检查。
  • 检查我的答案@Gvs13

标签: android bitmapimage


【解决方案1】:

我建议您为此使用库。这是设置步骤:

首先在你的 build.gradle 模块中添加这个:app

这是在 android 部分:

repositories {
    maven { url "https://jitpack.io" }
}

repositories {
        mavenCentral()

        maven {
            url 'http://lorenzo.villani.me/android-cropimage/'
        }
    }

这是在依赖部分:

dependencies {
        compile 'com.github.jkwiecien:EasyImage:1.2.1'
        compile 'me.villani.lorenzo.android:android-cropimage:1.1.+'
        compile 'com.squareup.picasso:picasso:2.5.2'
}

用于从相机中挑选图像

 EasyImage.openCamera(Context, 0);

从图库中挑选图片

EasyImage.openGallery(Context, 1);

在这之后。

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


        EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() {
            @Override
            public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) {
                //Some error handling
            }

            @Override
            public void onImagePicked(File imageFile, EasyImage.ImageSource source, int type) {

               // Picasso.with(MainActivity.this).load(imageFile).into(imageView);

                    Uri uri = null;
                    uri = Uri.fromFile(imageFile);
                    file = imageFile;
                    CropImageIntentBuilder builder = new CropImageIntentBuilder(200, 200, uri);
                    builder.setOutlineColor(0xFF03A9F4);
                    builder.setSourceImage(uri); //data.getData()

                    startActivityForResult(builder.getIntent(MainActivity.this),100);
            }

        });

        if ((requestCode == 100) && (resultCode == RESULT_OK)) {
            // When we are done cropping, display it in the ImageView.
           // imageView.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
            Picasso.with(MainActivity.this).load(file).into(imageView);

        }

    }

别忘了在你的 android Android.manifest 中添加这个

<activity android:name="com.android.camera.CropImage"/>

这将帮助您通过裁剪功能从图库和相机中获取图像,减少您的代码并易于维护以选择图像。

这对你有帮助

【讨论】:

  • 不要忘记在全局声明一个变量“文件文件”并将“imageView”更改为您的图像视图。
  • 你能分享我可以下载的 lib 文件位置吗?编译'com.github.jkwiecien:EasyImage:1.2.1' 编译'me.villani.lorenzo.android:android-cropimage:1.1.+'
  • 你只需要在你的 build.gradle 中的 depandences @Gvs13 中添加这些行
  • 添加这些行后,它说无法解析它们的引用。
  • 对不起,我忘了添加一些相关的库,你能检查我的更新答案@Gvs13
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 2013-03-05
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2011-04-19
相关资源
最近更新 更多