19

我这里有个小问题。

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

谢谢。

4

5 回答 5

13

让他们通过它的 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<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();
         }
      });
   }
}
于 2011-07-04T20:01:56.800 回答
9

我就是这样做的,效果很好:


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

就是这样:)谢谢大家:)

于 2011-07-06T17:14:45.437 回答
6

使用drawImage提供的方法Graphics2D并使用ImageIO

BufferedImage img;
g2dObject.drawImage(img, null, 0, 0);
ImageIO.write(img, "JPEG", new File("foo.jpg"));
于 2011-07-04T20:09:18.613 回答
3

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

于 2011-07-04T21:06:12.050 回答
1

如果您想将 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"));
于 2018-08-26T08:42:27.643 回答