如何在Java中画点并保存输出图像?
How to draw points and save the output image in Java?
我想用 x 和 y 坐标绘制一些点并将输出保存到图像文件,但我做不到。 (不需要在 JFrame 上看到它们)
据我通过搜索了解到,我可以创建绘图并在 JFrame 上显示它,但我无法将此输出保存到文件中。
public static void main(String[] args) {
try {
final JFrame frm = new JFrame("Points");
final Panel pnl = new Panel();
pnl.setPreferredSize(new Dimension(1000, 1000));
frm.setContentPane(pnl);
frm.pack();
frm.setVisible(true);
frm.repaint();
Image img;
img = frm.createImage(1000, 1000);
ImageIO.write((RenderedImage) img, "jpeg", new File("C:/.../p.jpeg"));
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (final Exception e) {
e.printStackTrace();
}
}
public static class Panel extends JPanel {
@Override
public void paintComponent(final Graphics g) {
g.setColor(Color.RED);
for (final Point p : CandidatePoints) {
g.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20);
}}
此外,我尝试了使用 ImageIO 的 BufferedImage 的流行解决方案,但在那种情况下我无法创建坐标系,而是在图像文件中得到一个黑色矩形。
public static void main(String[] args) {
BufferedImage bimage = new BufferedImage(200, 200,
BufferedImage.TYPE_BYTE_INDEXED);
Graphics2D g2d = bimage.createGraphics();
g2d.setColor(Color.red);
for (final Point p : CandidatePoints) {
g2d.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20);
ImageIO.write(bimage, "jpeg", new File("C:/.../p.jpeg"));
g2d.dispose();
}}
提前致谢
您不需要任何 Swing 组件来创建图像并将其保存到文件。
下面是一个绘制圆圈并将其保存到文件中的小例子:
public class ImageExample
{
public static void main ( String[] args ) throws IOException
{
final BufferedImage image = new BufferedImage ( 1000, 1000, BufferedImage.TYPE_INT_ARGB );
final Graphics2D graphics2D = image.createGraphics ();
graphics2D.setPaint ( Color.WHITE );
graphics2D.fillRect ( 0,0,1000,1000 );
graphics2D.setPaint ( Color.BLACK );
graphics2D.drawOval ( 0, 0, 1000, 1000 );
graphics2D.dispose ();
ImageIO.write ( image, "png", new File ( "C:\image.png" ) );
}
}
如果您需要在输出中使用 jpeg 图像,您可能需要尝试使用图像类型。
你得到黑色矩形的原因是你没有用任何东西填充背景并且 JPEG 格式不支持透明图像 - 如果你希望你的图像是透明的,例如使用 PNG。或者,您可以只 fill-in 图片背景,其中包含您想要的任何颜色。另外正如评论中提到的那样 - 并非所有图像类型都适用于不同的输出图像格式。
此外,以防万一 - 所有图像和组件的坐标都从 top-left 角([0,0] 坐标)开始。
如果您想将桌面 Swing 应用程序的一部分 UI 保存到图像文件中,您将需要使用 Swing 组件提供的方法将它们绘制到从图像中检索的图形上。
我想用 x 和 y 坐标绘制一些点并将输出保存到图像文件,但我做不到。 (不需要在 JFrame 上看到它们) 据我通过搜索了解到,我可以创建绘图并在 JFrame 上显示它,但我无法将此输出保存到文件中。
public static void main(String[] args) {
try {
final JFrame frm = new JFrame("Points");
final Panel pnl = new Panel();
pnl.setPreferredSize(new Dimension(1000, 1000));
frm.setContentPane(pnl);
frm.pack();
frm.setVisible(true);
frm.repaint();
Image img;
img = frm.createImage(1000, 1000);
ImageIO.write((RenderedImage) img, "jpeg", new File("C:/.../p.jpeg"));
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (final Exception e) {
e.printStackTrace();
}
}
public static class Panel extends JPanel {
@Override
public void paintComponent(final Graphics g) {
g.setColor(Color.RED);
for (final Point p : CandidatePoints) {
g.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20);
}}
此外,我尝试了使用 ImageIO 的 BufferedImage 的流行解决方案,但在那种情况下我无法创建坐标系,而是在图像文件中得到一个黑色矩形。
public static void main(String[] args) {
BufferedImage bimage = new BufferedImage(200, 200,
BufferedImage.TYPE_BYTE_INDEXED);
Graphics2D g2d = bimage.createGraphics();
g2d.setColor(Color.red);
for (final Point p : CandidatePoints) {
g2d.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20);
ImageIO.write(bimage, "jpeg", new File("C:/.../p.jpeg"));
g2d.dispose();
}}
提前致谢
您不需要任何 Swing 组件来创建图像并将其保存到文件。
下面是一个绘制圆圈并将其保存到文件中的小例子:
public class ImageExample
{
public static void main ( String[] args ) throws IOException
{
final BufferedImage image = new BufferedImage ( 1000, 1000, BufferedImage.TYPE_INT_ARGB );
final Graphics2D graphics2D = image.createGraphics ();
graphics2D.setPaint ( Color.WHITE );
graphics2D.fillRect ( 0,0,1000,1000 );
graphics2D.setPaint ( Color.BLACK );
graphics2D.drawOval ( 0, 0, 1000, 1000 );
graphics2D.dispose ();
ImageIO.write ( image, "png", new File ( "C:\image.png" ) );
}
}
如果您需要在输出中使用 jpeg 图像,您可能需要尝试使用图像类型。
你得到黑色矩形的原因是你没有用任何东西填充背景并且 JPEG 格式不支持透明图像 - 如果你希望你的图像是透明的,例如使用 PNG。或者,您可以只 fill-in 图片背景,其中包含您想要的任何颜色。另外正如评论中提到的那样 - 并非所有图像类型都适用于不同的输出图像格式。
此外,以防万一 - 所有图像和组件的坐标都从 top-left 角([0,0] 坐标)开始。
如果您想将桌面 Swing 应用程序的一部分 UI 保存到图像文件中,您将需要使用 Swing 组件提供的方法将它们绘制到从图像中检索的图形上。