在android中以不规则形状裁剪图像无法正常工作

Posted

技术标签:

【中文标题】在android中以不规则形状裁剪图像无法正常工作【英文标题】:Cropping image in irregular shape in android not working proper 【发布时间】:2016-10-04 04:42:13 【问题描述】:

大家好,我正在使用FlexiCrop 并尝试以不规则形状裁剪图像,我的活动代码如下所示

public class CropActivity 
extends Activity implements OnTouchListener 
    private Uri mImageCaptureUri;
    private ImageView drawImageView;
    private Bitmap sourceBitmap;
    private Path clipPath;

    private static final int PICK_FROM_FILE = 1;
    private static final int CAMERA_CAPTURE = 2;

    Bitmap bmp;
    Bitmap alteredBitmap;
    Canvas canvas;
    Paint paint;
    Matrix matrix;
    float downx = 0;
    float downy = 0;
    float upx = 0;
    float upy = 0;


    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);     
        setContentView(R.layout.crop);
        final String [] items           = new String [] "Take from camera", "Select from gallery";                
        ArrayAdapter<String> adapter    = new ArrayAdapter<String> (this, android.R.layout.select_dialog_item,items);
        AlertDialog.Builder builder     = new AlertDialog.Builder(this);

        builder.setTitle("Select Image");
        builder.setAdapter( adapter, new DialogInterface.OnClickListener() 
            public void onClick( DialogInterface dialog, int item )  //pick from camera
                if (item == 0) 
                    try 
                        //use standard intent to capture an image
                        Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        //we will handle the returned data in onActivityResult
                        startActivityForResult(captureIntent, CAMERA_CAPTURE);
                     catch(ActivityNotFoundException e)
                        e.printStackTrace();
                     catch(Exception e) 
                        e.printStackTrace();
                    
                 else  //pick from file
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE);
                
            
         );

        final AlertDialog dialog = builder.create();

        Button button   = (Button) findViewById(R.id.btn_crop);
        Button saveButton   = (Button) findViewById(R.id.btn_save);
        Button discardButton    = (Button) findViewById(R.id.btn_discard);

        drawImageView = (ImageView) findViewById(R.id.DrawImageView);
        drawImageView.setOnTouchListener(this);

        button.setOnClickListener(new View.OnClickListener()   
            @Override
            public void onClick(View v) 
                dialog.show();
            
        );

        saveButton.setOnClickListener(new View.OnClickListener()   
            @Override
            public void onClick(View v) 
                try 
                    String path = Environment.getExternalStorageDirectory().toString();
                    OutputStream fOut = null;
                    File file = new File(path, String.valueOf(Math.round(Math.random()*100000))+".jpg");
                    fOut = new FileOutputStream(file);

                    alteredBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                    fOut.flush();
                    fOut.close();

                    MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
                    AlertDialog.Builder builder     = new AlertDialog.Builder(StickersCreator.this);
                    builder.setMessage("Saved");
                    AlertDialog dialog = builder.create();
                    dialog.show();

                    //Now deleting the temporary file created on camera capture
                    File f = new File(mImageCaptureUri.getPath());            
                    if (f.exists()) 
                        f.delete();
                    

                 catch (Exception e) 
                       e.printStackTrace();
                
            
        );

        discardButton.setOnClickListener(new View.OnClickListener()    
            @Override
            public void onClick(View v) 
                if (mImageCaptureUri != null) 
                    //Now deleting the temporary file created on camera capture
                    File f = new File(mImageCaptureUri.getPath());            
                    if (f.exists()) 
                        f.delete();
                    

                    getContentResolver().delete(mImageCaptureUri, null, null );
                    mImageCaptureUri = null;
                    //resetting the image view
                    ImageView iv = (ImageView) findViewById(R.id.DrawImageView);
                    iv.setImageDrawable(null);


                
            
        );
    

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

            case PICK_FROM_FILE: 
                mImageCaptureUri = data.getData();
                doCrop();
                break;

            case CAMERA_CAPTURE:
                mImageCaptureUri = data.getData();
                doCrop();
                break;
        
    
    @Override
    public boolean onTouch(View v, MotionEvent event) 
        int action = event.getAction();
        switch (action) 
        case MotionEvent.ACTION_DOWN:
          downx = event.getX();
          downy = event.getY();
          clipPath = new Path();
          clipPath.moveTo(downx, downy);
          break;
        case MotionEvent.ACTION_MOVE:
          upx = event.getX();
          upy = event.getY();
          canvas.drawLine(downx, downy, upx, upy, paint);
          clipPath.lineTo(upx, upy);
          drawImageView.invalidate();
          downx = upx;
          downy = upy;
          break;
        case MotionEvent.ACTION_UP:
          upx = event.getX();
          upy = event.getY();
          canvas.drawLine(downx, downy, upx, upy, paint);
          clipPath.lineTo(upx, upy);
          drawImageView.invalidate();
          cropImageByPath();
          break;
        case MotionEvent.ACTION_CANCEL:
          break;
        default:
          break;
        
        return true;
    

    private void cropImageByPath() 
        //closing the path now.
        clipPath.close();
        //setting the fill type to inverse, so that the outer part of the selected path gets filled.
        clipPath.setFillType(FillType.INVERSE_WINDING);
        Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        xferPaint.setColor(Color.BLACK);
        canvas.drawPath(clipPath, xferPaint);
        xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        canvas.drawBitmap(alteredBitmap, 0, 0, xferPaint);
    

    private void doCrop() 
        try 
                sourceBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);
                BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
                bmpFactoryOptions.inJustDecodeBounds = true;
                bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
                        mImageCaptureUri), null, bmpFactoryOptions);
                bmpFactoryOptions.inJustDecodeBounds = false;
                bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
                        mImageCaptureUri), null, bmpFactoryOptions);
                alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp
                    .getHeight(), bmp.getConfig());
                canvas = new Canvas(alteredBitmap);
                paint = new Paint();
                paint.setColor(Color.GREEN);
                paint.setStrokeWidth(5);
                matrix = new Matrix();
                canvas.drawBitmap(bmp, matrix, paint);
                //loading the image bitmap in image view
                drawImageView.setImageBitmap(alteredBitmap);
                //setting the touch listener
                drawImageView.setOnTouchListener(this);
             catch (FileNotFoundException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
            
    

它正在裁剪图像,但是当我为裁剪形状绘制绘制形状时,从我触摸的地方很远的点开始绘制形状,它从我触摸到的视图中向上绘制形状,请任何人都可以建议我在这里做错了什么

firs 是原始图像,当我在键盘上画一个很大的圆圈时,它会在离键盘很远的地方裁剪,而第二个图像的圆圈很小 我在键盘上画了一个圆圈,但它是从上面裁剪出来的,而且圆圈的大小也很小

【问题讨论】:

如果可能的话附上截图 我有atteched屏幕和描述请看一下 Android: Free Croping of Image的可能重复 在这里查看:***.com/questions/18439246/… 我已经尝试过您的解决方案,但它不适合我 【参考方案1】:

我已经使用Android: Free Croping of Image 解决并完全设置了这种图像的裁剪和保存,并进行了一些修改,以便我自己选择图像并在屏幕上调整图像,我的代码如下所示

public class SomeView extends View implements OnTouchListener 
private Paint paint;
public static List<Point> points;
int DIST = 2;
boolean flgPathDraw = true;
public Uri orignalUri;
float origianlheight=0.0f,originalwidth=0.0f,heightratio=0.0f,widthratio=0.0f;
public static int REQUEST_CODE=2;
Point mfirstpoint = null;
boolean bfirstpoint = false;

Point mlastpoint = null;
boolean cropflag=false;

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.bg_crop);
Context mContext;


