You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX 如何实现图片中心圆形裁剪并保留透明背景重新保存

JavaFX 圆形图片裁剪实现(保留透明背景)

以下实现和你提供的Android裁剪代码逻辑完全对齐,支持先将图片缩放到指定半径尺寸,再从中心位置裁剪圆形,圆形外区域保持透明,可直接导出为带透明通道的PNG图片。

核心实现代码

import javafx.scene.SnapshotParameters;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javafx.embed.swing.SwingFXUtils;

/**
 * 圆形裁剪方法,对应Android的getRoundedCroppedBitmap逻辑
 * @param originalImage 原始输入图片
 * @param radius 输出圆形图片的半径(最终图片尺寸为radius*radius)
 * @return 裁剪完成的带透明背景的圆形图片
 */
public static Image getRoundedCroppedImage(Image originalImage, int radius) {
    // 缩放图片到指定半径的正方形尺寸
    ImageView imageView = new ImageView(originalImage);
    imageView.setFitWidth(radius);
    imageView.setFitHeight(radius);
    imageView.setPreserveRatio(false); // 对应Android createScaledBitmap的非比例拉伸逻辑
    imageView.setSmooth(true); // 对应Android的filterBitmap=true,开启平滑缩放

    // 配置中心圆形裁剪蒙版
    Circle clip = new Circle(
            radius / 2.0,
            radius / 2.0,
            radius / 2.0
    );
    imageView.setClip(clip);

    // 配置快照参数,保留透明背景
    SnapshotParameters params = new SnapshotParameters();
    params.setFill(Color.TRANSPARENT);
    params.setDepthBuffer(false);

    // 生成最终裁剪图片
    return imageView.snapshot(params, null);
}

// 带透明背景图片保存工具方法
public static void saveRoundedImage(Image image, File savePath) throws IOException {
    BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
    ImageIO.write(bufferedImage, "PNG", savePath);
}

使用示例

// 加载原始图片
Image originalImg = new Image(new File("本地原图路径.png").toURI().toString());
// 裁剪为半径200px的圆形图片
Image roundedImg = getRoundedCroppedImage(originalImg, 200);
// 保存到本地
saveRoundedImage(roundedImg, new File("裁剪后输出路径.png"));

注意事项

  • 若需要保持原图比例避免拉伸变形,可将imageView.setPreserveRatio(false)修改为true
  • 仅需在JavaFX界面展示圆形图片时,不需要调用快照和保存方法,直接将设置了clip的ImageView添加到界面节点即可
  • Java 11及以上版本使用SwingFXUtils导出图片时,需要额外引入javafx.swing模块,无需导出功能可删除相关导入和保存方法

内容的提问来源于stack exchange,提问作者user13954958

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:48:04