`
hxquicl
  • 浏览: 2926 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java画图板的24位bmp保存

    博客分类:
  • java
阅读更多

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格式的图片(一)

    在本篇博文中,我们将探讨如何使用Java编程语言来实现一个简单的画图板应用程序,并学习如何保存和读取BMP(Bitmap)格式的图片。BMP是一种无损图像格式,通常用于存储像素数据,便于程序处理。以下是实现这一功能所...

    一个多功能Java画图板

    Java画图板是一种基于Java图形用户界面(GUI)技术实现的程序,允许用户在屏幕上绘制图形。这个"多功能Java画图板"项目可能是为教育、设计或者编程练习目的而创建的,它集成了多种功能,使得用户能够进行复杂的绘图...

    仿XP画图板

    【标题】"仿XP画图板"是一款基于JAVA编程语言开发的应用程序,旨在模拟Windows XP操作系统中的经典画图工具。这个项目是为那些希望学习或熟悉GUI(图形用户界面)编程和事件处理的初学者设计的,同时也为用户提供了...

    仿 XP 系统画图板

    5. **图像处理**:除了基本的绘图操作,可能还涉及到图像的保存和打开功能,这需要对JAVA的I/O流和图像处理类库(如`java.awt.image.BufferedImage`)有深入理解,以便读写图片文件,如BMP、JPEG或PNG格式。...

    java画图板(直线、矩形、圆、随意线条)

    在Java编程语言中,创建一个简单的画图板应用程序是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计和事件处理。本项目通过Java实现了基本的绘图功能,包括绘制直线、矩形、圆形以及自由绘制...

    java编写的绘图板小程序

    Java编写的绘图板小程序是一款基于Java编程语言开发的简易画板应用,它提供了一系列丰富的绘图功能,如撤销、恢复、调色板选色、保存图像为BMP格式以及打开BMP图像等。这款程序的亮点在于采用了双缓冲技术,有效解决...

    画图板,图形处理,模仿window画图板

    6. **图像导入与导出**:除了直接在画布上创作,画图板还可以导入图片进行编辑,然后将完成的作品导出为常见的图像格式,如JPEG、PNG或BMP。 7. **选择与移动**:用户可以通过选择工具来选取画布上的特定部分,然后...

    画图板系统

    【画图板系统】是一个基于Java编程语言开发的轻量级应用程序,专为用户提供一个简易而功能丰富的绘图环境。这个系统旨在满足用户在日常学习、工作或创意设计中的基本绘图需求,无论你是学生、教师还是业余艺术家,都...

    bmp格式图片转换为raw格式

    对于24位BMP(每像素有8位红、绿、蓝分量),我们可以直接将RGB值存入RAW文件。由于RAW格式通常不包含元数据,所以我们需要在转换时记录这些信息,以便后续处理。 以下是转换步骤的简要概述: 1. 打开BMP文件并...

    dr.rar_画图板

    5. 文件存储与加载:画图板需要能保存用户的创作,通常以图片格式如BMP、PNG或JPEG存储,这就需要理解文件格式和数据编码。 6. 非破坏性编辑:高级的画图板可能支持非破坏性编辑,即保存原始数据并在需要时重新渲染...

    JAVA实现简单画图器

    在本项目中,"JAVA实现简单画图器"是一个基于Java编程语言开发的图形用户界面应用,它模拟了Windows操作系统自带的画图程序,提供基本的绘画和编辑功能。这个程序可能包括以下核心知识点: 1. **Java GUI**: 为了...

    画图板的制作

    2. GUI类文件:如`DrawingPanel.py`或`DrawArea.java`,这些类定义了画图板的外观和行为,可能包含重写的鼠标事件方法。 3. 可能还有其他辅助文件,如配置文件、资源文件(如图片、字体)等。 制作一个画图板应用的...

    java 画图软件(源程序+设计说明文档)

    java 画图软件由4个模块构成,分别是工具模块、文件模块、颜色模块、图像放大/缩小模块,帮助模块。  工具模块 主要说在系统界面的右侧,用户可以选取不同的工具来进行图形的绘制,擦除等各种功能。主要用于不同...

    画图板

    标签“源码”意味着“画图板”可能是开放源代码的,这意味着任何人都可以查看、学习甚至修改其内部代码,以适应自己的特定需求或进行二次开发。这对于编程爱好者和学习者来说是一份宝贵的教育资源,他们可以通过阅读...

    java小画板

    5. **文件保存与读取**: 考虑到绘图应用通常需要保存和加载作品,"Java小画板"可能实现了将图像数据序列化为文件(如.png或.bmp格式),并提供相应的读取功能。这涉及到了文件I/O操作,如`FileOutputStream`和`...

    仿windows画图板

    【标题】"仿windows画图板"是一款基于编程技术实现的图形用户界面应用程序,它旨在模仿微软Windows操作系统中的“画图”工具。这个程序的核心功能是提供一个虚拟画布,让用户能够通过鼠标或触控设备进行绘画操作,...

    类似画图板的小程序.zip

    标题中的“类似画图板的小程序”指的是一个简易的图形编辑工具,可能是一个基于计算机编程实现的轻量级应用程序,类似于Windows操作系统自带的“画图”工具。这种小程序通常允许用户进行基本的绘图操作,如绘制线条...

    自己做的画图板,不是很复杂

    标题中的“自己做的画图板,不是很复杂”表明这是一个个人开发的简易版画图软件,类似于Windows操作系统内置的“画图”程序。这个项目可能是为了学习编程、图形用户界面设计或者提升个人技能而创建的。它暗示了这个...

    一个仿XP的画图板实现

    标题 "一个仿XP的画图板实现" 暗示我们即将探讨的是一个软件开发项目,这个项目的目标是创建一个类似微软Windows XP操作系统中的“画图”程序的复制品。这个程序可能包含了基本的绘图工具,如选择颜色、线条粗细、...

    Java实现简易画图程序.doc

    ### Java实现简易画图程序知识点解析 #### 一、项目背景与目标 - **项目名称**:简易绘图程序 - **开发目的**:作为Java课程的期末作业,旨在运用所学的GUI(图形用户界面)知识开发一个简易的绘图程序。 - **功能...

Global site tag (gtag.js) - Google Analytics