drawImage()是否支持绘制图像圆形子集?如何实现该需求
Java AWT 绘制图像圆形区域实现方案
你当前使用的8坐标参数drawImage()方法仅支持矩形子集绘制,要实现圆形区域绘制,核心是通过Graphics的裁剪能力限制绘制范围,不需要逐像素处理图像,实现步骤如下:
- 提前保存
Graphics对象当前的原始裁剪区域,绘制完成后必须恢复,避免影响同一上下文后续的其他绘制逻辑 - 基于目标圆形的圆心坐标、半径创建正圆形的
Shape实例,使用Ellipse2D时将宽高设为2倍半径即可得到正圆 - 将
Graphics的当前裁剪区域设置为上述圆形实例 - 正常调用你提到的
drawImage()方法传入所有坐标参数,此时只有落在圆形裁剪范围内的图像内容会被输出到画布 - 执行完绘制逻辑后,将
Graphics的裁剪区域还原为初始保存的原始值
可直接复用的代码示例
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.image.ImageObserver; public void drawCircularImage(Graphics g, Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, int centerX, int centerY, int radius, ImageObserver observer) { // 备份原始裁剪区域 Shape originalClip = g.getClip(); try { // 开启抗锯齿(可选,优化圆形边缘平滑度) if (g instanceof Graphics2D g2d) { g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); } // 构造正圆裁剪区域 Shape circleClip = new Ellipse2D.Double( centerX - radius, centerY - radius, radius * 2.0, radius * 2.0 ); g.setClip(circleClip); // 调用原有drawImage逻辑完成绘制 g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); } finally { // 恢复原始裁剪区域 g.setClip(originalClip); } }
补充说明:如果你要绘制的圆形刚好填满目标矩形区域,直接把圆心设为目标矩形的中点、半径设为目标矩形宽度(或高度,正方形场景下二者相等)的1/2即可,不需要额外计算坐标。
内容的提问来源于stack exchange,提问作者Alan Tao
相关产品推荐
相关产品推荐

