从画廊android拿起后裁剪图像

时间:2017-01-04 04:06:54

标签: android android-gallery

想要在用户从图库中选择图像后裁剪图像。

所以基本上当用户从图库中选择图像时,他应该能够裁剪它,当他点击确定时,图像应该被发送到服务器。

点击按钮,我有这个启动图库的代码。

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,RESULT_TRUE);

然后我有这个代码从库中选择图像并将其上传到firebase。

@Override
    public  void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_TRUE && resultCode == RESULT_OK) {
            dialog.show();
            Uri url = data.getData();
            StorageReference filepath = mstorage.child("photos").child(url.getLastPathSegment());
            filepath.putFile(url).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(getContext(), "upload done", Toast.LENGTH_LONG).show();
                    Uri downloadurl = taskSnapshot.getDownloadUrl();
                    String imageUrl = downloadurl.toString();
                    Glide.with(getContext()).load(imageUrl).centerCrop().placeholder(R.drawable.ic_menu_camera).crossFade().into(mImage1);
                    SubscriberService subscriberService = new SubscriberService();
                    subscriberService.addItemChildList(AddImagesFragment.this, mAuth.getCurrentUser().getUid(), "images", imageUrl, place);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

有人可以帮我修改裁剪图片的代码。

由于

5 个答案:

答案 0 :(得分:0)

您可以使用此方法执行裁剪: -

private void performCrop(String picUri) {
        try {
            //Start Crop Activity

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            // indicate image type and Uri
            File f = new File(picUri);
            Uri contentUri = Uri.fromFile(f);

            cropIntent.setDataAndType(contentUri, "image/*");
            // set crop properties
            cropIntent.putExtra("crop", "true");
            // indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);
            // indicate output X and Y
            cropIntent.putExtra("outputX", 280);
            cropIntent.putExtra("outputY", 280);

            // retrieve data on return
            cropIntent.putExtra("return-data", true);
            // start the activity - we handle returning in onActivityResult
            startActivityForResult(cropIntent, RESULT_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();
        }
    } 

请参阅链接android:select image from gallery then crop that and show in an imageview

Crop an image when selected from gallery in android

答案 1 :(得分:0)

查看this教程..

答案 2 :(得分:0)

看看这个library,可能会得到一个合适的解决方案。

首先将uCrop添加到Gradle中 要使用它,请写上onActivityResult,

case IMAGE:
    UCrop.of(data.getData(), Uri.fromFile(new File(this.getCacheDir(), "IMG_" + System.currentTimeMillis())))
                    .start(YourActivity.this);
break;

之后处理uCrop结果onActivityResults为(你可以采用一个switch case来处理那里的多个请求代码):

                 case UCrop.REQUEST_CROP:
                    Uri imgUri = UCrop.getOutput(data);
                    if (imgUri != null) {
                        String selectedImage = imgUri.getPath();

                       // load selectedImage into ImageView
                    } else {
                        Snackbar.make(view, R.string.str_bad_image_file, Snackbar.LENGTH_LONG)
                                .show();
                    }
                    break;
                case UCrop.RESULT_ERROR:
                    Snackbar.make(view, R.string.str_bad_image_file, Snackbar.LENGTH_LONG)
                            .show();
                    break;

答案 3 :(得分:0)

看看这个library。它提供基本的裁剪功能,并被许多人使用

答案 4 :(得分:0)

这是一个经过良好测试的代码,因此它肯定会有效。尝试使用下面的代码,裁剪图像:
    private CropImageView img_crop;    
private int CROP_RESULT = 3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_crop_);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.setNavigationIcon(R.drawable.back_white);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
    img_crop = (CropImageView) findViewById(R.id.img_crop);
    img_crop.setInitialFrameScale(0.75f);

    img_crop.setAnimationEnabled(true);
    img_crop.setAnimationDuration(300);
    img_crop.setCropMode(CropImageView.CropMode.RATIO_3_4);
    configureDefaultImageLoader(Crop_Activity.this);
    Intent intent = getIntent();
    Bundle b = intent.getExtras();
    String path = " ";
    final String type = b.getString("type");
    path = b.getString("BitmapImage");
    Log.e("Crop_Uri>>", path.toString());
    {
        try {
            InputStream image_stream = null;

            image_stream = getContentResolver().openInputStream(Uri.parse("file://" + path.toString()));
            Bitmap bitmap1 = BitmapFactory.decodeStream(image_stream);
            if (bitmap1 != null) {
                bitmap1.recycle();
                bitmap1 = null;
            }
            ImageLoader.getInstance().displayImage(ImageDownloader.Scheme.FILE.wrap(path.toString()), img_crop);
            //  img_crop.setImageBitmap(bitmap1);
            Log.e("Image//", "//" + "yes");
        } catch (Exception e) {
            //handle exception
            Log.e("ExceptionImage>>", "//" + e);
        }
    }


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          /*  Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();*/
            if (img_crop.getImageBitmap() != null) {
                Bitmap crop_bitmap = img_crop.getCroppedBitmap();
                ByteArrayOutputStream stream = new ByteArrayOutputStream();

                File dest = new File(getFilename());
                try {
                    FileOutputStream out = new FileOutputStream(dest);
                    crop_bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                byte[] byteArray = stream.toByteArray();

                Intent intent = new Intent();
                intent.putExtra("croped_bitmap_uri", dest.getAbsolutePath());
                intent.setAction("ok");
                setResult(CROP_RESULT, intent);
                deleteFile();
                finish();
            } else {
                Toast.makeText(Crop_Activity.this, "Crop Images Not Processed !", Toast.LENGTH_SHORT).show();
            }

        }
    });
}

public String getFilename() {
    File myDirectory = new File(Environment.getExternalStorageDirectory(), "Konnect_Mom/Konnect_Mom_cropped_img");
    if (!myDirectory.exists()) {
        myDirectory.mkdirs();
    }

    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    String mImageName = "cropped_img" + ".jpg";
    String uriSting = (myDirectory.getAbsolutePath() + "/" + mImageName);
    return uriSting;

}

public void deleteFile() {
    File file = new File(Environment.getExternalStorageDirectory() + "Konnect_Mom/Konnect_Mom_cropped_img/cropped_img.jpg");
    if (file.exists()) {

        file.delete();
    }

}

public static void configureDefaultImageLoader(Context ctx) {
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().diskCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.FIFO).build();
    ImageLoader.getInstance().init(config);
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .showImageOnLoading(android.R.drawable.stat_sys_download)
            .showImageForEmptyUri(android.R.drawable.ic_dialog_alert)
            .showImageOnFail(android.R.drawable.stat_notify_error)
            .considerExifParams(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //filled width
            .build();
}

}

只需复制上面的代码并将其粘贴到标题为“CropActivity”的类中即可。之后,在您打开“相机”或“图库”以获取图片的活动中,将以下代码放在“ onActivityResult()中“方法:

 Intent i = new Intent(AddAChild.this, Crop_Activity.class);
                i.putExtra("BitmapImage", filename);
               startActivityForResult(i, CROP_RESULT);

就是这样。你很高兴。