使用PorterDuffXfermode和Path(行集合)切割后保存位图

时间:2017-04-21 18:26:07

标签: java android image image-processing bitmap

我需要使用多边形蒙版保存Bitmap。我尝试了this question,但是在那里绘制图像而不是保存。我认为会是这样的:

//Creates Bitmaps
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap original = BitmapFactory.decodeFile(path, options);
Bitmap result = Bitmap.createBitmap(200, 200, Config.ARGB_8888);

//Creates the file
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "name".png");
OutputStream fOut = new FileOutputStream(file);

//Sets PorterDuff
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);;
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

//Sets the polygonal path
Path path = new Path();
path.moveTo(200,200);
path.lineTo(400,200);
path.lineTo(400,400);
path.lineTo(200,400);
path.close();

//Saves the image. The problem is here: how can one define result to be the cropping of the image with the path?
result.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
if (fOut != null) {
    fOut.close();
}
//

那么,我该怎么办? 如何定义 result 作为带路径的图像裁剪?

1 个答案:

答案 0 :(得分:0)

这不是最佳解决方案,但它可以完成任务:

BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap original = BitmapFactory.decodeFile(path, options);
try {
    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "name".png");
    OutputStream fOut = new FileOutputStream(file);

    //The size of the two bitmaps below should be equal
    Bitmap resultImg = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
    Bitmap maskImg = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);

    Canvas mCanvas = new Canvas(resultImg);
    Canvas maskCanvas = new Canvas(maskImg);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL);
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_ATOP));

    Path path = new Path();
    path.moveTo(200,200);
    path.lineTo(400,200);
    path.lineTo(400,400);
    path.lineTo(200,400);
    path.close();

    maskCanvas.drawPath(path, paint);
    mCanvas.drawBitmap(original, 0, 0, null);
    //The following should have appropriate x,y for the path(here 200)
    mCanvas.drawBitmap(maskImg, 200, 200, paint);

    resultImg.compress(Bitmap.CompressFormat.PNG, 100, fOut);
    fOut.flush();

if (fOut != null) {
    fOut.close();
}
} catch (IOException e){
    e.printStackTrace();
}