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

이미지 자유자재로 crop하는 방법 알려주세요 ㅠㅠ

0 추천

이미지를 앨범에서 불러와서 정사각형이 아닌 자유자제로 crop 을 하려는데

앨범 들어오는 것 까지는 되는데 선택을 하면 에러가 나네요...

 

 

cameraActivity.java

switch(requestCode)
    {
      case CROP_FROM_CAMERA:
      {
       
         final Bundle extras = data.getExtras();
         
          
          File f = new File(mImageCaptureUri.getPath());
          if(f.exists())
          {
            f.delete();
          }

          break;

      }

      case PICK_FROM_ALBUM:
      {
        mImageCaptureUri = data.getData();
      }

      case PICK_FROM_CAMERA:
      {
       //Intent intent = new Intent("com.android.camera.action.CROP");
       Intent intent = new Intent("org.androidtown.mix.CropActivity");
       intent.setDataAndType(mImageCaptureUri, "image/*");
       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.image);

          
           //Bitmap
            photo = extras.getParcelable("data");
             mPhotoImageView.setImageBitmap(photo);
           
       
          //Bitmap photo = extras.getParcelable("data");
          //CameraActivity.mPhotoImageView.setImageBitmap(photo);

          Bitmap resultingImage = Bitmap.createBitmap(widthOfscreen,
                  heightOfScreen, bitmap.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(bitmap, 0, 0, paint);
          compositeImageView.setImageBitmap(resultingImage);
/*
        intent.putExtra("outputX", 90);
        intent.putExtra("outputY", 90);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);*/
        
        startActivityForResult(getIntent(), CROP_FROM_CAMERA);

        break;
      }
    }
  }
뚜비뚜밥 (220 포인트) 님이 2014년 8월 9일 질문

1개의 답변

0 추천

SomeView.java  일부 입니다.

 public void onDraw(Canvas canvas) {
        canvas.drawBitmap(bitmap, 0, 0, null);

        Path path = new Path();
        boolean first = true;

        for (int i = 0; i < points.size(); i += 2) {
            Point point = points.get(i);
            if (first) {
                first = false;
                path.moveTo(point.x, point.y);
            } else if (i < points.size() - 1) {
                Point next = points.get(i + 1);
                path.quadTo(point.x, point.y, next.x, next.y);
            } else {
                mlastpoint = points.get(i);
                path.lineTo(point.x, point.y);
            }
        }
        canvas.drawPath(path, paint);
    }

    public boolean onTouch(View view, MotionEvent event) {
        // if(event.getAction() != MotionEvent.ACTION_DOWN)
        // return super.onTouchEvent(event);

        Point point = new Point();
        point.x = (int) event.getX();
        point.y = (int) event.getY();

        if (flgPathDraw) {

            if (bfirstpoint) {

                if (comparepoint(mfirstpoint, point)) {
                    // points.add(point);
                    points.add(mfirstpoint);
                        flgPathDraw = false;
                                        showcropdialog();
                } else {
                    points.add(point);
                }
            } else {
                points.add(point);
            }

            if (!(bfirstpoint)) {

                mfirstpoint = point;
                bfirstpoint = true;
            }
        }

        invalidate();
        Log.e("Hi  ==>", "Size: " + point.x + " " + point.y);

        if (event.getAction() == MotionEvent.ACTION_UP) {
            Log.d("Action up*******~~~~~~~>>>>", "called");
            mlastpoint = point;
            if (flgPathDraw) {
                if (points.size() > 12) {
                    if (!comparepoint(mfirstpoint, mlastpoint)) {
                        flgPathDraw = false;
                        points.add(mfirstpoint);
                        showcropdialog();
                    }
                }
            }
        }

        return true;
    }

 

뚜비뚜밥 (220 포인트) 님이 2014년 8월 9일 답변
...