gpt4 book ai didi

java - 如何使用 Graphics 对象 g 绘制透明形状?

转载 作者:行者123 更新时间:2023-12-01 19:31:36 27 4
gpt4 key购买 nike

我想在BufferedImage中创建一个“环”具有透明背景。我可以像这样绘制具有透明背景的圆圈:

BufferedImage bi = new BufferedImage(d, d, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) bi.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(c);
g.fillOval(0, 0, d, d);

但现在我想在它的中间画一个较小的透明圆圈来制作一个环(所以当我在另一个图像上绘制这个图像时,环周围和内部的像素不会被绘制)。我想使用Graphics反对这样做,以便我可以使用抗锯齿功能。

这可能吗?如果不是,解决这个问题的最佳方法是什么?

最佳答案

创建一个圆形形状,然后从中减去另一个圆形形状,将其设置为剪辑,您最终可能会得到所需的东西。要隐藏剪辑的粗糙边缘,请绘制 2 像素宽的形状描边。

One ring

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class OneRing {

OneRing(BufferedImage imageBG, BufferedImage imageFG) {
// presumes the images are identical in size BNI
int w = imageBG.getWidth();
int h = imageBG.getHeight();
Ellipse2D.Double ellipse1 = new Ellipse2D.Double(
w/16,h/16,7*w/8,7*h/8);
Ellipse2D.Double ellipse2 = new Ellipse2D.Double(
w/4,h/4,w/2,h/2);
Area circle = new Area(ellipse1);
circle.subtract(new Area(ellipse2));

Graphics2D g = imageBG.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g.setClip(circle);
g.drawImage(imageFG, 0, 0, null);
g.setClip(null);
Stroke s = new BasicStroke(2);
g.setStroke(s);
g.setColor(Color.BLACK);
g.draw(circle);
g.dispose();

JLabel l = new JLabel(new ImageIcon(imageBG));
JOptionPane.showMessageDialog(null, l);
}

public static void main(String[] args) throws Exception {
URL urlFG = new URL("/image/OVOg3.jpg");
URL urlBG = new URL("/image/lxthA.jpg");
final BufferedImage biFG = ImageIO.read(urlFG);
final BufferedImage biBG = ImageIO.read(urlBG);
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new OneRing(biBG, biFG);
}
});
}
}

关于java - 如何使用 Graphics 对象 g 绘制透明形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852959/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com