`

BMP图片——打开和保存

阅读更多

BMP的背后操作—以打开和保存为例

在使用windows的过程中,我们经常能见到bmp格式的图片,但是不知道系统是如何使用BMP图片的。
BMP图片的详细信息包括三个部分:
        信息头(14个字节)
        位图信息(40个字节)
        调色板(当位图=1,4,8 时,分别有 2,16,256 个表项;当为24位图时,没有颜色表项)
        位图数据(记录顺序是在扫描行内是从左到右, 扫描行之间是从下到上)(详细的BMP文档 见附件)
如何打开一张为BMP格式的图片呢?(24位图为例)

在这里我们会发现位运算的重要性,会发现int类型和字节之间的转换非常频繁,int 不仅可以表示数字,还可以表示颜色,还能拆分成字节

我们需要知道:一个int类型是32位,可以拆分成四个字节表示

                         24位图,一个像素占三个字节

                         在windows系统中的输出顺序是倒序,与java中输出顺序相反
                         windows中int的保存方式是:低位在前 ,高位在后
                        Java 中int的保存方式是:高位在前 低位在后
那我们就简单的来读取一下bmp图片

打开一张bmp图片

先写几个需要用到的方法

//读出int类型数据的方法
 public int myReadInt(InputStream ips) throws Exception {
//先读到的是低位
  int a = ips.read() & 0xff;
  int b = ips.read() & 0xff;
  int c = ips.read() & 0xff;
  int d = ips.read() & 0xff;
//拼接成一个int
  int t = (d << 24) + (c << 16) + (b << 8) + a;
 return t;
 }
//读取颜色的方法
 public int myReadColor(InputStream ips) throws Exception {
//倒序接收
  int b = ips.read() & 0xff;
  int g = ips.read() & 0xff;
  int r = ips.read() & 0xff;
//组成一个颜色,
  int t = (r << 16) + (g << 8) + b;
  return t;
 }

 
为了简洁操作,只读出重要的数据

 

//得到一个输入流
FileInputStream fis = new FileInputStream(path2);
  // 跳过18个字节,直接读取位图的宽和高
  fis.skip
//调用读int类型数据的方法,返回一个int类型的数
  int width = myReadInt(fis);
  int height = myReadInt(fis);
  // 跳到位图数据
  fis.skip(28);
  //计算行末尾需要补0的个数
  int num = width * 3 % 4;
  if (num > 0) {
   num = 4 - num;
  } 
  // 定义一个数组,来存放颜色数据,这里是用已经定义好了的数组
  DrawListener.arr = new int[height][width];
  // 循环取出数据,存放到数组
  for (int i = height - 1; i >= 0; i--) {
   for (int j = 0; j < width; j++) {
//调用将字节变成int类型的颜色的方法
    DrawListener.arr[i][j] = myReadColor(fis);
   }
   // 一行完了,跳过补得num个0;
   fis.skip(num);
  }
  // 重新设置屏幕大小
  panel.setPreferredSize(new Dimension(width, height));
  // 刷新面板
  SwingUtilities.updateComponentTreeUI(panel);

 

保存BMP图片(详细看附件)

     我们需要一个文件输出流用来将图片信息输出(字节的形式输出)
     按 照bmp输出的要求,将规定的数据输出,有几个点需要注意
    在输出信息头时时,注意我们需要输出图片的大小,在这里是将图片上的所有点的颜色当作一个二维数组,方便操作

 int height = DrawListener.arr.length;
 int width = DrawListener.arr[0].length;

 
由于,Windows规定一个扫描行所占的字节数必须是4 的倍数 ( 即以 long 为单位 ), 不足的以 0 填充,
在计算文件大小时,需要计算补0的个数(4 - width * 3 % 4)
24位位图文件大小=文件头+信息头+位图数据+补0=14+40+宽*3*高+(4-+宽*3%4)*高

int size = 14 + 40 + (width * 3 * height) + (4 - width * 3 % 4)* height;

在输出位图信息时,需要注意

//int类型的输出方法
public void myWriteInt(OutputStream ops, int t) throws Exception {
	// 将int类型转为四个字节
	int a = (t >> 24) & 0xff;
	int b = (t >> 16) & 0xff;
	int c = (t >> 8) & 0xff;
	int d = t & 0xff;
	// windows系统中是倒序传输的
	ops.write(d);ops.write(c);
	ops.write(b);ops.write(a);
}
//输出颜色的方法
public void myWriteColor(OutputStream ops, int t) throws Exception {
		int r = (t >> 16) & 0xFF;
		int g = (t >> 8) & 0xFF;
		int b = t & 0xFF;

		ops.write(b);
		ops.write(g);
		ops.write(r);
}

 

在输出位图数据文件时,需要注意行是否需要补0

//用两个for循环,遍历数组,得到每个点的颜色,  从下到上,从左到右
	for(int i=height-1;i>=0;i--){
		for(int j=0;j<width;j++){
		//调用将颜色输出的方法
		myWriteColor(ops, DrawListener.arr[i][j]);
	}
	//一行完了,在后面补0
	for(int k=0;k<num;k++){
		//补的是字节0
		ops.write(0);
	}
}

 

0
1
分享到:
评论

相关推荐

    合成BMP图片.zip_bmp合并_bmp合成_bmp图片合并_合成BMP图片_图片合成

    在标签中,"bmp合并"、"bmp合成"、"bmp图片合并"、"合成bmp图片"和"图片合成"都是关键词,强调了操作的核心——合并BMP图像。这些标签可以作为搜索此类话题时的关键字,帮助用户找到相关的资源或解答。 从压缩包内...

    BMP图片操作小软件

    总之,这款"BMP图片操作小软件"涵盖了基本的图像处理操作,对于理解和实践BMP图片的读取、修改和保存有着重要的学习价值。无论是对计算机图形学初学者,还是对图像处理感兴趣的开发者,都能从中获益。

    bmp2.rar_BMP图片查看其

    下面将详细介绍BMP图片格式以及如何实现打开、保存和编辑BMP图像。 一、BMP文件格式 1. 文件头:BMP文件以文件头开始,包括两种类型——DIB头(Device Independent Bitmap)和BITMAPFILEHEADER。BITMAPFILEHEADER是...

    图片浏览器——我自己亲手编的大家来看看!

    3. **文件I/O操作**:图片浏览器需要读取和保存图片文件,这涉及到文件系统的操作,如打开、读取、关闭文件,以及支持常见的图像格式,如JPEG、PNG、BMP等。 4. **事件驱动编程**:用户与程序的交互,如点击按钮或...

    编程实现bmp的输入输出

    ### 编程实现bmp图像的输入输出——多媒体技术实验知识点详解 #### 一、实验背景与目标 在《多媒体技术》课程中,本实验旨在通过编程实现BMP图像的输入输出,帮助学生深入理解BMP图像文件的结构及其处理方法。通过...

    数字图像处理——MFC实现DICOM图像打开与处理

    综上所述,"数字图像处理——MFC实现DICOM图像打开与处理"涉及了 DICOM 格式理解、MFC 应用程序开发、图像处理算法、窗位窗宽调整和文件I/O等多个方面。通过学习和实践这些知识点,开发者可以构建自己的DICOM图像...

    bmp_info.rar_BMP 显示_bmp rgb_bmp info_显示 BMP_显示 bmp vc

    1. **文件头**:BMP文件头通常是一个14字节的结构,包含两个子部分——DOS文件头(2字节)和Windows文件头(12字节)。DOS文件头的"BM"两个字符表示这是个BMP文件。Windows文件头提供了文件的实际大小和图像数据在文件中...

    leadtools16 vb6 打开bmp,另存DICOM文件的最简源码

    本篇将详细介绍如何使用Leadtools16库在VB6环境下打开BMP图像文件,并将其转换保存为DICOM格式。 首先,Leadtools16是一个功能强大的图像处理和OCR(Optical Character Recognition)工具包,由RasterEdge公司开发...

    raw2bmp-v1.0.zip

    《raw2bmp-v1.0》这个压缩包包含了两个版本的可执行文件——x86和x64,分别适用于32位和64位的操作系统。这表明该工具兼容不同架构的计算机。使用方法非常简单,用户只需将RAW文件拖放到可执行文件上,然后在提示下...

    读取并显示BMP位图

    首先,你需要创建一个文件流对象来打开BMP文件,然后逐个读取文件头和位图信息头,解析出图像的关键参数。例如,你可以使用fread函数读取固定长度的数据块,并转换为对应的结构体,如BITMAPFILEHEADER和...

    DIP.rar_matlab dip_matlab工具尺寸_matlab幂次变换_保存为bmp_灰度图编码

    &#8226 重载可以重新载入最近一次通过“文件——〉打开”打开的图像,这时将对重新载入的图像进行处理; &#8226 对于彩色图像,可以显示但如果想要使程序能正确处理,必须将其先转换成灰度图像,使用“文件——〉RGB...

    基于VC++MFC程序设计——简易画图板

    - 文件保存时可以选择不同的格式,如BMP、WMF等。 5. **性能优化:** - 对于复杂的绘图操作,需要考虑性能优化问题。 - 可以采用缓存机制减少重复计算,提高绘图速度。 #### 结论 本篇文章详细介绍了如何使用...

    RATA——工具绿色版.7z

    使用方法如下 1、先点击左侧的slect bmp file导入logo文件;... 4、点击make out.plt 生成的logo文件,该文件会保存在bmp图片所在文件夹。 5、打开allegro的brd文件,选择file/import/ipf,导入.plt文件

    word图片导出方法

    选中图片,复制图片,打开"画图工具”,然后粘贴到画图工具里,然后在保存为jpg或者gif,它默认的格式为BMP,并且图片的清晰度有损,不能很方便的裁剪,这个方法相当于是新建了一个图片,并没有将原始图导出,并不是...

    C#读取DAT文件文件,生成图像,并保存图像至数据库

    本主题涉及的关键知识点是使用C#处理特定类型的文件——DAT文件,以及与图像处理和数据库操作相关的技术。 首先,DAT文件通常是一种通用文件格式,用于存储各种类型的数据,包括图像数据。在本场景中,它包含了压缩...

    ImageJ 1.42——ij142-jdk6-setup.exe

    ImageJ能够显示,编辑,分析,处理,保存,打印8位,16位,32位的图片, 支持TIFF, PNG, GIF, JPEG, BMP, DICOM, FITS等多种格式。ImageJ支持图像栈功能,即在一个窗口里以多线程的形式层叠多个图像, 并行处理。...

    python网文——PIL库

    PIL支持数十种图像格式的打开与处理,如常见的JPG、PNG、BMP等。尽管PIL最初是为Python 2设计的,但为了适应Python 3的发展,社区成员开发了名为Pillow的分支,其功能与用法与原始PIL库基本一致,但更加稳定且支持更...

    怎样把EXCEL表格转换成图片

    完成页面设置后,接下来就是关键的一步——复制图片。具体操作如下: 1. **全选表格**:再次全选你想要转换为图片的部分。 2. **复制图片**:在“文件”菜单中找到“编辑”选项,在下拉菜单中选择“复制图片”。...

    UDP通信——客户端循环向服务器端发送图像.rar

    1. 打开UDP套接字,设置目标服务器的IP地址和端口号。 2. 读取图像文件的二进制内容。 3. 将二进制内容分割成适合UDP数据报文大小的块,通常不超过65535字节(UDP报头的最大大小加上IP报头的最大大小)。 4. 对每个...

Global site tag (gtag.js) - Google Analytics