Java二进制文件读写与bmp位图格式学习

xiaoxiao2021-02-28  18

最近在做实训,说是要用java读取位图进行图像处理,遂进行学习。 bmp位图参考资料: 文档1 文档2

位图制作

首先使用AdobePhotoshop来制作一个3*2的位图test.bmp

java提取

使用java程序用二进制读写的方式将其提取出来。

import java.io.FileInputStream; public class BmpTest { private static final int BYTE_HEAD=14;//bmp文件头0-13位 private static final int BTYE_INFO=40;//bmp信息部分14-53位 public static void main(String[] args) { String content=null; int count=0; try { int size=0; //定义一个字节缓冲区,该缓冲区的大小根据需要来定义 byte[] buffer=new byte[1024]; FileInputStream file = new FileInputStream("test.bmp"); //循环来读取该文件中的数据 while((size=file.read(buffer))!=-1){ count++; System.out.println("count="+count); for(int i=0;i<size;i++) { System.out.println(i+" "+buffer[i]); } } //关闭此文件输入流并释放与此流有关的所有系统资源。 file.close(); } catch (Exception e) { e.printStackTrace(); } } }

文件分析

对输出的结果进行分析:

test.bmp80位试读 可以看到是低字节低位,高字节高位。 字节与字节之间是位运算的关系,可以看做是255进制 test.bmp是一个32列的bmp,信息如下(r,g,b) 0 1 0 (162,100,100) (16,124,13) 1 (217,47,1) (0,0,0) 2 (255,255,255) (255,0,240) 0 66 #B 1 77 #M 2 80 #位图文件大小 2-5 3 0 4 0 5 0 6 0 #6-9保留信息 7 0 8 0 9 0 10 54 #10-13 保存位图数据位置的地址偏移 11 0 12 0 13 0 14 40 #14-17是定义用来描述影像的区块的大小,40-Windows3.2 15 0 16 0 17 0 18 2 #18-21 位图的宽度(用像素个数表示) 19 0 20 0 21 0 22 3 #22-25 位图的高度(同样用像素个数表示) 23 0 24 0 25 0 26 1 #26-27 保存所用彩色位面的个数? 不常用 27 0 28 24 #28-29 保存每个像素的位数,常用为1,4,8(灰阶)和24(彩色) 29 0 30 0 #30-33定义压缩算法,具体见其他资料,允许值为0-5 31 0 32 0 33 0 34 26 #34-37保存图像的大小(原始位图数据的大小,不是文件大小) 35 0 36 0 37 0 38 18 #38-41 保存图像水平方向分辨率 39 11 40 0 41 0 42 18 #42-45 保存图像竖直方向分辨率 43 11 44 0 45 0 46 0 #46-49 保存所用颜色的数目 47 0 48 0 49 0 50 0 #50-53 保存所用重要颜色的数目。当每个颜色都重要时这个值与颜色数目相等 51 0 52 0 53 0 #位图数据开始,像素从下到上,从左到右保存 54 -1 #实际值255 55 -1 #实际值255 56 -1 #实际值255 #上面为(2,0)的颜色(255,255,255) 57 -16 #-16 11110000 实际值是240 58 0 59 -1 #实际值是255 #上面为(2,1)的颜色(255,0,240) 60 0 61 0 #60-61 2位补零 62 1 63 47 64 -39 #62-64 (217,47,1) 65 0 66 0 67 0 #65-67 (0,0,0) 68 0 69 0 #68-69 2位补零 70 100 71 100 72 -94 #70-72 (162,100,100) 73 13 74 124 75 16 #73-75(16,124,13) 76 0 77 0 78 0 #后面 79 0

结果分析

以上结果验证了几个事实:

bmp位图确实是按照从下到上,从左到右的顺序进行存储的,并且会对不满8字节的进行补零操作。bmp位图的存储确实是按 blue,green,red的顺序进行存取的,也就是和我们常见的颜色通道的顺序是相反的。bmp位图前的信息存取,低位地址存的是低位数据,高位地址存的是高位数据。
转载请注明原文地址: https://www.6miu.com/read-2500095.html

最新回复(0)