如何保存我的绘图? (基本绘画应用程序)

Posted

技术标签:

【中文标题】如何保存我的绘图? (基本绘画应用程序)【英文标题】:How can I save my drawing? (Basic Paint app) 【发布时间】:2021-01-12 02:44:34 【问题描述】:

如何将我的绘图保存为 .jpeg .png?我想捕获在面板上绘制的图像并在单击保存按钮时保存。 我尝试了缓冲图像方法,但我无法运行它。当我搜索缓冲图像方法时,它需要扩展到 JPanel,我的代码基于 JFrame。

应用程序的当前版本:

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    import java.awt.Container;
    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.awt.Color;
    import java.awt.GridLayout;

    public class Cizim extends JFrame implements MouseMotionListener,ActionListener 
    private int x = -10 , y = -10 ;
    private Color col = Color.BLACK;
    private JLabel mousePos;
    
    public Cizim() 
        final JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JPanel bottom = new JPanel();
        bottom.setLayout(new BorderLayout());
        mousePos = new JLabel("( , )");
        bottom.add(mousePos, BorderLayout.WEST);
        bottom.setVisible(true);
        //JFrame 
        setTitle("Cizim");
        setSize(800,600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
        JPanel p= new JPanel();
    
        
        p.setLayout(new GridLayout(15,1));
        //Buton Renkleri
        JButton red = new JButton("Kirmizi");
        red.setBackground(Color.RED);
        JButton green = new JButton("Yesil");
        green.setBackground(Color.GREEN);
        JButton magenta = new JButton("Mor");
        magenta.setBackground(Color.MAGENTA);
        JButton cyan = new JButton("Turkuaz");
        cyan.setBackground(Color.CYAN);
        JButton orange = new JButton("Turuncu");
        orange.setBackground(Color.ORANGE);
        JButton yellow = new JButton("Sari");
        yellow.setBackground(Color.YELLOW);
        JButton pink = new JButton("Pembe");
        pink.setBackground(Color.pink);
        JButton blue = new JButton ("Mavi");
        blue.setBackground(new Color (51, 51, 204));
        JButton gray = new JButton("Gri");
        gray.setBackground(Color.GRAY);
        JButton black = new JButton("Siyah");
        black.setBackground(Color.BLACK);
        JButton white = new JButton("Silgi");
        white.setBackground(Color.WHITE);
        
        //
        
        p.add(red);
        p.add(green);
        p.add(magenta);
        p.add(cyan);
        p.add(orange);
        p.add(yellow);
        p.add(pink);
        p.add(blue);
        p.add(gray);
        p.add(black);
        p.add(white);
    
        
        red.addActionListener(this);
        green.addActionListener(this);
        magenta.addActionListener(this);
        cyan.addActionListener(this);
        orange.addActionListener(this);
        yellow.addActionListener(this);
        pink.addActionListener(this);
        blue.addActionListener(this);
        gray.addActionListener(this);
        black.addActionListener(this);
        white.addActionListener(this);  //Beyaz rengi silgi olarak kullandım.
        
        Container c = this.getContentPane();
        c.setLayout(new BorderLayout());
        JLabel instructions = new JLabel("Cizmek icin fareyi hareket ettirin.", JLabel.RIGHT);
        c.add(instructions, BorderLayout.SOUTH);
        c.add(p, BorderLayout.WEST);
        c.addMouseMotionListener(this);
        setVisible(true);
        
        public void actionPerformed(ActionEvent e) 
        String act = e.getActionCommand();
        if(act.equals("Mavi"))
            col = new Color(51, 51, 204);
        else if(act.equals("Kirmizi"))
            col = Color.RED;
        else if(act.equals("Yesil"))
            col = Color.GREEN;
        else if(act.equals("Mor"))
            col = Color.MAGENTA;
        else if(act.equals("Turkuaz"))
            col = Color.CYAN;
        else if(act.equals("Turuncu"))
            col = Color.ORANGE;
        else if(act.equals("Sari"))
            col = Color.YELLOW;
        else if(act.equals("Pembe"))
            col = Color.PINK;
        else if(act.equals("Gri"))
            col = Color.GRAY;
        else if(act.equals("Siyah"))
            col = Color.BLACK;
        else if(act.equals("Silgi"))
            col = Color.WHITE;
        else//bunlardan biri değilse renk siyah olsun
            col = Color.BLACK;
        
    
    public void mouseMoved(MouseEvent e) 
    
    public void mouseDragged(MouseEvent e) 
        x = e.getX(); y= e.getY();
        repaint();// özel parametre ile çağrılan çizim metodu
        
    
    public void paint(Graphics g) 
        g.setColor(col);
        g.fillRect(x, y, 10, 10);
    
    
    public static void main (String args[]) 
        Cizim p = new Cizim();
    

【问题讨论】:

Save JPanel as an image @GilbertLeBlanc 实际上,这不是最聪明的主意,永远不要直接致电paint。相反,他们应该使用printAll 不要覆盖paint,尤其是JFrame Possible Duplicate “我想捕捉在面板上绘制的图像并在我单击保存按钮时保存。” - 虽然这是一种简单的开始方式,但可能不是最好的方法。不要画到面板上。相反,在前面创建一个BufferedImage,并绘制到它(通过从createGraphics() 获得的Graphics2D)。使用此图像更新您的显示面板。当你想保存时,只需使用ImageIO.write(..) 编写即可。 【参考方案1】:

说明

    正在检索图像 创建文件以存储图像 将检索到的图像保存到新创建的文件中

检索

创建一个 BufferedImage。

BufferedImage bi = getMyImage();

文件创建

创建一个 .png 文件。

File outputFile = new File("save.png");

写图片

在 .png 文件上绘制缓冲图像。

ImageIO.write(bi, "png", outputfile);

完整代码

try 
    BufferedImage bi = getMyImage();
    File outputfile = new File("saved.png");
    ImageIO.write(bi, "png", outputfile);
 catch (IOException e) 
    ...

来源

如果您想了解更多信息,请阅读此文档: https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html

【讨论】:

谢谢我解决了问题,但保存的图像保存为白色。它只保存背景我猜它不会保存我所做的绘图。

以上是关于如何保存我的绘图? (基本绘画应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

处理绘图/绘画/保存多个位图

保存在 iOS 绘画应用程序中

如何为 python kivy 绘画应用程序添加清除按钮

如何将 3d 模型添加到 Android 应用程序以在 Android Studio 中绘图?

如何在 JPanel 中绘图? (摇摆/图形Java)

mfc做的一个程序,如何将绘画的矩形、圆形保存到位图?保存成.bmp格式?