JavaFX裁剪图像为圆形



我想圈裁切图像文件透明的背景,并再次保存它。这是在android中工作的代码,但我是JavaFX的新手。这个代码从中心像圆一样裁剪图像。我想在JavaFX中做到这一点!

public static Bitmap getRoundedCroppedBitmap(Bitmap bitmap, int radius) {
Bitmap finalBitmap;
if (bitmap.getWidth() != radius || bitmap.getHeight() != radius)
finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, false);
else
finalBitmap = bitmap;
Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(), finalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, finalBitmap.getWidth(), finalBitmap.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#BAB399"));
canvas.drawCircle(finalBitmap.getWidth() / 2 + 0.7f, finalBitmap.getHeight() / 2 + 0.7f,
finalBitmap.getWidth() / 2 + 0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(finalBitmap, rect, rect, paint);
return output;
}

Node的Clip属性:

指定用于定义此剪切形状的Node节点。类中此裁剪节点不是此节点的子节点场景图感知。相反,它被用来定义这个剪辑节点。

下面是你如何使用它来实现你的目标:

private static Image getRoundedImage(Image image, double radius) {
Circle clip = new Circle(image.getWidth() / 2, image.getHeight() / 2, radius);
ImageView imageView = new ImageView(image);
imageView.setClip(clip);
SnapshotParameters parameters = new SnapshotParameters();
parameters.setFill(Color.TRANSPARENT);
return imageView.snapshot(parameters, null);
}

我自己找到解决办法,放在这里。

private Image getRoundImage(Image image, int radius) {
int width = (int) image.getWidth();
int height = (int) image.getHeight();
WritableImage wImage = new WritableImage(radius * 2, radius * 2);
PixelWriter pixelWriter = wImage.getPixelWriter();
PixelReader pixelReader = image.getPixelReader();
Color c1 = new Color(0, 0, 0, 0);
int w = (width / 2);
int h = (height / 2);
int r = radius * radius;
for (int i = (width / 2) - radius, k = 0; i < w + radius; i++, k++)
for (int j = (height / 2) - radius, b = 0; j < h + radius; j++, b++) {
if ((i - w) * (i - w) + (j - h) * (j - h) > r)
pixelWriter.setColor(k, b, c1);
else
pixelWriter.setColor(k, b, pixelReader.getColor(i, j));
}
return wImage;
}

最新更新