众所周知,我们所有的数据在电脑上都是以“010101”的二进制形式存储的。BMP文件格式是windows中广泛使用的图片文件格式。
如果想要读取BMP格式的图片,首先就要了解bmp文件的数据存储方式。bmp文件按数据排列先后顺序由bmp文件头、位图信息头、调色板、位图数据四部分组成。其中:
bmp文件头:提供文件格式、大小等数据,占用14字节
位图信息头:提供图像尺寸、压缩方式等数据,占用40字节。如图:
调色板:索引与其对应颜色的映射表
位图数据:图像的数据,由图像尺寸决定。
下面我们通过一个具体的24位真彩bmp文件的数据来了解一下它的数据存储方式。
这是我用UltraEdit软件打开的bmp文件。上图是其数据开始部分的截图,数据是16进制(每两个数字代表一个字节)我用黑线将所有的数据分成了三部分,第一部分即前十四位是bmp文件头,其中:
(1-2字节)42 4D是说明文件的类型;
(3-6字节)A6 11 00 00是该位图文件的大小;
(7-10字节)00 00 00 00保留部分,必须设为0;
(11-14字节)36 00 00 00文件开始到位图数据的偏移量;
,第二部分是位图信息头,其中:
(1-4字节)28 00 00 00 位图信息头的长度;
(5-8字节)粉色部分:2F 00 00 00 图像的宽度;
(9-12字节)画蓝色部分:1F 00 00 00 图像的高度;
(13-14)01 00:颜色平面数,其值总被设为1;
(15-16)18 00:说明像素
(17-20)00 00 00 00:图像压缩的类型,因为bmp是无压缩的文件所以本数据为0;
(21-24)70 11 00 00:图像大小;
(25-28)00 00 00 00 ;像素水平分辨率;
(29-32)00 00 00 00 ;像素垂直分辨率;
(33-36)00 00 00 00 :位图使用的颜色数,为0表示使用所有颜色板;
(37-40)00 00 00 00:指定重要的颜色数,为0表示都重要
因为是24位真彩图所以并不存在调色板;
第三部分是位图数据,每个像素占一个字节,取得相应的字节,以此字节索引颜色,在显示器中显示出来就好了!
了解了bmp的数据存储方式之后,我们可以发现其实bmp文件的读取非常简单,只要能够获得图像的尺寸,然后进行遍历就可以得到颜色数据,再通过打点的形式就可以读取一张bmp图片啦!此外,应注意的是
1.bmp文件有一个对齐规则,即每行的数据都是4的倍数如果不够就用bit(0)填充。
2.bmp文件是从左下角向右上角读取的。
public class IOpic { private JFrame jf; private Graphics g; private int wight,height;//画板的宽与高 Border b2; File filename;//文件名 public IOpic(Graphics g) { this.g=g; } /** * 将byte数组转换成int数组 * b: 要转换的字节数组,start 字符截止的位置: */ public int changeint(byte[] b,int start){ int ch1= b[start]&0xff; int ch2= b[start+1]&0xff; int ch3= b[start+2]&0xff; int ch4= b[start+3]&0xff; int ch=ch1|ch2|ch3|ch4; return (ch); } /** * 读取BMP图片的方法 * 输入流 * @throws Exception */ public void readpic(File filename) throws Exception{ System.out.println(filename); FileInputStream fis =new FileInputStream(filename); DataInputStream dis=new DataInputStream(fis); //创建字节数组,并将字节存储在此数组中 byte[] array1=new byte[14]; byte[] array=new byte[40]; dis.read(array1, 0, 14); dis.read(array, 0, 40); wight=changeint(array, 4); height=changeint(array, 8); System.out.println("图形的宽度是:"+wight+",图形的高度是:"+height); //画出图片 //装颜色数据的数组 if (wight*3/4!=0) { int wid = 4 - (wight * 3) % 4; int[][] R=new int[height][wight]; int[][] B=new int[height][wight]; int[][] G=new int[height][wight]; for (int i = height-1; i >=0; i--) { for (int j = 0; j < wight; j++) { int blue=dis.read(); int green=dis.read(); int red=dis.read(); R[i][j]=red; B[i][j]=blue; G[i][j]=green; } dis.skipBytes(wid); } //循环加入数据,用点打出来 for(int i=0;i<height;i++){ for (int j = 0; j < wight; j++) { System.out.println(R[i][j]+" "+B[i][j]+" "+G[i][j]); g.setColor(new Color(R[i][j],G[i][j],B[i][j])); g.drawLine(i+100,j+100,i+100,j+100); } } }
总结:
1、通过对bmp图片文件的读取,我对io更加的了解,也更加明白了作为流的特性,io利用java实现对文件的输入与输出。如果要读取一段数据流中间的数据必须要读出该数据前面的数据。
2、所谓文件的协议就是文件之间之间的对接及了解,已达到互相转换的目的。
相关推荐
标题 "24位真彩BMP格式" 涉及的是图像处理领域中的一个重要概念,BMP(Bitmap)是微软公司开发的一种位图文件格式,广泛应用于Windows和OS/2操作系统中。24位真彩BMP格式是BMP文件格式的一种变体,它能够表示超过...
**三分钟解析24位真彩BMP格式文件** BMP(Bitmap)是Windows操作系统中最常见的位图图像格式,它不包含任何压缩,因此文件体积较大,但图像质量较高。在24位真彩BMP格式中,每个像素由3个字节表示,分别代表红、绿...
通过理解和应用这些知识点,开发者可以创建自己的BMP文件读写程序,不仅可以用于基本的图像操作,还可以作为其他图像处理任务的基础。在实际编程过程中,可能还需要处理色彩空间转换、图像缩放等更复杂的任务,但这...
1. 文件I/O:首先,你需要了解如何使用C语言的标准库函数(如fopen, fread, fwrite等)来打开、读取和写入文件。BMP文件是二进制文件,所以需要以二进制模式("rb"或"wb")进行操作。 2. BMP文件结构:理解BMP文件...
jpeglib读取jpeg,转为bmp图,24真彩和灰度图
- 处理BMP文件的头信息,特别是位深度和宽度信息,以便正确地读写像素数据。 - 使用适当的数据结构来存储图像数据,如二维数组或动态分配的内存。 - 当处理8位BMP时,需要考虑颜色查找表,如果源图像是24位,处理后...
读取BMP文件时,需要解析文件头信息,获取图像尺寸和颜色信息,然后逐行读取像素数据。对于彩色图像,通常使用RGB565格式,其中每个像素由两个字节表示,分别对应红、绿、蓝三个通道的5位和6位二进制数值。 TFT显示...
### 24位真彩色图像转灰度图像(256级灰度)的MATLAB实现 #### 一、背景介绍 在图像处理领域中,将彩色图像转换为灰度图像是一个非常基础且重要的步骤。灰度图像相比于彩色图像来说,数据量更小,处理起来更加简便...
BMP支持从1位到32位的颜色深度,包括256色、1670万色真彩以及Alpha通道透明度。文件扩展名通常是.bmp。由于其无损特性,BMP格式常用于需要高质量输出的场合,如打印或图形设计。 **3. JPEG转BMP的过程** 将JPEG图像...
4. **读取256位 BMP 文件**:在 `CBmpDocument` 类中,开发者会实现一个函数来读取256位 BMP 文件。这涉及到解析 BMP 文件头,提取图像宽度、高度、色彩位数等信息,并将像素数据加载到内存中。 5. **渲染图像**:...
在主函数`main`中,首先打开输入文件并检查是否为BMP格式,以及是否为24位真彩图像。然后,创建一个新的输出文件用于写入处理后的图像数据。在读取图像数据时,程序逐行处理,对于每行中的每个像素,调用`isred`函数...
通常,这样的程序会读取RGB真彩图像,对每个像素进行处理,然后将结果保存为8位的BMP格式文件。BMP是一种常见的位图格式,支持多种色彩深度,包括8位,且结构相对简单,便于处理。 “www.pudn.com.txt”可能是提供...
1. **读取源图像**:首先,我们需要读取24位或16位的位图文件,这通常涉及到解析位图文件头信息,包括宽度、高度、位深度等,并从文件中提取像素数据。 2. **色彩量化**:如果目标是256彩色位图,我们需要进行色彩...
<br/>ToolBar工具栏控件的使用<br/>动态建立主菜单选项<br/>窗口界面的动态...BMP转换为JPG<br/>16位真彩转换到256色<br/>调整图片的RGB对比度<br/>实现图像的灰度级处理效果<br/>3种像素历遍方法的比较和实现<br/>实现...
在24位真彩图像中,每种颜色通道通常由8位二进制数表示,总共24位,能够产生16,777,216种不同的颜色,即256红×256绿×256蓝。这种颜色深度使得图像具有丰富的色彩表现力。 在数字信号处理(DSP)领域,读取RGB图像...
1. **读取图像**:首先,代码会使用某种图像处理库(可能是像PIL(Python Imaging Library)这样的库)来打开并读取真彩位图文件,获取原始的像素数据。 2. **颜色空间转换**:为了将24位颜色转换为256色,代码可能...
易语言eImgConverter.fne支持库中文名为易语言图像格式转换支持库,本易语言支持库用来转换图像格式,目前支持读取的源的格式有:标准JPEG(全部格式)、BMP(目前仅支持24位BMP)、TIFF(单页图像所有格式)、PNG...
RAR 是一个让你在命令行模式中管理压缩文件的控制台应用。RAR 提供压缩、加 密、数据恢复和许多其它此手册中描述的其它功能。 RAR 只支持 RAR 格式压缩文件,它默认有 .rar 扩展名。不支持ZIP 和其他格 式。即使...
- **文件读写**:位图文件通常遵循特定的文件格式(如BMP),源码可能包含解析和写入这些文件的函数。 - **色彩转换函数**:这是源码的核心部分,实现从真彩色到256色或黑白的转换逻辑。 - **内存管理**:处理大...
RLE压缩)、PCD(取第三幅),目前支持写入的目标格式有:标准JPEG(全部格式)、BMP(24位)、TIFF(灰度和真彩)、PNG(24位)、PPM(文本和二进制模式)、PGM(文本和二进制模式)、PBM(文本和二进制模式)、PCX...