public void setBitmap(Bitmap bmp,Uri uri)
    orignalUri=uri;
    points = new ArrayList<Point>();
    setFocusable(true);
    setFocusableInTouchMode(true);

    DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;
    origianlheight=bmp.getHeight();
    originalwidth=bmp.getWidth();
    //if(origianlheight>originalwidth)
        heightratio=height/origianlheight;
  //  else
        widthratio=width/originalwidth;
  //  
    bitmap=bmp;
    bitmap=Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth()*widthratio),(int)(bmp.getHeight()*heightratio), true);

 // bitmap=bmp;
  paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  paint.setStyle(Paint.Style.STROKE);
  paint.setPathEffect(new DashPathEffect(new float[]  10, 20 , 0));
  paint.setStrokeWidth(5);
  paint.setColor(Color.WHITE);

  flgPathDraw = true;
  this.setOnTouchListener(this);
  points = new ArrayList<Point>();
  bfirstpoint = false;
  cropflag=false;


public void clear()
     setFocusable(true);
     setFocusableInTouchMode(true);
     paint = new Paint(Paint.ANTI_ALIAS_FLAG);
     paint.setStyle(Paint.Style.STROKE);
     paint.setPathEffect(new DashPathEffect(new float[]  10, 20 , 0));
     paint.setStrokeWidth(5);
     paint.setColor(Color.WHITE);
     this.setOnTouchListener(this);
     points = new ArrayList<Point>();

     bfirstpoint = false;
     flgPathDraw = true;
     cropflag=false;
     invalidate();


