하고 싶은 기능은 카메라를 찍거나 앨범에서이미지를 가져온 후 크롭을 하는건데
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에서 보여주는 건지도 모르겠구요.ㅠ