본문 바로가기

안드로이드

Android Java 갤러리 다중이미지 가져와서 연속크랍(Crop)

 

implementation 'com.github.yalantis:ucrop:2.2.5'

 

 

1.갤러리 호출 

private void getImageUri() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, 2222);
    
}

 

 

2.사진 선택후 onActivityResult에서  crop 라이브러리 호출

List<Uri> imageUris = new ArrayList<>(); // 갤러리에서선택된 이미지 리스트
List<Uri> cropedUris = new ArrayList<>(); //크랍 처리된 이미지 리스트
int cropCount = 0; //이미지 개수


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

    if (requestCode == 2222 && resultCode == RESULT_OK) {
        if (data == null) {
            Toast.makeText(getApplicationContext(), "이미지를 선택하지 않았습니다.", Toast.LENGTH_LONG).show();
        } else {
            if (data.getClipData() == null) {
                Log.e("single choice: ", String.valueOf(data.getData()));

            } else {      // 이미지를 여러장 선택한 경우
                imageUris.clear();
                cropedUris.clear();
                cropCount = 0;

                ClipData clipData = data.getClipData();

                if (clipData.getItemCount() > 5) { //개수 제한 
                    Toast.makeText(getApplicationContext(), "사진은 5장까지 선택 가능합니다.", Toast.LENGTH_LONG).show();
                } else {
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        Uri imageUri = clipData.getItemAt(i).getUri();
                        imageUris.add(imageUri);
                    }

                    if (imageUris.size() > 0) {
                        callCrop(0, imageUris.get(0));
                    }


                }
            }
        }
    } else if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
        final Uri resultUri = UCrop.getOutput(data);

        cropedUris.add(resultUri);
        cropCount++;

        if (cropCount == imageUris.size()) {
            showImages();
        } else {
            callCrop(cropCount, imageUris.get(cropCount));
        }

    }
}

 

3.crop 요청 (요청후에는 UCrop.REQUEST_CROP)를 타게된다.

private void callCrop(int i, Uri imageUri) {
    UCrop uCrop = null; //uCrop 라이브러이 이용해서 이미지 크롭
    UCrop.Options options = new UCrop.Options();
    options.setCompressionQuality(50);
    try {
        uCrop = UCrop.of(imageUri, Uri.fromFile(createImageFile()));
    } catch (IOException e) {
        e.printStackTrace();
    }
    uCrop.withOptions(options);

    uCrop.withAspectRatio(200, 200);
    uCrop.start(baseActivity);
}

 

 

4.이미지 파일 생성

private File createImageFile() throws IOException { //크랍된 이미지 파일 생성

    String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    String tempImg = "temp_" + timeStamp + "";
    File storageDir = new File(getFilesDir() + "/mz/"); 

    if (!storageDir.exists()) {
        storageDir.mkdirs();
    }
    File image = File.createTempFile(
            tempImg,
            ".jpg",
            storageDir
    );

    return image;
}

 

5.이미지 보여주기

private void showImages() {
    for (int i = 0; i < cropedUris.size(); i++) {
        String filepath = cropedUris.get(i).getPath();

        //파일 경로로 Glide등을 이용해서 이미지 뷰에 보여주면 됩니다.
        Glide.with(mContext).load(filepath).error(R.drawable.thumbnail_no_img).into(img01);

}