将Graphics2D转换为Image或BufferedImage

我这里有点问题。

我有一个applet,用户可以在其中“绘制”。 为此,我使用java.awt.Graphics2D。 但是,如何将用户绘制图像保存为JPEG图像,或者至少将其转换为BufferedImage或其他什么? 我不知道该怎么做。

谢谢。

让它们通过它的Graphics2D对象直接在BufferedImage中绘制,你可以通过getGraphics()获得它。 然后使用ImageIO.write(...)将图像输出到您想要的任何文件类型(并且支持)。 ImageIO API应该可以帮助您: ImageIO API 。

你将拥有的另一个问题是,一旦它被绘制,他们应该将图像保存在哪里? 在自己的电脑上? 如果是这样且这是一个applet程序,那么applet将需要“签名”才能获得写入磁盘的权限。 如果您对此不确定,请查看本文的 Google,或者您可能希望仅针对此问题撰写新问题。

编辑1:代码示例
例如:

 import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; @SuppressWarnings("serial") public class DrawAndSaveImage extends JPanel { private static final int BI_WIDTH = 600; private static final int BI_HEIGHT = BI_WIDTH; private static final Color LABEL_DRAW_COLOR = new Color(180, 180, 255); private static final Stroke LABEL_DRAW_STROKE = new BasicStroke(1); private static final Stroke BIMAGE_DRAW_STROKE = new BasicStroke(4); private static final int COLOR_DIV = 5; private BufferedImage bImage = new BufferedImage(BI_WIDTH, BI_HEIGHT, BufferedImage.TYPE_INT_RGB); private List pointList = new ArrayList(); private JLabel imageLabel; private List colorList = new ArrayList(); private Random random = new Random(); public DrawAndSaveImage() { Graphics2D g2d = bImage.createGraphics(); g2d.setBackground(Color.white); g2d.clearRect(0, 0, BI_WIDTH, BI_HEIGHT); g2d.dispose(); for (int r = 0; r < COLOR_DIV; r++) { for (int g = 0; g < COLOR_DIV; g++) { for (int b = 0; b < COLOR_DIV; b++) { Color c = new Color((r * 255) / COLOR_DIV, (g * 255) / COLOR_DIV, (b * 255) / COLOR_DIV); colorList.add(c); } } } imageLabel = new JLabel(new ImageIcon(bImage)) { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); paintInLabel(g); } }; MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); imageLabel.addMouseListener(myMouseAdapter); imageLabel.addMouseMotionListener(myMouseAdapter); imageLabel.setBorder(BorderFactory.createEtchedBorder()); JButton saveImageBtn = new JButton("Save Image"); saveImageBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveImageActionPerformed(); } }); JButton clearImageBtn = new JButton("Clear Image"); clearImageBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Graphics2D g2 = bImage.createGraphics(); g2.setBackground(Color.white); g2.clearRect(0, 0, BI_WIDTH, BI_HEIGHT); g2.dispose(); imageLabel.repaint(); } }); JPanel btnPanel = new JPanel(); btnPanel.add(saveImageBtn); btnPanel.add(clearImageBtn); setLayout(new BorderLayout()); add(imageLabel, BorderLayout.CENTER); add(btnPanel, BorderLayout.SOUTH); } private void saveImageActionPerformed() { JFileChooser filechooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG Images", "jpg"); filechooser.setFileFilter(filter); int result = filechooser.showSaveDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File saveFile = filechooser.getSelectedFile(); try { ImageIO.write(bImage, "jpg", saveFile); } catch (IOException e) { e.printStackTrace(); } } } private void paintInLabel(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setColor(LABEL_DRAW_COLOR); g2d.setStroke(LABEL_DRAW_STROKE); if (pointList.size() < 2) { return; } for (int i = 1; i < pointList.size(); i++) { int x1 = pointList.get(i - 1).x; int y1 = pointList.get(i - 1).y; int x2 = pointList.get(i).x; int y2 = pointList.get(i).y; g2d.drawLine(x1, y1, x2, y2); } } private class MyMouseAdapter extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { pointList.add(e.getPoint()); imageLabel.repaint(); } @Override public void mouseReleased(MouseEvent e) { Graphics2D g2d = bImage.createGraphics(); g2d.setColor(colorList.get(random.nextInt(colorList.size()))); g2d.setStroke(BIMAGE_DRAW_STROKE); if (pointList.size() >= 2) { for (int i = 1; i < pointList.size(); i++) { int x1 = pointList.get(i - 1).x; int y1 = pointList.get(i - 1).y; int x2 = pointList.get(i).x; int y2 = pointList.get(i).y; g2d.drawLine(x1, y1, x2, y2); } } g2d.dispose(); pointList.clear(); imageLabel.repaint(); } @Override public void mouseDragged(MouseEvent e) { pointList.add(e.getPoint()); imageLabel.repaint(); } } private static void createAndShowUI() { JFrame frame = new JFrame("DrawAndSaveImage"); frame.getContentPane().add(new DrawAndSaveImage()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } } 

我这样做,并且运作良好:


 BufferedImage awtImage = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = awtImage.getGraphics(); drawPanel.printAll(g); try { String caminhoImagem = System.getProperty("user.home") + "\\temps\\assinatura.jpg"; FileOutputStream fos = new FileOutputStream(caminhoImagem); JPEGImageEncoderImpl j = new JPEGImageEncoderImpl(fos); j.encode(awtImage); fos.close(); } catch(e) {..... } 

这就是全部:)谢谢大家:)

使用Graphics2D提供的drawImage方法并使用ImageIO编写它

 BufferedImage img; g2dObject.drawImage(img, null, 0, 0); ImageIO.write(img, "JPEG", new File("foo.jpg")); 

使用“自定义绘制方法 ”中的“drawOnImage”示例。 然后,要创建面板的图像,您可以使用Screen Image类。

如果您想将JComponent的图像绘制到BufferedImage(JApplet扩展JComponent):

 JComponent whatToDraw = ...; BufferedImage img = new BufferedImage(whatToDraw.getWidth(), whatToDraw.getHeight(), BufferedImage.TYPE_INT_RGB); whatToDraw.printAll(img.getGraphics()); 

并将其数据写入JPEG文件:

 ImageIO.write(img, "jpg", new File("something.jpg"));