如何创建一个圆形的BufferedImage,而不是创建使用图形矩形一个用Java(How to c

2019-10-20 03:22发布

我需要创建一个BufferedImage(环型),但我可以只创建矩形类型。 然后我想创建与一些配置中的BufferedImage内部的椭圆形,最后我要绘制哪个应该在圆形形状,而不是在矩形的BufferedImage被插入的圆形内部的矩形图标。 现在,我能够做到以下几点

BufferedImage img = "SomeImage.png";
BufferedImage bfImage = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics       = bfImage.createGraphics();
graphics.fillOval(0, 0, 200, 200); 
graphics.drawImage(img, 0, 0, null);

(这将创建bfImage对象内部的圆形椭圆形)现在我需要绘制“IMG”,它的形状是矩形的说100 * 100大小。 这个我可以借鉴使用。当我这样做我的矩形BfImage是越来越绘制最终图像,这我不want.I想要的图像“img”可以在圆形椭圆形的绘制,它不应该来的边界之外圆形椭圆形。 总之,而不是在矩形bfImage绘制我的最终图像I可以具有圆形bfImage上,我可以直接绘制我的图像。 任何逻辑用图形来做到这一点的的Java2D。

Answer 1:

我从来没有在一个二维阵列,是不是在矩形形状的意义上遇到了“圆形图像”。 如果你所关心的是,圈子之外的像素是不可见的,只是设置alpha为0的像素。 一个简单的方法做,这是第一个填补ARGB(0,0,0,0)整个矩形图像,然后画出你想要的任何东西。

此外,不,如果你打算坚持这个缓冲区为图像文件,你必须确保你导出/保存为PNG一样或TIFF支持透明度的格式。



Answer 2:

作为@justinzane说,你不能有一个真正的圆形图像。 所有BufferedImage旨意是矩形。

但是:你可以实现你后,使用效果AlphaComposite类和规则AlphaComposite.SrcIn 。 我添加了一个完全运行的例子,加上下面的屏幕截图,在compose方法是重要的组成部分。

public class AlphaCompositeTest {
    private static BufferedImage compose(final BufferedImage source, int w, int h) {
        BufferedImage destination = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D graphics = destination.createGraphics();
        try {
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            graphics.setColor(Color.BLACK); // The color here doesn't really matter
            graphics.fillOval(0, 0, destination.getWidth(), destination.getHeight());

            if (source != null) {
                graphics.setComposite(AlphaComposite.SrcIn); // Only paint inside the oval from now on
                graphics.drawImage(source, 0, 0, null);
            }
        }
        finally {
            graphics.dispose();
        }

        return destination;
    }

    public static void main(String[] args) throws IOException {
        final BufferedImage original = ImageIO.read(new File("lena.png"));
        final BufferedImage template = compose(null, original.getWidth(), original.getHeight());
        final BufferedImage composed = compose(original, original.getWidth(), original.getHeight());

        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

                JPanel panel = new JPanel(new BorderLayout(10, 10));
                panel.add(new JLabel("+", new ImageIcon(template), SwingConstants.LEFT), BorderLayout.WEST);
                panel.add(new JLabel("=", new ImageIcon(original), SwingConstants.LEFT), BorderLayout.CENTER);
                panel.add(new JLabel(new ImageIcon(composed)), BorderLayout.EAST);

                frame.add(new JScrollPane(panel));

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

例如见的合成教程获取更多信息和示例。



文章来源: How to create a circular bufferedimage rather than creating a rectangular one in Java using Graphics