public SomeView(Context c) 
    super(c);

    mContext = c;
    setFocusable(true);
    setFocusableInTouchMode(true);

    DisplayMetrics metrics = c.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;
    origianlheight=bitmap.getHeight();
    originalwidth=bitmap.getWidth();
    //if(origianlheight>originalwidth)
        heightratio=height/origianlheight;
  //  else
        widthratio=width/originalwidth;
  //  
    bitmap=Bitmap.createScaledBitmap(bitmap, (int)(originalwidth*widthratio),(int)(origianlheight*heightratio), true);



    paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    paint.setStyle(Paint.Style.STROKE);
    paint.setPathEffect(new DashPathEffect(new float[]  10, 20 , 0));
    paint.setStrokeWidth(5);
    paint.setColor(Color.WHITE);

    this.setOnTouchListener(this);
    points = new ArrayList<Point>();

    bfirstpoint = false;
    flgPathDraw = true;
    cropflag=false;


public SomeView(Context context, AttributeSet attrs) 
    super(context, attrs);
    mContext = context;
    setFocusable(true);
    setFocusableInTouchMode(true);

    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;
    origianlheight=bitmap.getHeight();
    originalwidth=bitmap.getWidth();
    //if(origianlheight>originalwidth)
        heightratio=height/origianlheight;
  //  else
        widthratio=width/originalwidth;
  //  
    bitmap=Bitmap.createScaledBitmap(bitmap, (int)(originalwidth*widthratio),(int)(origianlheight*heightratio), true);

    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setStyle(Paint.Style.STROKE);
    paint.setPathEffect(new DashPathEffect(new float[]  10, 20 , 0));
    paint.setStrokeWidth(5);
    paint.setColor(Color.WHITE);
    this.setOnTouchListener(this);
    points = new ArrayList<Point>();
    bfirstpoint = false;
    flgPathDraw = true;
    cropflag=false;




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

    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);

@Override
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();
                    cropflag=true;
             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();
                    cropflag=true;

                
            
        
    

    return true;


private boolean comparepoint(Point first, Point current) 
    int left_range_x = (int) (current.x - 3);
    int left_range_y = (int) (current.y - 3);

    int right_range_x = (int) (current.x + 3);
    int right_range_y = (int) (current.y + 3);

    if ((left_range_x < first.x && first.x < right_range_x)
            && (left_range_y < first.y && first.y < right_range_y)) 
        if (points.size() < 10) 
            return false;
         else 
            return true;
        
     else 
        return false;
    



public void fillinPartofPath() 
    Point point = new Point();
    point.x = points.get(0).x;
    point.y = points.get(0).y;

    points.add(point);
    invalidate();


public void resetView() 
    points.clear();
    paint.setColor(Color.WHITE);
    paint.setStyle(Style.STROKE);
    flgPathDraw = true;
    invalidate();


 /*  private void showcropdialog() 
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() 
        @Override
        public void onClick(DialogInterface dialog, int which) 
            Intent intent;
            switch (which) 
            case DialogInterface.BUTTON_POSITIVE:
                // Yes button clicked
                // bfirstpoint = false;

                intent = new Intent(mContext, CropActivity.class);
                intent.putExtra("crop", true);
                intent.putExtra("heightratio", heightratio);
                intent.putExtra("widthratio", widthratio);
                intent.putExtra("URI", orignalUri.toString());
                mContext.startActivity(intent);
                break;

            case DialogInterface.BUTTON_NEGATIVE:
                // No button clicked

                intent = new Intent(mContext, CropActivity.class);
                intent.putExtra("crop", false);
                intent.putExtra("heightratio", heightratio);
                intent.putExtra("widthratio", widthratio);
                intent.putExtra("URI", orignalUri.toString());
                mContext.startActivity(intent);

                bfirstpoint = false;
                // resetView();

                break;
            
        
    ;

    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    builder.setMessage("Do you Want to save Crop or Non-crop image?")
            .setPositiveButton("Crop", dialogClickListener)
            .setNegativeButton("Non-crop", dialogClickListener).show()
            .setCancelable(false);
*/

