Android 裁剪图像大小

Posted

技术标签:

【中文标题】Android 裁剪图像大小【英文标题】:Android crop image size 【发布时间】:2013-04-04 09:44:21 【问题描述】:

我有以下代码供用户裁剪图像。当我将大小设置为超过 256 时,它不起作用。我的直觉是“cropIntent.putExtra("return-data", true);"导致错误。如何将 uri 传递给cropIIntent 并从onActivityResults 中检索出来?也就是裁剪后保存图片并检索。

private void performCrop() 
    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(mImageCaptureUri, "image/*");
        //set crop properties
        cropIntent.putExtra("crop", "true");
        //indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 4);
        cropIntent.putExtra("aspectY", 3);
        //indicate output X and Y
        cropIntent.putExtra("outputX", 256);
        cropIntent.putExtra("outputY", 256);
        //retrieve data on return
        cropIntent.putExtra("return-data", true);

        startActivityForResult(cropIntent, PIC_CROP);

     //respond to users whose devices do not support the crop action
    catch (ActivityNotFoundException anfe) 
        //display an error message
        String errorMessage = "Your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    


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

         if (requestCode == PIC_CROP) 
            try 
               final TextView imgTv = (TextView) findViewById(R.id.imageInfo);
                Bundle extras = data.getExtras();
                thumbnail = extras.getParcelable("data");
                ImageView image = (ImageView) findViewById(R.id.pestImage);
                image.setImageBitmap(thumbnail);
        File f = new File(mImageCaptureUri.getPath());
        if (f.exists()) 
            f.delete();
        
    
//end onactivity results

【问题讨论】:

【参考方案1】:
private void performCrop() 
    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(mImageCaptureUri, "image/*");
        //set crop properties
        cropIntent.putExtra("crop", "true");
        //indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 4);
        cropIntent.putExtra("aspectY", 3);
        //indicate output X and Y
        cropIntent.putExtra("outputX", 800);
        cropIntent.putExtra("outputY", 800);

    File f = new File(Environment.getExternalStorageDirectory(),
            "/temporary_holder.jpg");
        try 
            f.createNewFile();
         catch (IOException ex) 
        Log.e("io", ex.getMessage());  
        

uri = Uri.fromFile(f);

      cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

        startActivityForResult(cropIntent, PIC_CROP);

     //respond to users whose devices do not support the crop action
    catch (ActivityNotFoundException anfe) 
        //display an error message
        String errorMessage = "Your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    

onActivityResult

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

         if (requestCode == PIC_CROP) 

                  String filePath = Environment.getExternalStorageDirectory()
                        + "/temporary_holder.jpg";

                thumbnail = BitmapFactory.decodeFile(filePath);



                       //thumbnail =    BitmapFactory.decodeFile(filePath);
               //    Log.i("",String.valueOf(thumbnail.getHeight()));

                    ImageView image = (ImageView) findViewById(R.id.pestImage);
                    image.setImageBitmap(thumbnail);
                    

【讨论】:

【参考方案2】:

试试

    Uri cropedImageUri = data.getData();

String[] filePathColumn =  MediaStore.Images.Media.DATA ;

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

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

现在 filePath 是裁剪图像的路径

从文件路径加载位图使用

 private Bitmap loadImageFromSDCard(String filePath) 

        BitmapFactory.Options bfo = new BitmapFactory.Options();
        bfo.inSampleSize = 1;
        bfo.outWidth = 100;
        bfo.outHeight = 100;
        Bitmap photo = BitmapFactory.decodeFile(filePath, bfo);
        return photo;
     

【讨论】:

我不需要将uri传入cropIntent?当我得到文件路径时,如何转换为位图? 你能提供更多细节吗? 我觉得你不需要传递一个Uri,看看resultCode是不是Success,我添加了从文件路径加载位图的代码。【参考方案3】:
    if (android.os.Build.VERSION.SDK_INT > 10)
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        cropIntent.setDataAndType(picUri, "image/*");
        cropIntent.putExtra("crop", "true");
        int gcd = BigInteger.valueOf(ImageWidth).
              gcd(BigInteger.valueOf(ImageHeight)).intValue();
        cropIntent.putExtra("aspectX", (ImageWidth / gcd));
        cropIntent.putExtra("aspectY", (ImageHeight / gcd));
        cropIntent.putExtra("outputX", ImageWidth);  // X
        cropIntent.putExtra("outputY", ImageHeight);  // Y
        cropIntent.putExtra("return-data", true);
        cropIntent.setData(picUri);
        startActivityForResult(cropIntent, PIC_CROP_INTENT_ID);
    

【讨论】:

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

在Android中以给定的正方形大小裁剪图像?

Android,如何裁剪修复图像视图[重复]

Android 图像裁剪:输出 x 和输出 y

在 android 中减小图像大小而不损失其质量

android裁剪图像太小

Android中自定义图像裁剪的实现