GeXiangDong

精通Java、SQL、Spring的拼写,擅长Linux、Windows的开关机

0%

java Graphics2D 画一个透明的圆,在现有图片上镂空一部分

首先这个标题不准确,需要的结果类似下图,注意中间圆形部分是透明的

镂空一个圆形

circle-transpant

Graphics2D提供方法clearRect,可以清除出一个矩形区域,但没有clearCircle或者clearArc, clearEllipse等,通过清除的来实现不太可能。

实现思路可从描画部分入手,使用 Graphics2D 的 setClip 方法,在描画前把那个要剪出来的圆排除在外。 参照如下代码

1
2
3
4
5
6
7
Area a = new Area(new Rectangle(0, 0, 1200, 1200));
Ellipse2D circle = new Ellipse2D.Float(100, 100, 1000, 1000);
a.subtract(new Area(circle));
g.setClip(a);
g.setColor(new Color(255, 255, 192));
g.fillRect(0, 0, 1200, 1200);

金保留文字部分,其余部分镂空

把一张图除文字外的部分剔除掉,实现如下图所示效果

circle-transpant

也是利用 graphics2d 的 setClip 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// g 是新图的graphics2D,目标图(对应上图右侧),bgImg是原图(对应上图左侧)
FontRenderContext frc = g.getFontRenderContext();
Font font = arial.deriveFont(Font.BOLD, 260);
GlyphVector gv = font.createGlyphVector(frc, "10");
Rectangle2D box = gv.getVisualBounds();

// 计算文字轮廓放置位置(中央)
int xOff = (int) (bgImg.getWidth() - box.getWidth()) / 2;
int yOff = (int) (bgImg.getHeight() + box.getHeight()) / 2;
// xOff, yOff是文字轮廓左下角的坐标
Shape shape = gv.getOutline(xOff, yOff);
g.setClip(shape);
g.drawImage(bgImg, 0, 0, null);
g.setClip(null);

// 上面的例子图形文字有边框,如果需要,可用如下方式描画边框
g.setStroke(new BasicStroke(1f));
g.setColor(Color.RED);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.draw(shape);