エラーの原因は引数の型が合わないということですね。
Image
はRenderedImage
インターフェースを持っていません。
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}
注意点
辺がぼやけません。
通信相手もぼやかすためには相手にぼかすコマンドを送り、相手側もぼかす処理をする必要があるでしょう。