如何画使用Graphics对象g的透明状? [英] How to draw a transparent shape using a Graphics object g?
问题描述
我想创建一个的BufferedImage
一个环具有透明背景。我可以画圆,像这样一个透明的背景:
I want to create a "ring" in a BufferedImage
with a transparent background. I can draw the circle with a transparent background like this:
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);
但现在我要画一个小的透明圈在它的中间做一个环(所以当我在另一幅图像得出这样的形象,和周围的环内的像素未画出)。我想用一个图形
对象要做到这一点,所以我可以使用抗锯齿。
But now I want to draw a smaller transparent circle in the middle of it to make a ring (so when I draw this image over another image, the pixels around and inside the ring are not drawn). I want to use a Graphics
object to do this so I can use antialiasing.
这可能吗?如果不是,它最好的方式来解决这个问题?
Is this possible? If it isn’t, what it the best way to tackle this problem?
推荐答案
创建一个圆形,然后减去从另一个圆形,将其设置为夹&放大器;你可能最终沿着所需线的东西。要隐藏剪辑的粗糙边缘,绘制形状的2px的广泛中风。
Create a circular shape, then subtract another circular shape from that, set it as the clip & you might end up with something along the lines needed. To hide the rough edges of the clip, draw a 2px wide stroke of the shape.
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("http://i.stack.imgur.com/OVOg3.jpg");
URL urlBG = new URL("http://i.stack.imgur.com/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);
}
});
}
}
这篇关于如何画使用Graphics对象g的透明状?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!