BMP文件格式分析
第0--1字节:必须是‘B’'M'两个字母
2--5字节:位图文件的大小,以字节为单位
6--7字节:位图文件保留字必须为0
8--9字节:位图文件保留字,必须为0
10--13字节:位图数据的其实位置,以相对于位图,文件头的偏移量,以字节
为单位
其次是位图信息头信息(一般40个字节),用于说明位图尺寸等信息
第0--3字节:本结构所占字节数(一般40个字节)
4--7字节:位图的宽度,以字节为单位
8--11字节:位图的高度,以字节为单位
12--13字节:目标设备的级别,必须为1
14--15字节:每个像素所需要的位数,必须是1(双色),4(16色),8(256
色)24()真彩色之一
16--19字节:位图压缩类型,如果是0(不压缩)
20--13字节:位图的大小,以字节为单位
24--27字节:位图水平分辨率,每米像素数
28--31字节:位图垂直分辨率,每米像素数
32--35字节:位图实际使用的颜色表中的颜色数
36--39字节:位图显示过程中重要的颜色数
第三部分是调色板,这个我不是很了解,因为当你保存的每个像素所需要的位数为
24时,就可以不需要它。
最后一部分是每个像素点的颜色值的保存,它是用三个字节来表示一个像素的颜色
情况,而且每个字节分别保存的是(B、G、R)三基色。
下面是我用代码来实现的bmp图片格式的保存
1、bmp文件的保存
//创建文件保存对象 try{ javax.swing.JFileChooser jfc=new javax.swing.JFileChooser(); int num=jfc.showSaveDialog(null); if(num==0){ //获得文件的;路径 String strg=jfc.getSelectedFile().getAbsolutePath()+".bmp"; //创建文件输出流对象 java.io.FileOutputStream ops=new java.io.FileOutputStream(strg); //先写头信息,定义长度为14的字节数组 byte byh[]=new byte[14]; //依次给数组赋值 byh[0]='B'; byh[1]='M'; //文件的大小,转化为字节 int size=40; byh[2]=(byte)size; size=size>>8; byh[3]=(byte)size; size=size>>8; byh[4]=(byte)size; size=size>>8; byh[5]=(byte)size; //两个保留字,必须为零 byh[6]=(byte)0; byh[7]=(byte)0; byh[8]=(byte)0; byh[9]=(byte)0; //同样的将位图偏移量按照同样的方式存入数组 int count=54; byh[10]=(byte)count; count=count>>8; byh[11]=(byte)count; count=count>>8; byh[12]=(byte)count; count=count>>8; byh[13]=(byte)count; //写入头信息 ops.write(byh); //位图信息头信息,用于说明位图尺寸等信息 byte byb[]=new byte[40]; //用4个字节存储位图头信息的大小 byb[0]=40; byb[1]=0; byb[2]=0; byb[3]=0; //存储的位图宽度信息 int width=moslistener.data[0].length; byb[4]=(byte)width; width=width>>8; byb[5]=(byte)width; width=width>>8; byb[6]=(byte)width; width=width>>8; byb[7]=(byte)width; //存储的位图高度信息 int height=moslistener.data.length; byb[8]=(byte)height; height=height>>8; byb[9]=(byte)height; height=height>>8; byb[10]=(byte)height; height=height>>8; byb[11]=(byte)height; //目标设备级别的存储,必须为1 byb[12]=1; byb[13]=0; //每个像素所需要的位数的存储 byb[14]=24; byb[15]=0; //说明数据压缩的类型,4个字节,0表示不压缩 byb[16]=0; byb[17]=0; byb[18]=0; byb[19]=0; //存放图片大小的信息 int image=moslistener.data.length*moslistener.data[0].length*3; byb[20]=(byte)image; image=height>>8; byb[21]=(byte)image; image=image>>8; byb[22]=(byte)image; image=image>>8; byb[23]=(byte)image; //剩下的不重要,可以全部赋0 for(int y=24;y<byb.length;y++){ byb[y]=0; } //写入信息 ops.write(byb); //定义一个字节数组,要来写入B、G、R byte []color=new byte[3]; int RGB=0; //开始写入位图信息,图像的全部 for(int i=moslistener.data.length-1;i>=0;i--){ for(int j=0;j<moslistener.data[i].length;j++){ //取得每个点的颜色 RGB=moslistener.data[i][j]; //将像素值转换成字节,存取到color数组中 color[0]=(byte)RGB; RGB=RGB>>8; color[1]=(byte)RGB; RGB=RGB>>8; color[2]=(byte)RGB; //写入文件中 ops.write(color); } //如果宽度不是4的倍数,则补零 for(int h=0;h<(moslistener.data[i].length*3)%4;h++){ ops.write((byte)0); } } //强制写出,关闭输出流 ops.flush(); ops.close(); } }catch(Exception ef){ ef.printStackTrace(); }
2、bmp文件的打开
//打开bmp的处理过程 try{ //创建一个文件打开器 javax.swing.JFileChooser jfc=new javax.swing.JFileChooser(); int num=jfc.showOpenDialog(null); if(num==0){ //获得文件的路径 String str1=jfc.getSelectedFile().getAbsolutePath(); //创建文件输入流对象 java.io.FileInputStream ips=new java.io.FileInputStream(str1); //跳过10个字节 ips.skip(10); //读取位图文件的起始位置 byte[] by1=new byte[4]; ips.read(by1); //转化为一个整数 int sta=changeInt(by1); //跳过一些字节 ips.read(by1); //读取位图的宽度,以字节为单位 ips.read(by1); int width=changeInt(by1); //读取位图的高度,以字节为单位 ips.read(by1); int height=changeInt(by1); //设置画布的大小 dr.mb3.setPreferredSize(new Dimension(width,height)); //刷新一下 dr.mb3.updateUI(); //跳过一些字节 ips.skip((sta-26)); //定义一个三个int的数组,又来保存B、G、R int []by2=new int[3]; //定义一个二维数组,用来保存颜色值 int [][]date=new int[height][width]; for(int i=date.length-1;i>=0;i--){ for(int j=0;j<date[i].length;j++){ //读取颜色,用数组保存 for(int k=0;k<3;k++){ by2[k]=ips.read(); } //转化为颜色对象 Color color=new Color(by2[2],by2[1],by2[0]); date[i][j]=color.getRGB(); } //如果宽度不是4的倍数,则取出零 for(int h=0;h<(date[i].length*3)%4;h++){ ips.read(); } } moslistener.data=date; //关闭输入流 ips.close(); //刷新面板 dr.mb3.updateUI(); } }catch(Exception ef){ ef.printStackTrace(); }
相关推荐
"将bmp格式转换为raw"这个C源代码应该包含了上述的逻辑。在实际应用中,可能还需要处理不同操作系统下的文件路径和错误处理。 "www.pudn.com.txt"文件可能是提供源代码下载链接或其他相关说明的文本文件。在学习和...
"BMP格式转换器"是一个专门针对这种图像格式设计的工具,其主要功能是将其他类型的图像文件转换为BMP格式。 1. BMP格式详解: BMP文件结构主要包括文件头、信息头和像素数据三部分。文件头用于标识文件类型和大小...
这个“bmp格式转换工具”的Release版本专为用户提供方便快捷的图像文件转换服务,尤其是针对BMP格式的处理。该工具设计为在Windows平台上运行,充分考虑了对64位系统的兼容性,确保在各种现代计算机系统上都能稳定、...
在窗体中显示出图片后可点击其它的按钮进行格式转化,其可以转化的格式包括jpg,png以及灰度图像(bmp,jpg,png) 3.点击右上方的‘X’号退出。 4.其它说明 1.压缩包里的实验图片是我进行测试时所用的原图像(qi'e....
转换BMP到JPG的过程主要涉及图像编码的改变,从无损BMP格式转换为有损JPG格式。这个转换可以使用各种图像处理软件或编程库来完成,例如Adobe Photoshop、GIMP,或者是利用编程语言如Python的PIL(Python Imaging ...
本教程将专注于一个特定的转换过程:将10位的CCD纯数据格式RAW文件转化为8位的BMP格式文件。首先,我们需要理解这两种格式的基础知识。 **RAW格式**: RAW图像格式是一种未经处理的数据格式,它直接记录了相机...
在VB(Visual Basic)编程环境中,我们可以利用GDI+(Graphics Device Interface Plus)库来实现BMP图片向ICO图标的转换。ICO图标是Windows操作系统中用于程序和文件的图标文件格式,它可以包含多个尺寸和颜色深度的...
一个用.VB 写的. 将BMP格式的图像文件 转换JPG格式.支持命令行,支持批处理.
本篇将深入探讨BMP格式的特性,以及如何进行BMP格式的分析与转换。 首先,BMP文件的结构分为文件头和位图信息头两部分。文件头(BITMAPFILEHEADER)包含了文件的基本信息,如文件类型标识、文件大小、保留字段和...
BMP(Bitmap)和DCM(Digital Imaging and Communications in Medicine)是两种不同的图像文件格式,具有各自特定的应用领域。BMP是一种常见的位图格式,通常用于存储计算机图形和图像,而DCM则是医疗影像领域广泛...
本文将深入探讨如何使用C语言实现从JPEG格式转换为BMP格式的过程,这在嵌入式系统和网络传输中尤其重要。 首先,我们要理解JPEG和BMP这两种图片格式。JPEG(Joint Photographic Experts Group)是一种广泛使用的...
进行BMP到PGM的转换,实质上是将彩色图像转化为灰度图像,并将数据结构从BMP格式转化为PGM格式。这个过程通常涉及到以下步骤: 1. **读取BMP文件**:首先,我们需要解析BMP文件头,获取图像的宽度、高度、位深度等...
转换为DAT文件的过程主要是将BMP文件的像素数据提取出来,并按照CCS或其他工具能理解的格式重新组织。CCS,全称Code Composer Studio,是TI(德州仪器)提供的一款集成开发环境,主要用于编写和调试基于TI的微处理器...
在计算机编程与图像处理领域,将BMP格式的位图转换为二维数组是一项非常实用的技术。这种技术不仅能够帮助开发者更好地理解和操作图像数据,还在诸如机器人视觉识别等应用中扮演着重要角色。 #### BMP格式简介 BMP...
BMP格式图片包含图像的元数据,如宽度(Width,W)、高度(Height,H)、颜色深度等,以及实际像素数据。RAW格式则更接近于相机传感器的数据,通常包含每个像素的红、绿、蓝分量,没有预处理或色彩空间转换。 要...
这款软件我也不知道该怎么去介绍,反正你自己用吧,挺好使的。
标题中的"raw格式转换为bmp格式"指的是通过编程实现这一转换过程。在这个项目中,使用了C++语言编写了一个名为`raw2bmp.cpp`的程序,该程序可以读取RAW格式的图像数据,并将其转化为BMP文件。C++是一种强大的系统级...
要实现“将DICOM格式转换为BMP格式图片”,你需要理解以下几个关键知识点: 1. DICOM文件解析:首先,你需要理解DICOM文件的结构,包括其头文件(Header)和像素数据(Pixel Data)。DICOM头文件包含了元数据,如...
因为jdk只识别jpg、png、gif这三种格式的在使用java的时候会需要将bmp格式的图片文件转换成jpg、png、gif等格式,使用此代码可将bmp格式转换成jpg格式,能否转换成其他格式的文件还没有测试