public void Crop()
    if(cropflag)
        Intent intent;
        intent = new Intent(mContext, CropActivity.class);
        intent.putExtra("crop", true);
        intent.putExtra("heightratio", heightratio);
        intent.putExtra("widthratio", widthratio);
        intent.putExtra("URI", orignalUri.toString());
        ((Activity)mContext).startActivityForResult(intent,REQUEST_CODE);
    

我根据裁剪图像和动态设置位图对此类进行了更改

接下来是在设计 xml 中使用一些视图的活动,例如

public class StickersCreator 
extends Activity
ImageButton btnCapture,btnChooseFromlib,btnClear;
Button btnCrop;
SomeView someView;
private static final String RESULT_BUNDLE_EXTAS = "RESULT_BUNDLE_EXTAS";
private static final String RESULT_BUNDLE_DATA = "RESULT_BUNDLE_DATA";
private static final String RESULT_BUNDLE_REQUEST_CODE = "RESULT_BUNDLE_REQUEST_CODE";
private static final String RESULT_BUNDLE_RESULT_CODE = "RESULT_BUNDLE_RESULT_CODE";

private static final int REQUEST_PICK_IMAGE = 0;
private static final int REQUEST_CAPTURE_IMAGE = 1;
private static final int REQUEST_CROP=2;
private Uri captureImageUri;
private Bundle resultBundle;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_stickers_creator);
    btnCrop=(Button)findViewById(R.id.btnCrop);
    btnCapture=(ImageButton)findViewById(R.id.BtnCapture);
    btnClear=(ImageButton)findViewById(R.id.btnClear);
    btnChooseFromlib=(ImageButton)findViewById(R.id.btnChoosefromLib);
    someView=(SomeView)findViewById(R.id.someView);
    btnCrop.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            someView.Crop();
        
    );
    btnClear.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            someView.clear();

        
    );
    btnCapture.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 


            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            captureImageUri = null;
            try 
                String storageState = Environment.getExternalStorageState();
                if (TextUtils.equals(storageState, Environment.MEDIA_MOUNTED)) 
                    String path = Environment.getExternalStorageDirectory()
                            .getAbsolutePath()
                            + File.separatorChar
                            + "Android/data/"
                            + getApplicationContext().getPackageName()
                            + "/files/";
                    File directory = new File(path);
                    directory.mkdirs();
                    File file = new File(directory,
                            Integer.toHexString((int) System
                                    .currentTimeMillis()) + ".jpg");
                    file.createNewFile();

                    captureImageUri = Uri.fromFile(file);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, captureImageUri);
                

             catch (IOException e) 
                if (BuildConfig.DEBUG) 
                    Log.w("FrameEditor",
                            "Can not create temp file for image capture "
                                    + e.getMessage());
                
            
            startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);


        
    );

    btnChooseFromlib.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            Intent intent = new Intent(Intent.ACTION_PICK,
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(intent, REQUEST_PICK_IMAGE);

        
    );



@Override
protected void onActivityResult(int requestCode, int resultCode,Intent intent) 
    resultBundle = new Bundle();
    if (intent != null) 
        Bundle extras = intent.getExtras();
        resultBundle.putBundle(RESULT_BUNDLE_EXTAS, extras);
        Uri uriData = intent.getData();
        if (uriData != null) 
            resultBundle.putParcelable(RESULT_BUNDLE_DATA, uriData);
        
    

    resultBundle.putInt(RESULT_BUNDLE_REQUEST_CODE, requestCode);
    resultBundle.putInt(RESULT_BUNDLE_RESULT_CODE, resultCode);

    super.onActivityResult(requestCode, resultCode, intent);

    handleActivityResult();


private void handleActivityResult() 
    if (resultBundle == null) 
        return;
    
    int requestCode = resultBundle.getInt(RESULT_BUNDLE_REQUEST_CODE);
    int resultCode = resultBundle.getInt(RESULT_BUNDLE_RESULT_CODE);
    Uri dataUri = resultBundle.getParcelable(RESULT_BUNDLE_DATA);
    switch (requestCode) 
    case REQUEST_PICK_IMAGE: 
        if (resultCode == RESULT_OK) 
            if (dataUri != null) 

                String[] filePathColumn =  MediaStore.Images.Media.DATA ;

                Cursor cursor = getContentResolver().query(dataUri,
                        filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor
                        .getColumnIndex(MediaStore.Images.Media.DATA);
                String filePath = cursor.getString(columnIndex);
                cursor.close();


                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                Bitmap bitmap1 = BitmapFactory.decodeFile(filePath, options);
                Uri uri=Uri.fromFile(new File(filePath));
                someView.setBitmap(bitmap1,uri);
                // Intend for EditorActivity

            
        
        break;
    
    case REQUEST_CAPTURE_IMAGE: 
        if (resultCode == RESULT_OK) 
            if (captureImageUri != null) 
                // Intend for EditorActivity

                try 
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), captureImageUri);
                    someView.setBitmap(bitmap,captureImageUri);
                 catch (FileNotFoundException e) 
                    e.printStackTrace();
                 catch (IOException e) 
                    e.printStackTrace();
                


            
        
        break;

    
    case REQUEST_CROP:
        
    
    
    resultBundle = null;




