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

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

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

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

保存

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

Q&A

解決済

1回答

1553閲覧

java描画アプリ ぼかし、保存機能

1236

総合スコア19

Java

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

保存

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

0グッド

0クリップ

投稿2020/01/21 13:39

編集2020/01/21 14:41

前提・実現したいこと

お絵かきアプリで『ぼかし』というボタンを押すと、自分が今描いていた絵がぼやけるようにしたいです。

発生している問題・エラーメッセージ

今自分が描いているキャンバスを画像として保存し、その画像にカーネルを畳み込み演算でぼかすという流れを考えたのですが、この方法は正しいでしょうか?よりよい方法があれば教えて欲しいです。
また、現在保存の機能をつける段階なのですが、うまくいきません。どのように改善したらよいでしょうか。

MyClient4.java:382: エラー: writeに適切なメソッドが見つかりません(Image,String,OutputStream) ImageIO.write(img, "jpg", out);//画像をファイルに保存 ^ メソッド ImageIO.write(RenderedImage,String,ImageOutputStream)は使用できません (引数の不一致: ImageをRenderedImageに変換できません:) メソッド ImageIO.write(RenderedImage,String,File)は使用できません (引数の不一致: ImageをRenderedImageに変換できません:) メソッド ImageIO.write(RenderedImage,String,OutputStream)は使用できません (引数の不一致: ImageをRenderedImageに変換できません:)

該当のソースコード

java

