質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

2回答

4685閲覧

お絵描きソフトの書いた絵の保存方法

kaikai-0303

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/01/26 06:18

現在javaでお絵描きソフトを勉強しているのですが、自分で描いた絵を画像として保存する機能を付けたいと思い、質問させていただきました。
まだまだプログラムには弱くどのようにすればいいのかわからないので、詳しく教えていただけると幸いです。

該当のソースコード

java

1import java.awt.BasicStroke; 2import java.awt.BorderLayout; 3import java.awt.Color; 4import java.awt.Graphics; 5import java.awt.Graphics2D; 6import java.awt.Image; 7import java.awt.Paint; 8import java.awt.RenderingHints; 9import java.awt.event.ActionEvent; 10import java.awt.event.ActionListener; 11import java.awt.event.MouseAdapter; 12import java.awt.event.MouseEvent; 13import java.awt.event.MouseMotionAdapter; 14 15import javax.swing.ButtonGroup; 16import javax.swing.JButton; 17import javax.swing.JComponent; 18import javax.swing.JFrame; 19import javax.swing.JLabel; 20import javax.swing.JPanel; 21import javax.swing.JToggleButton; 22 23public class SwingPaint extends JFrame { 24 private final DrawArea drawArea = new DrawArea(); 25 26 public static void main(String[] args) { 27 new SwingPaint().setVisible(true); 28 } 29 30 private SwingPaint() { 31 super("お絵かき"); 32 setSize(600, 600); 33 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 34 setLocationRelativeTo(null); // 中央表示 35 setResizable(false); // リサイズ禁止 36 37 JButton clearBtn = new JButton("Clear"); 38 clearBtn.addActionListener(e -> drawArea.clear()); 39 JPanel panel = new JPanel(); 40 panel.add(clearBtn); 41 42 JPanel controls = new JPanel(new BorderLayout()); 43 controls.add(createColorButtons(), BorderLayout.NORTH); 44 controls.add(createSizeButtons(), BorderLayout.CENTER); 45 controls.add(panel, BorderLayout.EAST); 46 47 add(controls, BorderLayout.NORTH); 48 add(drawArea, BorderLayout.CENTER); 49 } 50 51 private JPanel createColorButtons() { 52 JToggleButton green = new JToggleButton("緑"); 53 JToggleButton blue = new JToggleButton("青"); 54 JToggleButton black = new JToggleButton("黒", true); // 初期選択 55 JToggleButton red = new JToggleButton("赤"); 56 JToggleButton magenta = new JToggleButton("マゼンタ"); 57 JToggleButton white = new JToggleButton("消しゴム"); 58 59 ActionListener actionListener = new ActionListener() { 60 @Override public void actionPerformed(ActionEvent e) { 61 if (e.getSource() == black) { 62 drawArea.setStrokeColor(Color.BLACK); 63 } else if (e.getSource() == blue) { 64 drawArea.setStrokeColor(Color.BLUE); 65 } else if (e.getSource() == green) { 66 drawArea.setStrokeColor(Color.GREEN); 67 } else if (e.getSource() == red) { 68 drawArea.setStrokeColor(Color.RED); 69 } else if (e.getSource() == magenta) { 70 drawArea.setStrokeColor(Color.MAGENTA); 71 } else if (e.getSource() == white) { 72 drawArea.setStrokeColor(Color.WHITE); 73 } 74 } 75 }; 76 77 ButtonGroup group = new ButtonGroup(); // 同じグループに入れると勝手にトグルしてくれる 78 JPanel controls = new JPanel(); 79 controls.add(new JLabel("Color")); 80 81 JToggleButton[] buttons = new JToggleButton[]{ green, blue, black, red, magenta,white }; 82 for (JToggleButton button : buttons) { 83 button.addActionListener(actionListener); 84 group.add(button); 85 controls.add(button); 86 } 87 88 return controls; 89 } 90 91 private JPanel createSizeButtons() { 92 JToggleButton stroke1 = new JToggleButton("1", true); 93 JToggleButton stroke5 = new JToggleButton("5"); 94 JToggleButton stroke10 = new JToggleButton("10"); 95 JToggleButton stroke20 = new JToggleButton("20"); 96 97 ActionListener actionListener = new ActionListener() { 98 @Override public void actionPerformed(ActionEvent e) { 99 if (e.getSource() == stroke1) { 100 drawArea.setStrokeSize(1); 101 } else if (e.getSource() == stroke5) { 102 drawArea.setStrokeSize(5); 103 } else if (e.getSource() == stroke10) { 104 drawArea.setStrokeSize(10); 105 } else if (e.getSource() == stroke20) { 106 drawArea.setStrokeSize(20); 107 } 108 } 109 }; 110 111 ButtonGroup group = new ButtonGroup(); 112 JPanel controls = new JPanel(); 113 controls.add(new JLabel("Size")); 114 115 JToggleButton[] buttons = new JToggleButton[]{ stroke1, stroke5, stroke10,stroke20 }; 116 for (JToggleButton button : buttons) { 117 button.addActionListener(actionListener); 118 group.add(button); 119 controls.add(button); 120 } 121 122 return controls; 123 } 124} 125 126class DrawArea extends JComponent { 127 private Image image; 128 private Graphics2D g2; 129 private int oldX, oldY; 130 131 public DrawArea() { 132 setDoubleBuffered(false); 133 addMouseListener(new MouseAdapter() { 134 @Override public void mousePressed(MouseEvent e) { 135 oldX = e.getX(); 136 oldY = e.getY(); 137 } 138 }); 139 140 addMouseMotionListener(new MouseMotionAdapter() { 141 @Override public void mouseDragged(MouseEvent e) { 142 int currentX = e.getX(); 143 int currentY = e.getY(); 144 145 g2.drawLine(oldX, oldY, currentX, currentY); 146 repaint(); 147 148 oldX = currentX; 149 oldY = currentY; 150 } 151 }); 152 } 153 154 protected void paintComponent(Graphics g) { 155 if (image == null) { 156 image = createImage(getWidth(), getHeight()); 157 g2 = (Graphics2D) image.getGraphics(); 158 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 159 clear(); 160 } 161 162 g.drawImage(image, 0, 0, null); 163 } 164 165 public void clear() { 166 Paint p = g2.getPaint(); // 元の色 167 g2.setPaint(Color.WHITE); 168 g2.fillRect(0, 0, getWidth(), getHeight()); 169 g2.setPaint(p); // 元の色に戻す 170 repaint(); 171 } 172 173 public void setStrokeColor(Color color) { g2.setPaint(color); } 174 175 public void setStrokeSize(int size) { 176// g2.setStroke(new BasicStroke(size)); // だけだとギザギザが汚い 177 g2.setStroke(new BasicStroke(size, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 178 } 179

どうかお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/26 06:25

今何がどこまでできていて何が起きてるのでしょうか。 「質問した」と書いてあるだけで質問になっていませんし、要件だけでしたら調べて何も出ないように思えません(要は丸投げです)
guest

回答2

0

ベストアンサー

imageBufferedImageにキャストできます。
こんなメソッドをボタンなりなんなりから呼び出せばいいでしょう。

Java

1public void save() { 2 JFileChooser fileChooser = new JFileChooser(); // ファイルダイアログ 3 fileChooser.setFileFilter(new FileNameExtensionFilter("pngファイル", "png")); // ファイルの種類設定 4 if (fileChooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return; // OKじゃなければ何もせず抜ける 5 6 File file = fileChooser.getSelectedFile(); // 新しいファイルもしくは選択したファイル 7 String filePath = file.getPath(); 8 if (!filePath.toLowerCase().endsWith(".png")) // 拡張子の確認 9 file = new File(filePath + ".png"); // 付いてなければ付ける 10 11 try { 12 ImageIO.write((BufferedImage) image, "png", file); // imageを指定フォーマットで指定パスに保存 13 } catch (Exception e) { 14 e.printStackTrace(); 15 } 16}

一応全文

Java

1import java.awt.BasicStroke; 2import java.awt.BorderLayout; 3import java.awt.Color; 4import java.awt.Graphics; 5import java.awt.Graphics2D; 6import java.awt.Image; 7import java.awt.Paint; 8import java.awt.RenderingHints; 9import java.awt.event.ActionEvent; 10import java.awt.event.ActionListener; 11import java.awt.event.MouseAdapter; 12import java.awt.event.MouseEvent; 13import java.awt.event.MouseMotionAdapter; 14import java.awt.image.BufferedImage; 15import java.io.File; 16import javax.imageio.ImageIO; 17import javax.swing.ButtonGroup; 18import javax.swing.JButton; 19import javax.swing.JComponent; 20import javax.swing.JFileChooser; 21import javax.swing.JFrame; 22import javax.swing.JLabel; 23import javax.swing.JPanel; 24import javax.swing.JToggleButton; 25import javax.swing.filechooser.FileNameExtensionFilter; 26 27public class SwingPaint extends JFrame { 28 private final DrawArea drawArea = new DrawArea(); 29 30 public static void main(String[] args) { 31 new SwingPaint().setVisible(true); 32 } 33 34 private SwingPaint() { 35 super("お絵かき"); 36 setSize(600, 600); 37 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 38 setLocationRelativeTo(null); 39 setResizable(false); 40 41 JPanel panel = new JPanel(); 42 JButton clearBtn = new JButton("Clear"); 43 clearBtn.addActionListener(e -> drawArea.clear()); 44 panel.add(clearBtn); 45 46 JButton saveBtn = new JButton("Save..."); 47 saveBtn.addActionListener(e -> drawArea.save()); 48 panel.add(saveBtn); 49 50 JPanel controls = new JPanel(new BorderLayout()); 51 controls.add(createColorButtons(), BorderLayout.NORTH); 52 controls.add(createSizeButtons(), BorderLayout.CENTER); 53 controls.add(panel, BorderLayout.EAST); 54 55 add(controls, BorderLayout.NORTH); 56 add(drawArea, BorderLayout.CENTER); 57 } 58 59 private JPanel createColorButtons() { 60 JToggleButton green = new JToggleButton("緑"); 61 JToggleButton blue = new JToggleButton("青"); 62 JToggleButton black = new JToggleButton("黒", true); 63 JToggleButton red = new JToggleButton("赤"); 64 JToggleButton magenta = new JToggleButton("マゼンタ"); 65 JToggleButton white = new JToggleButton("消しゴム"); 66 67 ActionListener actionListener = new ActionListener() { 68 @Override public void actionPerformed(ActionEvent e) { 69 if (e.getSource() == black) { 70 drawArea.setStrokeColor(Color.BLACK); 71 } else if (e.getSource() == blue) { 72 drawArea.setStrokeColor(Color.BLUE); 73 } else if (e.getSource() == green) { 74 drawArea.setStrokeColor(Color.GREEN); 75 } else if (e.getSource() == red) { 76 drawArea.setStrokeColor(Color.RED); 77 } else if (e.getSource() == magenta) { 78 drawArea.setStrokeColor(Color.MAGENTA); 79 } else if (e.getSource() == white) { 80 drawArea.setStrokeColor(Color.WHITE); 81 } 82 } 83 }; 84 85 ButtonGroup group = new ButtonGroup(); 86 JPanel controls = new JPanel(); 87 controls.add(new JLabel("Color")); 88 89 JToggleButton[] buttons = new JToggleButton[]{ green, blue, black, red, magenta, white }; 90 for (JToggleButton button : buttons) { 91 button.addActionListener(actionListener); 92 group.add(button); 93 controls.add(button); 94 } 95 96 return controls; 97 } 98 99 private JPanel createSizeButtons() { 100 JToggleButton stroke1 = new JToggleButton("1", true); 101 JToggleButton stroke5 = new JToggleButton("5"); 102 JToggleButton stroke10 = new JToggleButton("10"); 103 JToggleButton stroke20 = new JToggleButton("20"); 104 105 ActionListener actionListener = new ActionListener() { 106 @Override public void actionPerformed(ActionEvent e) { 107 if (e.getSource() == stroke1) { 108 drawArea.setStrokeSize(1); 109 } else if (e.getSource() == stroke5) { 110 drawArea.setStrokeSize(5); 111 } else if (e.getSource() == stroke10) { 112 drawArea.setStrokeSize(10); 113 } else if (e.getSource() == stroke20) { 114 drawArea.setStrokeSize(20); 115 } 116 } 117 }; 118 119 ButtonGroup group = new ButtonGroup(); 120 JPanel controls = new JPanel(); 121 controls.add(new JLabel("Size")); 122 123 JToggleButton[] buttons = new JToggleButton[]{ stroke1, stroke5, stroke10, stroke20 }; 124 for (JToggleButton button : buttons) { 125 button.addActionListener(actionListener); 126 group.add(button); 127 controls.add(button); 128 } 129 130 return controls; 131 } 132} 133 134class DrawArea extends JComponent { 135 private Image image; 136 private Graphics2D g2; 137 private int oldX, oldY; 138 139 public DrawArea() { 140 setDoubleBuffered(false); 141 addMouseListener(new MouseAdapter() { 142 @Override public void mousePressed(MouseEvent e) { 143 oldX = e.getX(); 144 oldY = e.getY(); 145 } 146 }); 147 148 addMouseMotionListener(new MouseMotionAdapter() { 149 @Override public void mouseDragged(MouseEvent e) { 150 int currentX = e.getX(); 151 int currentY = e.getY(); 152 153 g2.drawLine(oldX, oldY, currentX, currentY); 154 repaint(); 155 156 oldX = currentX; 157 oldY = currentY; 158 } 159 }); 160 } 161 162 protected void paintComponent(Graphics g) { 163 if (image == null) { 164 image = createImage(getWidth(), getHeight()); 165 g2 = (Graphics2D) image.getGraphics(); 166 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 167 clear(); 168 } 169 170 g.drawImage(image, 0, 0, null); 171 } 172 173 public void clear() { 174 Paint p = g2.getPaint(); 175 g2.setPaint(Color.WHITE); 176 g2.fillRect(0, 0, getWidth(), getHeight()); 177 g2.setPaint(p); 178 repaint(); 179 } 180 181 public void save() { 182 JFileChooser fileChooser = new JFileChooser(); // ファイルダイアログ 183 fileChooser.setFileFilter(new FileNameExtensionFilter("pngファイル", "png")); // ファイルの種類設定 184 if (fileChooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return; // OKじゃなければ何もせず抜ける 185 186 File file = fileChooser.getSelectedFile(); // 新しいファイルもしくは選択したファイル 187 String filePath = file.getPath(); 188 if (!filePath.toLowerCase().endsWith(".png")) // 拡張子の確認 189 file = new File(filePath + ".png"); // 付いてなければ付ける 190 191 try { 192 ImageIO.write((BufferedImage) image, "png", file); // imageを指定フォーマットで指定パスに保存 193 } catch (Exception e) { 194 e.printStackTrace(); 195 } 196 } 197 198 public void setStrokeColor(Color color) { g2.setPaint(color); } 199 200 public void setStrokeSize(int size) { 201 g2.setStroke(new BasicStroke(size, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 202 } 203}

投稿2021/01/26 09:31

TN8001

総合スコア9396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

see: https://docs.oracle.com/javase/jp/8/docs/api/javax/imageio/ImageIO.html

java

1import javax.imageio.ImageIO; 2import java.awt.*; 3import java.awt.image.BufferedImage; 4import java.io.File; 5 6public class xxHoge { 7 public static final void main(final String[] args) throws Exception { 8 final BufferedImage image = new BufferedImage(100, 200, BufferedImage.TYPE_INT_ARGB); 9 final Graphics2D g = (Graphics2D) image.getGraphics(); 10 g.setColor(Color.RED); 11 g.fill(new Rectangle(10, 20, 40, 50)); 12 ImageIO.write(image, "png", new File("/tmp/xx.png")); 13 } 14}

投稿2021/01/26 06:37

shiketa

総合スコア3990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問