此贴纸创建者活动允许用户清除裁剪和从媒体中选择图像或捕获图像然后裁剪图像

public class CropActivity extends Activity 
ImageView compositeImageView;
boolean crop;

Bitmap resultingImage;
Uri imageUri;
Button btnDone,btnCancel;
float heightratio=0.0f,widthratio=0.0f;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_crop);

    btnDone=(Button)findViewById(R.id.btnDone);
    btnCancel=(Button)findViewById(R.id.btnCancel);
    btnCancel.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v)                
            Intent intent = new Intent(CropActivity.this, StickersCreator.class);
            setResult(RESULT_CANCELED);
            finish();
        
    );
    btnDone.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
             int widthOfscreen = 0;
            FileOutputStream out = null;
            try 

                Long tsLong = System.currentTimeMillis()/1000;
                String ts = tsLong.toString();

                File Filename=new File(getFilesDir(),ts+".png");
                //File Filename1=new File(getFilesDir(),"EPICBATTLE"+((Long)(System.currentTimeMillis()/1000)).toString()+"_ico.png");
                out = new FileOutputStream(Filename);
                resultingImage.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
                // PNG is a lossless format, the compression factor (100) is ignored

             catch (Exception e) 
                e.printStackTrace();
             finally 
                try 
                    if (out != null) 
                        out.close();
                    
                 catch (IOException e) 
                    e.printStackTrace();
                
            

            Intent intent = new Intent(CropActivity.this, StickersCreator.class);
            setResult(RESULT_OK);
            finish();

        
    );

    Bundle extras = getIntent().getExtras();
    if (extras != null) 
        crop = extras.getBoolean("crop");
        heightratio=extras.getFloat("heightratio");
        widthratio=extras.getFloat("widthratio");
        imageUri=Uri.parse(extras.getString("URI"));
       // byte[] byteArray = getIntent().getByteArrayExtra("image");
       // bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    
    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.imageView1);

    Bitmap bitmap2=null;
    try 

        bitmap2 = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
     catch (FileNotFoundException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    
    bitmap2=Bitmap.createScaledBitmap(bitmap2, (int)(bitmap2.getWidth()*widthratio),(int)(bitmap2.getHeight()*heightratio), true);

    resultingImage = Bitmap.createBitmap(widthOfscreen,
            heightOfScreen, bitmap2.getConfig());
   // resultingImage=CropBitmapTransparency(resultingImage);
    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);
    resultingImage=CropBitmapTransparency(resultingImage);
    compositeImageView.setImageBitmap(resultingImage);//setImageBitmap(resultingImage);


Bitmap CropBitmapTransparency(Bitmap sourceBitmap)
    int minX = sourceBitmap.getWidth();
    int minY = sourceBitmap.getHeight();
    int maxX = -1;
    int maxY = -1;
    for(int y = 0; y < sourceBitmap.getHeight(); y++)
    
        for(int x = 0; x < sourceBitmap.getWidth(); x++)
        
            int alpha = (sourceBitmap.getPixel(x, y) >> 24) & 255;
            if(alpha > 0)   // pixel is not 100% transparent
            
                if(x < minX)
                    minX = x;
                if(x > maxX)
                    maxX = x;
                if(y < minY)
                    minY = y;
                if(y > maxY)
                    maxY = y;
            
        
    
    if((maxX < minX) || (maxY < minY))
        return null; // Bitmap is entirely transparent

    // crop bitmap to non-transparent area and return:
    return Bitmap.createBitmap(sourceBitmap, minX, minY, (maxX - minX) + 1, (maxY - minY) + 1);

此裁剪活动在按下完成按钮时将裁剪后的图像保存在内存中

【讨论】:

以上是关于在android中以不规则形状裁剪图像无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在Android中以给定的正方形大小裁剪图像?

在android中对图像进行手绘裁剪

从图库中裁剪的 android-image 无法正常工作

图像的自定义裁剪无法正常工作

裁剪不规则形状的图像

自定义图像裁剪器android