我需要使用多边形蒙版保存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
作为带路径的图像裁剪?
答案 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();
}