ここでは少し問題があります。Graphics2DをImageまたはBufferedImageに変換する
私はアプレットを持っています。そこでは、ユーザーがその中に「描画」することができます。これを行うには、java.awt.Graphics2Dを使用します。 しかし、ユーザーの描画イメージをJPEGイメージとして保存するにはどうすればよいですか、それとも少なくともBufferedImageなどに変換しますか?私はそれをする方法を知らない。
ありがとうございました。
ここでは少し問題があります。Graphics2DをImageまたはBufferedImageに変換する
私はアプレットを持っています。そこでは、ユーザーがその中に「描画」することができます。これを行うには、java.awt.Graphics2Dを使用します。 しかし、ユーザーの描画イメージをJPEGイメージとして保存するにはどうすればよいですか、それとも少なくともBufferedImageなどに変換しますか?私はそれをする方法を知らない。
ありがとうございました。
私はそれそのように行うには、非常にうまく機能:すべての:) おかげで誰もが
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();
}
});
}
}
がGraphics2D
によって提供drawImage
方法を使用しImageIO
BufferedImage img;
g2dObject.drawImage(img, null, 0, 0);
ImageIO.write(img, "JPEG", new File("foo.jpg"));
imgを初期化することができます。 –
私が間違っている場合は私を訂正しますが、 'drawImage'は' img'を 'g2dObject'に描画しません。私はこのアプローチが単に空の画像を保存し、 'g2dObject'は実際にあなたが保存したいコンテンツを持っていると思います... – Griddo
Custom Painting Approachesから "drawOnImage" 使用例を使用してそれを書きます。パネルの画像を作成するには、Screen Imageクラスを使用します。
は、例えば私の答えに編集1を参照してください:)だ
私が言ったことの –