我正在开发一个应用程序允许用户在图层中加载图像。用户可以在另一个图层上绘制一些图片,只保存用户绘制的图像。这是我的代码:
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());
}
}
}
保存图片时,它只是空白图片。请帮帮我。非常感谢你。 P / S:我已经编辑了我的代码作为你的想法,但它不起作用。结果是没有图像背景,仍然保存空白图像。 :(
答案 0 :(得分:5)
通过覆盖面板的paintComponent()方法完成自定义绘制。然后使用Graphics对象进行绘画。
你不应该有一个空的paint()方法。
drawline()方法不使用getGraphics()方法。而是应该将代码移动到paintComponent()方法,然后使用传递给方法的Graphics对象。
此外,您不应该覆盖applet的paint()方法。由于您的代码以实际大小绘制图像,因此您应该使用JLabel通过创建ImageIcon来显示图像。然后将标签添加到分层窗格以用作背景图像。
编辑:
为什么还有空的paint()方法?摆脱它,不需要覆盖paint()方法。
当我运行代码时,我得到一个安全异常,因为applet无法写入文件,因此我无法测试代码的那一部分。但如果您感兴趣我使用Screen Image来创建组件的图像。
但是,你的主要问题是绘画代码是错误的。是的,你会看到画出的线条,但它们不是永久性的。当您想要进行永久性绘画时,不应该使用组件的getGraphics()方法。尝试绘制一些线条,然后最小化applete然后恢复applet,你会看到我的意思。
解决方法是在BufferedImage上进行绘图。请参阅Custom Painting Approaches中的DrawOnImage
示例。
答案 1 :(得分:3)
有关提示,请参阅ComponentImageCapture.java。