将 Graphics2D 形状绘制到图像上
Draw Graphics2D Shape onto an Image
以下是一个较大程序的片段,其目标是在图像上绘制一个红色圆圈。
我用来完成此任务的资源来自以下站点
Create a BufferedImage from an Image
和
这就是我的
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"));
以下是一个较大程序的片段,其目标是在图像上绘制一个红色圆圈。
我用来完成此任务的资源来自以下站点
Create a BufferedImage from an Image
和
这就是我的
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"));