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
相关产品推荐
相关产品推荐

