2011-08-12 43 views
3

我正在开发一个应用程序,允许用户在图层中加载图像。用户可以借鉴另一层一些图片,仅保存图像用户drawn.Here是我的代码:将JPanel另存为图像

import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.ImageIcon; 
import javax.swing.JApplet; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class LayerDemo extends JApplet { 

    private JLayeredPane mainLayer; 

    private JPanel layer1; 

    private JPanel layer2; 

    private JLabel label; 

    private ImageIcon imgIcon; 


    /** 
    * Create the applet. 
    */ 
    public LayerDemo() {  
    } 

    public void init() { 
     Dimension mainDemension = new Dimension(1024,768); 
     setSize(mainDemension); 

     mainLayer = new JLayeredPane(); 
     layer1 = new JPanel(); 
     layer1.setOpaque(false); 
     layer1.setBounds(0, 0, this.getWidth(), this.getHeight()); 
     imgIcon = new ImageIcon("bear.jpg"); 
     label = new JLabel(imgIcon); 
     label.setBounds(0, 0, imgIcon.getIconWidth(), imgIcon.getIconHeight()); 
     layer1.add(label); 

     layer2 = new PaintDemo(true); 
     layer2.setOpaque(false); 
     layer2.setBounds(0, 0, this.getWidth(), this.getHeight()); 

     mainLayer.add(layer1, 1); 
     mainLayer.add(layer2, 2); 
     this.setContentPane(mainLayer); 
    } 

    public void paint(Graphics g) {  
    } 

} 

这是用户抽奖类:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.MouseWheelListener; 
import java.awt.event.MouseWheelEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

public class PaintDemo extends JPanel { 
    /** 
    * field explanation 
    */ 
    private Point startPoint = new Point(); 

    private Point endPoint = new Point(); 

    private Graphics2D g2; 

    private int minX; 

    private int minY; 

    private int maxX; 

    private int maxY; 

    private int height; 

    private int width; 


    /** 
    * Create the panel. 
    */ 

    public PaintDemo(boolean isDoubleBuffer) { 

     addMouseWheelListener(new MouseWheelListener() { 
      public void mouseWheelMoved(MouseWheelEvent e) { 
      } 
     }); 
     this.setDoubleBuffered(isDoubleBuffer); 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       endPoint = e.getPoint(); 
       Graphics g = PaintDemo.this.getGraphics(); 
       paintComponent(g); 
       minX = minX < endPoint.x ? minX : endPoint.x; 
       minY = minY < endPoint.y ? minY : endPoint.y; 
       maxX = maxX > endPoint.x ? maxX : endPoint.x; 
       maxY = maxY > endPoint.y ? maxY : endPoint.y; 
       startPoint = endPoint; 
      } 
     }); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       startPoint = e.getPoint(); 
       minX = startPoint.x; 
       minY = startPoint.y; 
       maxX = startPoint.x; 
       maxY = startPoint.y; 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       endPoint = e.getPoint(); 
       Graphics g = PaintDemo.this.getGraphics(); 
       paintComponent(g); 
       minX = minX < endPoint.x ? minX : endPoint.x; 
       minY = minY < endPoint.y ? minY : endPoint.y; 
       maxX = maxX > endPoint.x ? maxX : endPoint.x; 
       maxY = maxY > endPoint.y ? maxY : endPoint.y; 
       minX = minX > 0 ? minX : 0; 
       minY = minY > 0 ? minY : 0; 
       maxX = maxX < 1024 ? maxX : 1024; 
       maxY = maxY < 768 ? maxY : 768; 
       width = maxX - minX; 
       height = maxY - minY; 
       saveImage();  
       startPoint = new Point(); 
       endPoint = new Point(); 

      } 
     }); 
    } 

    /** 
    * Paint method 
    * 
    * {@inheritDoc} 
    */ 
    @Override 
    public void paintComponent(Graphics g) { 
     g2 = (Graphics2D)g; 
     g2.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
     g2.setFont(new Font("Serif", Font.BOLD, 18)); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(Color.red); 
     g2.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y); 
    } 

    public void saveImage() { 
     BufferedImage bi = new BufferedImage(PaintDemo.this.getWidth(), PaintDemo.this.getHeight(), BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = bi.createGraphics(); 
     paintComponent(g2); 
     g2.dispose(); 
     try 
     { 
      ImageIO.write(bi, "jpg", new File("clip.jpg")); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println("Clip write help: " + ioe.getMessage()); 
     } 
    } 
} 

当保存图像,它只是空白image.Please帮我,谢谢你。 P/S:我已经编辑了我的代码作为您的想法,但它不起作用。结果是没有图像背景,仍然保存空白图像。 :(

回答

5

风俗画是通过覆盖面板的paintComponent()方法实现的。然后,我们可以使用Graphics对象做你的画。

你不应该有一个空的paint()方法。

drawline()方法不会使用getGraphics()方法,而应将代码移至paintComponent()方法,然后使用传递给该方法的Graphics对象。

此外,您不应该重写applet的paint()方法。由于你的代码是以实际大小绘制图像,所以你应该只使用JLab el通过创建ImageIcon来显示图像。然后,将标签添加到分层窗格以用作背景图像。

编辑:

为什么你仍然有空的paint()方法?摆脱它,没有必要重写paint()方法。

当我运行代码时,我得到一个安全异常,因为小程序无法写入文件,所以我无法测试代码的那部分内容。但如果您有兴趣,我使用Screen Image来创建组件的图像。

但是,您的主要问题是绘画代码是错误的。是的,你会看到画线,但它们不是永久性的。当您想要进行永久性着色时,不应该使用组件的getGraphics()方法。尝试绘制一些行,然后最小化applete,然后恢复小程序,你会明白我的意思。

解决方法是在BufferedImage上进行绘制。请参阅Custom Painting ApproachesDrawOnImage示例。

+0

请参见上面我编辑的代码。 –

+0

@juytu,见编辑。 – camickr

+0

非常感谢。 :) –