从相机拍摄时裁剪图像问题

时间:2013-07-30 06:19:38

标签: android image crop

以下是我的相关code snippet,其中的内容在从相机拍摄照片后重定向到设备的cropping app。我通常遵循这个example。但是在从相机拍摄的照片与在裁剪应用程序中拍摄的照片之间的阶段/时刻,它会显示持续加载并使我的应用程序非常无响应。如果这种情况至少发生一次,那么每次打开应用程序时,它都会显示加载情况。

one scenario - >中未发生此问题当我不移动我的设备时(即,仅在没有屏幕方向发生时)。有人可以建议我避免这个问题吗?

public void shotFromCamera(View view)
{
    Intent intent    = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageCaptureUri);

                try {
                    intent.putExtra("return-data", true);

                    startActivityForResult(intent, PICK_FROM_CAMERA);
                } catch (ActivityNotFoundException e) {
                    e.printStackTrace();
                }
}

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

        if(resultCode==RESULT_OK && requestCode == PICK_FROM_CAMERA){

            doCrop();
                 } else if(resultCode == RESULT_OK && requestCode == CROP_FROM_CAMERA)
        {
            Bundle extras = data.getExtras();

            if (extras != null) {               
                Bitmap photoBitmap = extras.getParcelable("data");

                imageView.setImageBitmap(photoBitmap);
                if(mImageCaptureUri != null)
                {
                File f = new File(mImageCaptureUri.getPath());
                if (f.exists()) f.delete();
                }

                mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+ "/MyApp",
                           "avatar" + String.valueOf(System.currentTimeMillis()) + ".jpg"));
                File file = new File(mImageCaptureUri.getPath()); 

                    selectedImagePath = mImageCaptureUri.getPath();
                    Log.d("pic1 ","pic to be created: "+selectedImagePath);
                    OutputStream fOut = null;

                    try {
                        fOut = new FileOutputStream(file);
                        photoBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                        fOut.flush();
                        fOut.close();
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch(IOException e)
                    {
                        e.printStackTrace();
                    }       

            }


        }
}

    private void doCrop() {
            final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setType("image/*");

            List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );

            int size = list.size();

            if (size == 0) {            
                Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();

                return;
            } else {
                intent.setData(imageCaptureUri);

                intent.putExtra("outputX", 200);
                intent.putExtra("outputY", 200);
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("scale", true);
                intent.putExtra("return-data", true);

                if (size == 1) {
                    Intent i        = new Intent(intent);
                    ResolveInfo res = list.get(0);

                    i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

                    startActivityForResult(i, CROP_FROM_CAMERA);
                }
   }

为了澄清我的问题,我在该示例中运行了源代码,同样的问题发生了。我已经运行了其他几个重定向到裁剪应用程序的示例。在上述阶段更改方向时会出现同样的问题。

P.S :如果有人有一个工作范例,即使在方向变化方面肯定会有效,我也很乐意接受它作为答案。

2 个答案:

答案 0 :(得分:1)

你可以选择 -

  1. 从指定的URI获取位图,即使用

    的全尺寸图像

    photo = android.provider.MediaStore.Images.Media.getBitmap(cr, Uri.fromFile(imageCaptureUri));

  2. 压缩图像时使用Bitmap.CompressFormat.PNG

  3. 使用

    创建缩放位图

    photo= Bitmap.createScaledBitmap(background, YourWidth, YourHeight, true);

  4. 这是您的缩放(裁剪)图像。

答案 1 :(得分:0)

intent.setData(imageCaptureUri);

中的行doCrop()之前检查imageCaptureUri!= null的值

修改

首先将相机结果保存到文件中并传递文件以进行裁剪应用

intent.setData(Uri.fromFile(new File(path)));