1 public void mode10(){ 2 try { 3 OutputStream out = new FileOutputStream("img.jpg");//fileの作成 4 ImageIO.write(img, "jpg", out);//画像をファイルに保存 5 System.out.println("保存");//確認 6 } catch (IOException e) { 7 // TODO 自動生成された catch ブロック 8 e.printStackTrace(); 9 System.out.println("エラー"); 10 } 11 12 } 13 14 15 16***************************** 17 // ■ コンストラクタ 18 MyCanvas2(MyClient4 obj){ 19 mode=0; // initial value 20 this.setSize(500,500); // キャンバスのサイズを指定 21 setBackground(new Color(255, 255, 255)); 22 addMouseListener(this); // マウスのボタンクリックなどを監視するよう指定 23 addMouseMotionListener(this); // マウスの動きを監視するよう指定 24 client4 = obj; 25 } 26 27 // ■ メソッド(オーバーライド) 28 // フレームに何らかの更新が行われた時の処理 29 public void update(Graphics g) { 30 paint(g); // 下記の paint を呼び出す 31 } 32 33 // ■ メソッド(オーバーライド) 34 public void paint(Graphics g) { 35 d = getSize(); // キャンバスのサイズを取得 36 if (img == null) // もし仮の画用紙の実体がまだ存在しなければ 37 img = createImage(d.width, d.height); // 作成 38 if (gc == null) // もし仮の画用紙用のペン (GC) がまだ存在しなければ 39 gc = img.getGraphics(); // 作成 40 g.drawImage(img, 0, 0, this); // 仮の画用紙の内容を MyCanvas に描画 41 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因は引数の型が合わないということですね。
ImageRenderedImageインターフェースを持っていません。
BufferedImage等にする必要があります。

https://teratail.com/questions/236880 を見る限りこれは解決していそうですね。

保存とぼかしについて、通信部分をカットして単独のアプリにしました。

Java

1import java.awt.BorderLayout; 2import java.awt.Canvas; 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.Graphics; 6import java.awt.event.MouseEvent; 7import java.awt.event.MouseListener; 8import java.awt.event.MouseMotionListener; 9import java.awt.image.BufferedImage; 10import java.awt.image.ConvolveOp; 11import java.awt.image.Kernel; 12import java.io.File; 13import java.io.IOException; 14import javax.imageio.ImageIO; 15import javax.swing.JButton; 16import javax.swing.JFileChooser; 17import javax.swing.JFrame; 18import javax.swing.JPanel; 19import javax.swing.filechooser.FileFilter; 20import javax.swing.filechooser.FileNameExtensionFilter; 21 22 23public class MyClient4 extends JFrame { 24 private MyCanvas2 mc; 25 26 public static void main(String[] args) { 27 new MyClient4().setVisible(true); 28 } 29 30 public MyClient4() { 31 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 32 setLocationRelativeTo(null); 33 setLayout(new BorderLayout(10, 10)); 34 setTitle("DrawingApli"); 35 setSize(500, 500); 36 37 mc = new MyCanvas2(this); 38 add(mc, BorderLayout.CENTER); 39 40 JPanel p = new JPanel(); 41 JButton save = new JButton("保存..."); 42 save.addActionListener(e -> { 43 JFileChooser fileChooser = new JFileChooser(); 44 FileFilter filter = new FileNameExtensionFilter("PNGファイル(*.png)", "png"); 45 fileChooser.setFileFilter(filter); 46 47 int selected = fileChooser.showSaveDialog(this); 48 if (selected != JFileChooser.APPROVE_OPTION) return; 49 50 File file = fileChooser.getSelectedFile(); 51 if (!file.toString().toLowerCase().endsWith(".png")) { 52 file = new File(file.toString() + ".png"); 53 } 54 55 mc.save(file); 56 }); 57 p.add(save); 58 59 JButton blur = new JButton("ぼかす"); 60 blur.addActionListener(e -> mc.blur()); 61 p.add(blur); 62 63 add(p, BorderLayout.NORTH); 64 } 65} 66 67class MyCanvas2 extends Canvas implements MouseListener, MouseMotionListener { 68 private int x; 69 private int y; 70 private BufferedImage img; 71 private Graphics gc; 72 private Kernel blur = new Kernel(3, 3, new float[]{ 73 0.11f, 0.11f, 0.11f, 74 0.11f, 0.12f, 0.11f, 75 0.11f, 0.11f, 0.11f, 76 }); 77 78 MyCanvas2(MyClient4 obj) { 79 addMouseListener(this); 80 addMouseMotionListener(this); 81 } 82 83 void save(File file) { 84 try { 85 ImageIO.write(img, "png", file); 86 } catch (IOException e) { 87 e.printStackTrace(); 88 } 89 } 90 91 void blur() { 92 ConvolveOp convop = new ConvolveOp(blur, ConvolveOp.EDGE_NO_OP, null); 93 img = convop.filter(img, null); 94 gc.dispose(); 95 gc = img.createGraphics(); 96 repaint(); 97 } 98 99 @Override 100 public void update(Graphics g) { 101 paint(g); 102 } 103 104 @Override 105 public void paint(Graphics g) { 106 Dimension d = getSize(); 107 if (img == null) { 108 img = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB); 109 } 110 if (gc == null) { 111 gc = img.createGraphics(); 112 gc.setColor(Color.WHITE); 113 gc.fillRect(0, 0, d.width, d.height); // 背景を白にセット 114 } 115 116 g.drawImage(img, 0, 0, this); 117 } 118 119 public void paint2(int px, int py, int x, int y) { 120 gc.setColor(Color.BLACK); 121 gc.drawLine(px, py, x, y); 122 } 123 124 public void mouseClicked(MouseEvent e) { } 125 126 public void mouseEntered(MouseEvent e) { } 127 128 public void mouseExited(MouseEvent e) { } 129 130 public void mousePressed(MouseEvent e) { 131 x = e.getX(); 132 y = e.getY(); 133 } 134 135 public void mouseReleased(MouseEvent e) { } 136 137 public void mouseDragged(MouseEvent e) { 138 int px = x; 139 int py = y; 140 x = e.getX(); 141 y = e.getY(); 142 143 paint2(px, py, x, y); 144 repaint(); 145 } 146 147 public void mouseMoved(MouseEvent e) { } 148}
注意点

辺がぼやけません。
通信相手もぼやかすためには相手にぼかすコマンドを送り、相手側もぼかす処理をする必要があるでしょう。

投稿2020/01/23 13:35

TN8001

総合スコア9242

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問