【问题标题】:Save drawing on Jpanel as image将 Jpanel 上的绘图另存为图像
【发布时间】:2012-12-05 18:19:11
【问题描述】:

我正在使用 java socket 开发一个绘图程序。多个用户可以绘制并将其保存为 jpeg。目前我的保存图像功能只保存一个空白画布。无法保存绘制的坐标。

我在下面分享我的部分代码。 =)

我没有为我的 Canvas 类使用 paint 或 paintComponent,因为使用 java 套接字时我遇到了发送坐标错误。相反,我使用的是 massDraw()。

    class Canvas extends JPanel {
    private int x, y;
    private float x2, y2;

    public Canvas() {
        super();
        this.setBackground(Color.white);
    }

    public void massDraw(int px, int py, int x, int y, int red, int green,
            int blue, int size) {
        Graphics g = canvas.getGraphics();
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHints(myBrush);

        g2d.setStroke(new BasicStroke(size, BasicStroke.CAP_ROUND,
                BasicStroke.JOIN_BEVEL));
        g2d.setColor(new Color(red, green, blue));
        g.drawLine(px, py, x, y);

    }


}// end Canvas class

SaveJpegOP 类

class saveJpegOP implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        // Ask for file name
        String str = JOptionPane
                .showInputDialog(null, "Enter File Name : ");
        // save as jpeg
           BufferedImage bufImage = new BufferedImage(canvas.getSize().width, canvas.getSize().height,BufferedImage.TYPE_INT_RGB);  
           canvas.paint(bufImage.createGraphics());  



        try {
            ImageIO.write(bufImage, "jpg", new File(str + ".jpg"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }

}

【问题讨论】:

  • 你在哪里打电话给massDraw?变量canvas 是什么?你永远不应该打电话给getGraphics(),这总是会导致你描述的问题。我绝对不明白为什么你不能覆盖paintComponent
  • 1. massDraw 在其他公共类(客户端)文件中调用。当客户端收到坐标时,它将在其他用户的画布上绘制点。
  • 2. canvas 变量来自 Canvas canvas = new Canvas();
  • 考虑发布SSCCE。不可能猜到您有其他类,执行其他方法调用等...无论如何,当您调用canvas.paint 时,它会通过您的 massDraw 方法吗?如果没有,那是你的问题。
  • 2.画布变量来自 Canvas canvas = new Canvas(); ???您已经在Canvas 中。所以你是从另一个Canvas 实例引用Canvas 实例?你不应该改用this 吗?反正你千万不要打电话给getGraphics(),这只是找麻烦,没有任何意义。

标签: java image swing applet


【解决方案1】:

空白画布被保存,因为从未调用过massDraw(),尤其是当您在saveJpegOP 中调用canvas.paint(bufImage.createGraphics()) 时不会调用它。

paint() 基本上重绘整个组件,并且由于您决定不覆盖它(或 paintComponent()),因此永远不会调用 drawMass() 并绘制空画布。

因此您需要覆盖paintComponent() 并使用适当的参数调用massDraw()。例如,参数值可以较早地设置为Canvas 类中的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多