`
茖-荌
  • 浏览: 31299 次
社区版块
存档分类
最新评论

bmp格式转化

阅读更多

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

    "将bmp格式转换为raw"这个C源代码应该包含了上述的逻辑。在实际应用中,可能还需要处理不同操作系统下的文件路径和错误处理。 "www.pudn.com.txt"文件可能是提供源代码下载链接或其他相关说明的文本文件。在学习和...

    BMP格式转换器

    "BMP格式转换器"是一个专门针对这种图像格式设计的工具,其主要功能是将其他类型的图像文件转换为BMP格式。 1. BMP格式详解: BMP文件结构主要包括文件头、信息头和像素数据三部分。文件头用于标识文件类型和大小...

    bmp格式转换工具Release版本,包含安装包

    这个“bmp格式转换工具”的Release版本专为用户提供方便快捷的图像文件转换服务,尤其是针对BMP格式的处理。该工具设计为在Windows平台上运行,充分考虑了对64位系统的兼容性,确保在各种现代计算机系统上都能稳定、...

    bmp格式转换

    在窗体中显示出图片后可点击其它的按钮进行格式转化,其可以转化的格式包括jpg,png以及灰度图像(bmp,jpg,png) 3.点击右上方的‘X’号退出。 4.其它说明 1.压缩包里的实验图片是我进行测试时所用的原图像(qi'e....

    BMP格式转换为JPG格式!!

    转换BMP到JPG的过程主要涉及图像编码的改变,从无损BMP格式转换为有损JPG格式。这个转换可以使用各种图像处理软件或编程库来完成,例如Adobe Photoshop、GIMP,或者是利用编程语言如Python的PIL(Python Imaging ...

    VB实现将BMP格式图片转化为ICO图标

    在VB(Visual Basic)编程环境中,我们可以利用GDI+(Graphics Device Interface Plus)库来实现BMP图片向ICO图标的转换。ICO图标是Windows操作系统中用于程序和文件的图标文件格式,它可以包含多个尺寸和颜色深度的...

    VB 现实BMP格式 转换为JPG格式

    一个用.VB 写的. 将BMP格式的图像文件 转换JPG格式.支持命令行,支持批处理.

    raw格式图片转换为bmp格式

    本教程将专注于一个特定的转换过程:将10位的CCD纯数据格式RAW文件转化为8位的BMP格式文件。首先,我们需要理解这两种格式的基础知识。 **RAW格式**: RAW图像格式是一种未经处理的数据格式,它直接记录了相机...

    bmp格式分析及格式转换

    本篇将深入探讨BMP格式的特性,以及如何进行BMP格式的分析与转换。 首先,BMP文件的结构分为文件头和位图信息头两部分。文件头(BITMAPFILEHEADER)包含了文件的基本信息,如文件类型标识、文件大小、保留字段和...

    jpeg转bmp格式

    本文将深入探讨如何使用C语言实现从JPEG格式转换为BMP格式的过程,这在嵌入式系统和网络传输中尤其重要。 首先,我们要理解JPEG和BMP这两种图片格式。JPEG(Joint Photographic Experts Group)是一种广泛使用的...

    BMP文件转化为PGM文件格式

    进行BMP到PGM的转换,实质上是将彩色图像转化为灰度图像,并将数据结构从BMP格式转化为PGM格式。这个过程通常涉及到以下步骤: 1. **读取BMP文件**:首先,我们需要解析BMP文件头,获取图像的宽度、高度、位深度等...

    bmp文件转化为dat文件

    转换为DAT文件的过程主要是将BMP文件的像素数据提取出来,并按照CCS或其他工具能理解的格式重新组织。CCS,全称Code Composer Studio,是TI(德州仪器)提供的一款集成开发环境,主要用于编写和调试基于TI的微处理器...

    把真彩色BMP位图转化为二维数组

    在计算机编程与图像处理领域,将BMP格式的位图转换为二维数组是一项非常实用的技术。这种技术不仅能够帮助开发者更好地理解和操作图像数据,还在诸如机器人视觉识别等应用中扮演着重要角色。 #### BMP格式简介 BMP...

    虹软BMP格式转换器V1

    这款软件我也不知道该怎么去介绍,反正你自己用吧,挺好使的。

    将dicom格式转换为bmp格式图片

    要实现“将DICOM格式转换为BMP格式图片”,你需要理解以下几个关键知识点: 1. DICOM文件解析:首先,你需要理解DICOM文件的结构,包括其头文件(Header)和像素数据(Pixel Data)。DICOM头文件包含了元数据,如...

    java将bmp格式文件转换成jpg

    因为jdk只识别jpg、png、gif这三种格式的在使用java的时候会需要将bmp格式的图片文件转换成jpg、png、gif等格式,使用此代码可将bmp格式转换成jpg格式,能否转换成其他格式的文件还没有测试

    bmp格式转换dcm(C语言)

    BMP(Bitmap)和DCM(Digital Imaging and Communications in Medicine)是两种不同的图像文件格式,具有各自特定的应用领域。BMP是一种常见的位图格式,通常用于存储计算机图形和图像,而DCM则是医疗影像领域广泛...

    raw格式转换为bmp格式(包括代码,lena.raw和lena.bmp)

    标题中的"raw格式转换为bmp格式"指的是通过编程实现这一转换过程。在这个项目中,使用了C++语言编写了一个名为`raw2bmp.cpp`的程序,该程序可以读取RAW格式的图像数据,并将其转化为BMP文件。C++是一种强大的系统级...

    bmp格式转rle

    "android logo 图片格式转换,bmp格式转rle格式"这个任务就是将Android系统的标识或类似图片从BMP格式转换为RLE编码的格式,以减小文件大小,提高加载速度和节省存储空间。 BMP格式详解: BMP文件头包含有关图像的...

Global site tag (gtag.js) - Google Analytics