java - 将 Graphics2D 形状绘制到图像上

标签 java image awt bufferedimage graphics2d

以下是一个较大程序的片段,其目标是在图像上绘制一个红色圆圈。

我用来完成此任务的资源来自以下网站

Create a BufferedImage from an Image

Drawing on a BufferedImage

这就是我所拥有的

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class main {
    public static void main(String[] args) throws IOException {
        Image img = new ImageIcon("colorado.jpg").getImage();
        BufferedImage bi = new BufferedImage(img.getWidth(null),img.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = (Graphics2D) bi.getGraphics();



        g2d.setColor(Color.red);
        g2d.fill(new Ellipse2D.Float(0, 0, 100, 100));

        g2d.drawImage(img, 0,0,null);
        g2d.dispose();

        ImageIO.write(bi, "jpg", new File("new.jpg"));
        }

    }

但是,当运行代码时,创建的输出图像是输入图像的精确副本,没有任何更改。

最佳答案

通过软件绘画类似于现实世界中在 Canvas 上绘画。如果你画了一些东西,然后在它上面画,它就会画在先画的东西上。做事的顺序非常重要。

所以,在你的原始代码中,你必须绘制图像和椭圆......

g2d.drawImage(img, 0,0,null);
g2d.fill(new Ellipse2D.Float(0, 0, 100, 100));

话虽如此。有一个更简单的解决方案。而不是使用 ImageIcon ,有问题。您可以使用 ImageIO.read加载图像。直接的好处是,您获得 BufferedImage

//Image img = new ImageIcon("colorado.jpg").getImage();
//BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
BufferedImage bi = ImageIO.read(new File("colorado.jpg"));
Graphics2D g2d = bi.createGraphics();

g2d.setColor(Color.red);
g2d.fill(new Ellipse2D.Float(0, 0, 100, 100));
g2d.dispose();

ImageIO.write(bi, "jpg", new File("new.jpg"));

此外,请查看 Reading/Loading an Image

关于java - 将 Graphics2D 形状绘制到图像上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48757633/

相关文章:

java - 如何解压png文件

java - 右对齐图片上的文字

java - 在透明 JPanel 上绘画时留下痕迹

java - 如何利用 Java Web 服务获得 Nginx 优势

java - 为什么我的 struts 注释重定向不起作用?

java - 如何使用Maven创建Camel项目?

css - 在 3G 连接上加载图像时出现问题

javascript - 无法在 Canvas 上绘制同一图像的多个副本?

java - java Applet 有哪些限制?

java - 正则表达式 - 替换开始和结束字符序列