2011-07-04 37 views
12

Tôi có một vấn đề nhỏ ở đây.Chuyển đổi Graphics2D thành một hình ảnh hoặc BufferedImage

Tôi có một applet, nơi người dùng có thể "vẽ" bên trong nó. Để làm điều đó, tôi sử dụng java.awt.Graphics2D. Nhưng, làm cách nào để tôi có thể lưu hình ảnh người dùng dưới dạng hình ảnh JPEG hoặc ít nhất, chuyển hình ảnh đó thành BufferedImage hoặc một cái gì đó? Tôi không biết làm thế nào để làm điều đó.

Cảm ơn.

+0

Xin xem Chỉnh sửa 1 trong câu trả lời của tôi cho một ví dụ ý tôi là gì –

Trả lời

8

tôi làm điều đó theo cách đó, và hoạt động rất tốt:


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) {..... } 

Đó là tất cả :) Cảm ơn tất cả mọi người :)

11

Yêu cầu chúng vẽ trực tiếp vào BufferedImage bằng cách đối tượng Graphics2D mà bạn có thể nhận được thông qua getGraphics(). Sau đó sử dụng ImageIO.write(...) để xuất hình ảnh thành bất kỳ loại tệp nào bạn muốn (và được hỗ trợ). API ImageIO sẽ giúp bạn với điều này: ImageIO API.

Sự cố khác mà bạn sẽ có là họ phải lưu hình ảnh khi nó được vẽ ở đâu? Trên máy tính của riêng họ? Nếu vậy và đây là một chương trình applet, thì applet sẽ cần phải được "ký" để nó có quyền ghi vào đĩa. Nếu bạn không chắc chắn về điều này, hãy xem Google, this article hoặc bạn có thể muốn viết một câu hỏi mới cho vấn đề này một mình.

Sửa 1: mã ví dụ
Ví dụ:

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<Point> pointList = new ArrayList<Point>(); 
    private JLabel imageLabel; 
    private List<Color> colorList = new ArrayList<Color>(); 
    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(); 
     } 
     }); 
    } 
} 
4

Sử dụng drawImage phương pháp được cung cấp bởi Graphics2D và viết nó bằng cách sử ImageIO

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

Bạn có thể muốn khởi tạo img. –

+3

Sửa tôi nếu tôi sai, nhưng không vẽ 'drawImage' 'img' thành' g2dObject' và không phải là cách khác? Tôi nghĩ rằng cách tiếp cận này sẽ chỉ đơn giản là lưu một hình ảnh rỗng và 'g2dObject' sẽ thực sự có nội dung mà bạn muốn lưu ... – Griddo

Các vấn đề liên quan