2011-07-04 68 views
12

ここでは少し問題があります。Graphics2DをImageまたはBufferedImageに変換する

私はアプレットを持っています。そこでは、ユーザーがその中に「描画」することができます。これを行うには、java.awt.Graphics2Dを使用します。 しかし、ユーザーの描画イメージをJPEGイメージとして保存するにはどうすればよいですか、それとも少なくともBufferedImageなどに変換しますか?私はそれをする方法を知らない。

ありがとうございました。

+0

は、例えば私の答えに編集1を参照してください:)だ


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

私が言ったことの –

答えて

8

私はそれそのように行うには、非常にうまく機能:すべての:) おかげで誰もが

11

getGraphics()で取得できるGraphics2Dオブジェクトを使用して、BufferedImageで直接描画するようにしてください。次に、ImageIO.write(...)を使用して、希望のファイルタイプ(サポートされているファイルタイプ)にイメージを出力します。 ImageIO APIは、ImageIO APIとお手伝いします。

もう1つの問題は、描画された画像を保存する場所です。自分のコンピュータで?そうで、これがアプレットプログラムであれば、アプレットはディスクに書き込む許可を得るために「署名」されている必要があります。これがわからない場合は、Google this articleをチェックするか、この問題だけで新しい質問を書いてください。たとえば、コード例

編集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<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

Graphics2Dによって提供drawImage方法を使用しImageIO

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

imgを初期化することができます。 –

+3

私が間違っている場合は私を訂正しますが、 'drawImage'は' img'を 'g2dObject'に描画しません。私はこのアプローチが単に空の画像を保存し、 'g2dObject'は実際にあなたが保存したいコンテンツを持っていると思います... – Griddo

関連する問題