package viewImage;
import java.awt.Color;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
public class Main {
static RGB[][] data = null;
static int w = 0;
static int h = 0;
static ArrayList<ArrayList<Point>> ps = new ArrayList<ArrayList<Point>>();
static boolean reset = false;
static JMenuBar menubar = new JMenuBar();
public static void main(String[] args) {
MyPanel panel = new MyPanel();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("viewIamge");
frame.setSize(350, 350);
frame.add(panel);
JButton open = new JButton("open");
JButton save = new JButton("save");
JButton clear = new JButton("clear");
save.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (data != null) {
return;
}
int maxWidth = -1;
int maxHeight = -1;
for (ArrayList<Point> l : ps) {
for (Point p : l) {
maxWidth = Math.max(p.x, maxWidth);
maxHeight = Math.max(maxHeight, p.y);
}
}
int max = Math.max(maxHeight, maxWidth);
if (max > 0) {
BufferedImage image = new BufferedImage(max, max, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, max, max);
byte[] raw = new byte[max * max * 3];
for (ArrayList<Point> l : ps) {
for (int i = 0; i < l.size() - 1; i++) {
Point p1 = l.get(i);
Point p2 = l.get(i + 1);
g.setColor(Color.RED);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
FileDialog dialog = new FileDialog(frame, "save", FileDialog.SAVE);
dialog.setVisible(true);
File img = dialog.getFiles()[0];
FileOutputStream out;
try {
int index = 0;
for (int x = 0; x < max; x++) {
for (int y = 0; y < max; y++) {
int v = image.getRGB(x, y);
raw[index + 0] = (byte) ((v >> 16) & 0xff);
raw[index + 1] = (byte) ((v >> 8) & 0xff);
raw[index + 2] = (byte) ((v >> 0) & 0xff);
index += 3;
}
}
out = new FileOutputStream(img);
out.write(raw);
out.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
});
open.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
FileDialog dialog = new FileDialog(frame);
dialog.setVisible(true);
synchronized (Main.class) {
File file = dialog.getFiles()[0];
w = (int) Math.sqrt(file.length() / 3);
data = new RGB[w][w];
try {
FileInputStream in = new FileInputStream(file);
byte[] raw = new byte[w * w * 3];
byte[] buf = new byte[1024];
int len = 0;
int destPos = 0;
while ((len = in.read(buf)) > 0) {
if (destPos + len > raw.length) {
len = raw.length - destPos;
System.arraycopy(buf, 0, raw, destPos, len);
break;
}
System.arraycopy(buf, 0, raw, destPos, len);
destPos += len;
}
int index = 0;
for (int i = 0; i <= raw.length - 3; i += 3) {
RGB rgb = new RGB();
rgb.r = raw[i] & 0xff;
rgb.g = raw[i + 1] & 0xff;
rgb.b = raw[i + 2] & 0xff;
data[index / w][index % w] = rgb;
index++;
}
in.close();
panel.repaint();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
});
clear.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
data = null;
w = 0;
h = 0;
ps.clear();
reset = true;
panel.repaint();
}
});
menubar.add(open);
menubar.add(save);
menubar.add(clear);
frame.setJMenuBar(menubar);
frame.add(panel);
frame.addMouseListener(panel);
frame.addMouseMotionListener(panel);
frame.setVisible(true);
}
static class RGB {
int r;
int g;
int b;
}
static class Point {
int x;
int y;
}
static class MyPanel extends JPanel implements MouseMotionListener, MouseListener {
ArrayList<Point> line;
@Override
public void paint(Graphics g) {
super.paint(g);
if(reset) {
g.setColor(Color.GRAY);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
reset = false;
return;
}
if (data != null) {
for (int i = 0; i < w; i++) {
for (int j = 0; j < w; j++) {
RGB rgb = data[i][j];
g.setColor(new Color(rgb.r, rgb.g, rgb.b));
g.drawRect(i, j, 1, 1);
}
}
} else {
for (ArrayList<Point> l : ps) {
for (int i = 0; i < l.size() - 1; i++) {
Point p1 = l.get(i);
Point p2 = l.get(i + 1);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
line = new ArrayList<Point>();
Point p = new Point();
p.x = e.getXOnScreen();
p.y = e.getYOnScreen() - menubar.getHeight();
line.add(p);
ps.add(line);
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
Point p = new Point();
p.x = e.getXOnScreen();
p.y = e.getYOnScreen() - menubar.getHeight();
line.add(p);
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
}
鼠标绘图demo
最新推荐文章于 2024-08-17 17:05:51 发布
这篇博客介绍了如何使用Java编程语言实现一个简单的鼠标绘图功能,通过监听鼠标事件,实现在画布上绘制线条和其他图形。内容涵盖了Java图形用户界面的基本操作和事件处理机制。
摘要由CSDN通过智能技术生成