마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

이미지 크롭을 다르게 하고 싶습니다.

0 추천

하고 싶은 기능은 카메라를 찍거나 앨범에서이미지를 가져온 후 크롭을 하는건데

 

startActivityForResult(intent, CROP_FROM_CAMERA);

CROP_FROM_CAMERA 이 코드가 크롭화면을 가져오는 거잖아요?

이게 안드로이드 API상에 있는 그런 코드인거 같은데

인터넷에 있는 크롭 소스를 사용하였습니다.

private void doTakePhotoAction() {
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

		// 임시로 사용할 파일의 경로를 생성
		String url = "tmp.jpg";

		mImageCaptureUri = Uri.fromFile(new File(Environment
				.getExternalStorageDirectory(), url));

		intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
				mImageCaptureUri);

		// 특정기기에서 사진을 저장못하는 문제가 있어 다음을 주석처리 합니다.
		// intent.putExtra("return-data", true);
		startActivityForResult(intent, PICK_FROM_CAMERA);

	}

	private void doTakeAlbumAction() {
		// 앨범 호출
		Intent intent = new Intent(Intent.ACTION_PICK);
		intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
		startActivityForResult(intent, PICK_FROM_ALBUM);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode != RESULT_OK) {
			return;
		}

		switch (requestCode) {
			case CROP_FROM_CAMERA: {
				// 크롭이 된 이후의 이미지를 넘겨 받습니다.
				// 이미지뷰에 이미지를 보여준다거나 부가적인 작업 이후에
				// 임시 파일을 삭제합니다.
				final Bundle extras = data.getExtras();
	
				if (extras != null) {
					Bitmap photo = extras.getParcelable("data");
					mPhotoImageView.setImageBitmap(photo);
				}
	
				// 임시 파일 삭제
				File f = new File(mImageCaptureUri.getPath());
				if (f.exists()) {
					f.delete();
				}
	
				break;
			}
	
			case PICK_FROM_ALBUM: {
				// 이후의 처리가 카메라와 같으므로 일단 break없이 진행합니다.
				// 실제 코드에서는 좀더 합리적인 방법을 선택하시기 바랍니다.
	
				mImageCaptureUri = data.getData();
			}
	
			case PICK_FROM_CAMERA: {
				// 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다.
				// 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다.
	
				Intent intent = new Intent("com.android.camera.action.CROP");
				intent.setDataAndType(mImageCaptureUri, "image/*");
	
				intent.putExtra("outputX", 100);
				intent.putExtra("outputY", 100);
				// intent.putExtra("aspectX", 1);
				// intent.putExtra("aspectY", 1);
				intent.putExtra("scale", true);
				intent.putExtra("return-data", true);
	
				startActivityForResult(intent, CROP_FROM_CAMERA);
	
				break;
			}
		}

	}

 

 

음 그래서 제가 하고 싶은건 사각형 크롭말고 자유롭게 사용자 맘대로 크롭하는 기능을 넣고 싶은데요

 

그렇다면 위 소스에서

startActivityForResult(intent, CROP_FROM_CAMERA);

여기서 이미지 크롭 어플리케이션을 호출하게 되는데

크롭 어플리케이션을 호출하지 않고

http://stackoverflow.com/questions/18439246/android-free-croping-of-image/18459072#18459072

이 링크에 있는 것처럼 자유롭게 크롭하는 화면을 호출하고 싶습니다.

cropactivity소스가

 

    ImageView compositeImageView;
    boolean crop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cropview);

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            crop = extras.getBoolean("crop");
        }
        int widthOfscreen = 0;
        int heightOfScreen = 0;

        DisplayMetrics dm = new DisplayMetrics();
        try {
            getWindowManager().getDefaultDisplay().getMetrics(dm);
        } catch (Exception ex) {
        }
        widthOfscreen = dm.widthPixels;
        heightOfScreen = dm.heightPixels;

        compositeImageView = (ImageView) findViewById(R.id.our_imageview);

        Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(),
                R.drawable.gallery_12);

        Bitmap resultingImage = Bitmap.createBitmap(widthOfscreen,
                heightOfScreen, bitmap2.getConfig());

        Canvas canvas = new Canvas(resultingImage);
        Paint paint = new Paint();
        paint.setAntiAlias(true);

        Path path = new Path();
        for (int i = 0; i < SomeView.points.size(); i++) {
            path.lineTo(SomeView.points.get(i).x, SomeView.points.get(i).y);
        }
        canvas.drawPath(path, paint);
        if (crop) {
            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));

        } else {
            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
        }
        canvas.drawBitmap(bitmap2, 0, 0, paint);
        compositeImageView.setImageBitmap(resultingImage);
    }
}

 

이렇게 되어있는데 어떻게 해줘야 할지 막막합니다.

 

좀 두서가 없는데 다시 한번 정리해볼게요

기존 크롭 코드에서

startActivityForResult(intent, CROP_FROM_CAMERA);

여기서 크롭 어플리케이션을 호출하는데 intent에 이미지가 담겨져서 옵니다.

그래서 저 intent에 있는 이미지를 cropactivity로 넘기고 싶은데

cropactivity에서

Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(),
                R.drawable.gallery_12);

이 부분이 자를 이미지를 가져오는건데 이 코드에 intent에 담긴이미지를 가져오면 되지 않을까 생각하고 있습니다.

그런데 어떻게 해줘야할지 몰라서 여쭤보게 되었습니다.

위 링크에 있는 자유롭게 크롭하기 코드를 보고 분석해보려는데 이미지처리부분은 아직 모르는게 많아서 어려움이 많습니다.

cropactivity에서 잘라 someview에서 보여주는 건지도 모르겠구요.ㅠ


브루스웨인 (8,580 포인트) 님이 2015년 2월 6일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...