[英]How to save a image on JFrame
我正在做一個白板項目,實現保存功能時遇到了問題。
這是我實現繪圖功能的方法
Graphics2D g2d = (Graphics2D) frm.getGraphics();
g2d.setColor(Current_Color);
Line2D p2d = new Line2D.Double(StartPoint.getX(),StartPoint.getY(), e.getX()
+ Xoffset, e.getY() + Yoffset);
g2d.setStroke(new BasicStroke(Integer.parseInt(choice_size.getSelectedItem())));
g2d.draw(p2d);
我正在使用JFileChooser進行文件對話框
int returnVal = saveFileChooser.showSaveDialog(frm);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File currentDir = saveFileChooser.getCurrentDirectory();
String fileName = saveFileChooser.getSelectedFile()
.getName();
String savePath = currentDir + "\\" + fileName + ".jpg";
try {
ImageIO.write(<image>,<suffix>,<file>);
} catch (IOException e1) {
e1.printStackTrace();
}
}
JFrame沒有像Frame.getImage()
這樣的方法,我想知道如何將在JFrame上繪制的內容保存為圖像?
您需要先將框架的內容繪制到BufferedImage
。 嘗試類似...
Container content = frm.getContentPane();
BufferedImage img = new BufferedImage(container.getWidth(), container.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
content.printAll(g2d);
g2d.dispose();
一旦有了它,就可以使用ImageIO.write
方法,將img
傳遞給它。
UPDATE
所以,我做了一個非常快速的測試...
我從這張背景圖片開始...
我將其加載到框架中並在其上放置了一個JLabel
然后保存到文件...
所有這些都很好。
這是我使用的代碼。
public class TestSaveFrame extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
new TestSaveFrame();
}
});
}
public TestSaveFrame() {
setTitle("Save me");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
BackgroundPane pane = new BackgroundPane();
pane.setLayout(new GridBagLayout());
JLabel label = new JLabel("I'm sitting on top");
label.setFont(label.getFont().deriveFont(Font.BOLD, 24f));
label.setForeground(Color.WHITE);
pane.add(label);
add(pane);
pack();
setLocationRelativeTo(null);
setVisible(true);
pane.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
Container content = getContentPane();
BufferedImage img = new BufferedImage(content.getWidth(), content.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
content.printAll(g2d);
g2d.dispose();
try {
ImageIO.write(img, "png", new File("C:/PrintMe.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
}
public class BackgroundPane extends JPanel {
private Image background = null;
public BackgroundPane() {
try {
background = ImageIO.read(getClass().getResource("/MT015.jpg"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return background == null ? new Dimension(200, 200) : new Dimension(background.getWidth(this), background.getHeight(this));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
int x = (getWidth() - background.getWidth(this)) / 2;
int y = (getHeight() - background.getHeight(this)) / 2;
g.drawImage(background, x, y, this);
}
}
}
}
如果沒有工作流程的示例,很難弄清哪里出了問題。
我應該注意,我使用printAll
over paint
是因為最近在使用paint
進行printAll
遇到了問題( printAll
異常等)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.