import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
/**
* 菜单处理监听器
*
* @author kowloon
*
*/
public class MenuListener implements ActionListener {
private MyPanel panel;
public MenuListener(MyPanel panel) {
this.panel = panel;
}
// bmp文件头
public void savebmpTop(OutputStream ops) throws Exception {
ops.write('B');
ops.write('M');
int height = DrawListener.array.length;
int width = DrawListener.array[0].length;
int size = 14 + 40 + height * width * 3 + (4 - width * 3 % 4) * height;
// 位图文件的大小
size = 14 + 40 + height * width * 3 + (4 - width * 3 % 4) * 255;
writeInt(ops, size);
// 保留字节,必须为零
writeShort(ops, (short) 0);
writeShort(ops, (short) 0);
// 位图偏移量
writeInt(ops, 54);
}
// 位图信息头
public void savebmpInfo(OutputStream ops) throws Exception {
int height = DrawListener.array.length;
int width = DrawListener.array[0].length;
// 位图信息头长度
writeInt(ops, 40);
// 位图宽
writeInt(ops, width);
// 位图高
writeInt(ops, height);
// 位图位面数总是为1
writeShort(ops, (short) 1);
// 位图24位像素
writeShort(ops, (short) 24);
// 位图是否被压缩,0为不压缩
writeInt(ops, 0);
// 字节数代表位图大小
writeInt(ops, height * width * 3 + (4 - width * 3 % 4) * height);
// 水平分辨率
writeInt(ops, 0);
// 垂直分辨率
writeInt(ops, 0);
// 颜色索引,0为所有调色板
writeInt(ops, 0);
// 对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要
writeInt(ops, 0);
}
// 图像数据阵列
public void savebmpDate(OutputStream ops) throws Exception {
int height = DrawListener.array.length;
int width = DrawListener.array[0].length;
int m = 0;
// 进行补0,必须是4位,少于4位要补0
if (width * 3 % 4 > 0) {
m = 4 - width * 3 % 4;
}
for (int i = height - 1; i >= 0; i--) {
for (int j = 0; j < width; j++) {
int t = DrawListener.array[i][j];
writeColor(ops, t);
}
for (int k = 0; k < m; k++) {
ops.write(0);
}
}
}
public void writeInt(OutputStream ops, int t) throws Exception {
int a = (t >> 24) & 0xff;
int b = (t >> 16) & 0xff;
int c = (t >> 8) & 0xff;
int d = t & 0xff;
ops.write(d);
ops.write(c);
ops.write(b);
ops.write(a);
}
public void writeColor(OutputStream ops, int t) throws Exception {
int b = (t >> 16) & 0xff;
int c = (t >> 8) & 0xff;
int d = t & 0xff;
ops.write(d);
ops.write(c);
ops.write(b);
}
public void writeShort(OutputStream ops, short t) throws Exception {
int c = (t >> 8) & 0xff;
int d = t & 0xff;
ops.write(d);
ops.write(c);
}
// 由于读取的是字节,把读取到的4个byte转化成1个int
public int changeInt(InputStream ips) throws IOException {
int t1 = ips.read() & 0xff;
int t2 = ips.read() & 0xff;
int t3 = ips.read() & 0xff;
int t4 = ips.read() & 0xff;
int num = (t4 << 24) + (t3 << 16) + (t2 << 8) + t1;
System.out.println(num);
return num;
}
// 24位的图片是1个像素3个字节。
public int readColor(InputStream ips) throws IOException {
int b = ips.read() & 0xff;
int g = ips.read() & 0xff;
int r = ips.read() & 0xff;
int c = (r << 16) + (g << 8) + b;
return c;
}
public void actionPerformed(ActionEvent e) {
// 获得被点击的组件的动作命令
String command = e.getActionCommand();
JFileChooser chooser = new JFileChooser();
if (command.equals("保存")) {
int t = chooser.showSaveDialog(null);
if (t == JFileChooser.APPROVE_OPTION) {
String path = chooser.getSelectedFile().getAbsolutePath();
try {
FileOutputStream fos = new FileOutputStream(path);
DataOutputStream dos = new DataOutputStream(fos);
savebmpTop(dos);
savebmpInfo(dos);
savebmpDate(dos);
fos.flush();
fos.close();
} catch (Exception ef) {
JOptionPane.showMessageDialog(null, "文件保存失败!!");
ef.printStackTrace();
}
}
} else if (command.equals("打开")) {
int t = chooser.showOpenDialog(null);
if (t == JFileChooser.APPROVE_OPTION) {
String path = chooser.getSelectedFile().getAbsolutePath();
try {
FileInputStream fis = new FileInputStream(path);
DataInputStream dis = new DataInputStream(fis);
dis.skip(18);
int width = changeInt(dis);// 跳过不需要的,读取宽度和高度
int height = changeInt(dis);
dis.skip(28);
// 跳过,直接读取位图数据。
DrawListener.array = new int[height][width];
int w = 0;
if (width * 3 % 4 > 0) {
t = 4 - width * 3 % 4;
}
for (int i = height - 1; i >= 0; i--) {
for (int j = 0; j < width; j++) {
// 调用自定义方法,得到图片的像素点并保存到int数组中
int c = readColor(dis);
DrawListener.array[i][j] = c;
}
dis.skip(w);
}
fis.close();
// 刷新界面
panel.repaint();
} catch (Exception ef) {
JOptionPane.showMessageDialog(null, "文件打开失败!!");
ef.printStackTrace();
}
}
}
}
}
相关推荐
在本篇博文中,我们将探讨如何使用Java编程语言来实现一个简单的画图板应用程序,并学习如何保存和读取BMP(Bitmap)格式的图片。BMP是一种无损图像格式,通常用于存储像素数据,便于程序处理。以下是实现这一功能所...
Java画图板是一种基于Java图形用户界面(GUI)技术实现的程序,允许用户在屏幕上绘制图形。这个"多功能Java画图板"项目可能是为教育、设计或者编程练习目的而创建的,它集成了多种功能,使得用户能够进行复杂的绘图...
【标题】"仿XP画图板"是一款基于JAVA编程语言开发的应用程序,旨在模拟Windows XP操作系统中的经典画图工具。这个项目是为那些希望学习或熟悉GUI(图形用户界面)编程和事件处理的初学者设计的,同时也为用户提供了...
5. **图像处理**:除了基本的绘图操作,可能还涉及到图像的保存和打开功能,这需要对JAVA的I/O流和图像处理类库(如`java.awt.image.BufferedImage`)有深入理解,以便读写图片文件,如BMP、JPEG或PNG格式。...
在Java编程语言中,创建一个简单的画图板应用程序是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计和事件处理。本项目通过Java实现了基本的绘图功能,包括绘制直线、矩形、圆形以及自由绘制...
Java编写的绘图板小程序是一款基于Java编程语言开发的简易画板应用,它提供了一系列丰富的绘图功能,如撤销、恢复、调色板选色、保存图像为BMP格式以及打开BMP图像等。这款程序的亮点在于采用了双缓冲技术,有效解决...
6. **图像导入与导出**:除了直接在画布上创作,画图板还可以导入图片进行编辑,然后将完成的作品导出为常见的图像格式,如JPEG、PNG或BMP。 7. **选择与移动**:用户可以通过选择工具来选取画布上的特定部分,然后...
【画图板系统】是一个基于Java编程语言开发的轻量级应用程序,专为用户提供一个简易而功能丰富的绘图环境。这个系统旨在满足用户在日常学习、工作或创意设计中的基本绘图需求,无论你是学生、教师还是业余艺术家,都...
对于24位BMP(每像素有8位红、绿、蓝分量),我们可以直接将RGB值存入RAW文件。由于RAW格式通常不包含元数据,所以我们需要在转换时记录这些信息,以便后续处理。 以下是转换步骤的简要概述: 1. 打开BMP文件并...
5. 文件存储与加载:画图板需要能保存用户的创作,通常以图片格式如BMP、PNG或JPEG存储,这就需要理解文件格式和数据编码。 6. 非破坏性编辑:高级的画图板可能支持非破坏性编辑,即保存原始数据并在需要时重新渲染...
在本项目中,"JAVA实现简单画图器"是一个基于Java编程语言开发的图形用户界面应用,它模拟了Windows操作系统自带的画图程序,提供基本的绘画和编辑功能。这个程序可能包括以下核心知识点: 1. **Java GUI**: 为了...
2. GUI类文件:如`DrawingPanel.py`或`DrawArea.java`,这些类定义了画图板的外观和行为,可能包含重写的鼠标事件方法。 3. 可能还有其他辅助文件,如配置文件、资源文件(如图片、字体)等。 制作一个画图板应用的...
java 画图软件由4个模块构成,分别是工具模块、文件模块、颜色模块、图像放大/缩小模块,帮助模块。 工具模块 主要说在系统界面的右侧,用户可以选取不同的工具来进行图形的绘制,擦除等各种功能。主要用于不同...
标签“源码”意味着“画图板”可能是开放源代码的,这意味着任何人都可以查看、学习甚至修改其内部代码,以适应自己的特定需求或进行二次开发。这对于编程爱好者和学习者来说是一份宝贵的教育资源,他们可以通过阅读...
5. **文件保存与读取**: 考虑到绘图应用通常需要保存和加载作品,"Java小画板"可能实现了将图像数据序列化为文件(如.png或.bmp格式),并提供相应的读取功能。这涉及到了文件I/O操作,如`FileOutputStream`和`...
【标题】"仿windows画图板"是一款基于编程技术实现的图形用户界面应用程序,它旨在模仿微软Windows操作系统中的“画图”工具。这个程序的核心功能是提供一个虚拟画布,让用户能够通过鼠标或触控设备进行绘画操作,...
标题中的“类似画图板的小程序”指的是一个简易的图形编辑工具,可能是一个基于计算机编程实现的轻量级应用程序,类似于Windows操作系统自带的“画图”工具。这种小程序通常允许用户进行基本的绘图操作,如绘制线条...
标题中的“自己做的画图板,不是很复杂”表明这是一个个人开发的简易版画图软件,类似于Windows操作系统内置的“画图”程序。这个项目可能是为了学习编程、图形用户界面设计或者提升个人技能而创建的。它暗示了这个...
标题 "一个仿XP的画图板实现" 暗示我们即将探讨的是一个软件开发项目,这个项目的目标是创建一个类似微软Windows XP操作系统中的“画图”程序的复制品。这个程序可能包含了基本的绘图工具,如选择颜色、线条粗细、...
### Java实现简易画图程序知识点解析 #### 一、项目背景与目标 - **项目名称**:简易绘图程序 - **开发目的**:作为Java课程的期末作业,旨在运用所学的GUI(图形用户界面)知识开发一个简易的绘图程序。 - **功能...