Bitmap图像到底是怎么保存在电脑上的呢?它的二进制组成有什么规则呢?颜色是怎么保存起来的呢?等等一系列的问题。在本章分享中,将会为你解决。

bmp图像文件是怎么构成的呢?下面我们来看一张图:

所以一般bmp图像有四部分组成。下面我们通过一个实例来解释。

1.选好自己将进行实验的照片,我准备了自己的8x8,16x16,32x32头像

原图 8x8  16x16

2.编写读取文件二进制流并在控制台输出的代码。

public static void readFileBinary(String path){File btp = new File(path);FileInputStream btpInput;if(btp!=null){try {btpInput = new FileInputStream(btp);BufferedInputStream bufferedInputStream = new BufferedInputStream(btpInput);int data;int count=0;try {while((data=bufferedInputStream.read())!=-1){if(count!=0&&count%16==0)System.out.println("");String str="";if(data<16){str+="0";}str+=Integer.toHexString(data);System.out.print(str+" ");count++;}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e) {System.out.println("No file input!");}}else{System.out.println("No file input!");return ;}}

3.设置8x8的文件路径,并执行程序。

根据输出结果,首先解析文件头信息。

42 4d:表明文件的类型,根据ASCII码可以知道,这两个字节表示BM,则表示了该文件为bitmap文件。

00 00 00f6 :表明了文件的大小,0xf6转化为十进制表示246,则表示该文件总大小为246个字节。我们可以比较一下。

可以看出文件的大小确实是246个字节。

00 00 00 00:这4个字节表示保留字节,也就是暂时还没有使用到,可以用于拓展。

00 00 00 36:这4个字节表示该文件的数据区的偏移。表示从文件头偏移0x36=48+6=54个字节就到了该文件的数据区。

到目前为止,我们已经分析了14个字节的文件头信息。那距离数据区54个字节,我们才走过了14个字节,那剩下的40个字节表示什么意思呢?

下面来分析剩下的40个字节。

这40个字节,每4个字节组合在一起,表示一定的含义。

00 00 00 28:表示文件头的字节数。0x28转换为十进制表示40,这是文件头信息占用40个字节。

00 00 00 08:表示图像的宽度。很明显0x8等于十进制的8,表示该图像的宽度是8个像素。确实正确。

00 00 00 08:表示图像的高度。与宽度同理。

00 18 00 01:这四个字节,要分为前面两个字节和后面两个字节。前面两个字节00 18转换为十进制等于24,则表示该图像每个像素点占用的比特数,在这里每个像素点占24个bits,也就是3个字节。后面00 01规定一直是这样。

00 00 00 00:转换为十进制表示0,则表示不压缩。那这四个字节到底有哪些情况呢?

有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。

00 00 00 c0:这四个字节表示图像的大小。我们来验证一下。之前信息头总共有54个字节,这个文件是246个,那246-54=192。那0xc0等于多少呢?192。所以很神奇。

00 00 0e c4:这个表示水平的分辨率。

00 00 0e c4:这个表示垂直的分辨率。

00 00 00 00:这个表示的是使用的颜色索引。在这个图像中没有使用到颜色索引,所以为0

00 00 00 00:表示重要索引数,因为连索引都没有,更没有重要索引了,于是和上面一个部分的结果时一样的,也是0。

到目前为止已经分析了文件的信息头的信息。

那数据区是存放什么信息呢?

我们知道颜色的组合分为RGB。那这些数据区存放的信息就是每个像素点RGB的值。但是由于系统采用的是小端法进行存储的。所以我们按顺序读出来的就是BGR了。

下面我们来看一下数据区中的BGR。

这选的图像是8x8的,也就是一共有64个像素点,每个像素点是3个字节,那一共是192个字节,和前面解析出来的,图像大小是192个字节,刚好吻合,好神奇吧。

那下面通过UltraEdit对该图像文件的前32个像素点的BGR全部转为ff ff ff,看看会出现什么情况。

图像变成了这样:

可以看到图像的下面那一半已经变成了白色。感觉不太好看,下面把它编程黑色吧。

可以看到图像的下面那一半已经变成了黑色。

16x16和图像和32x32的图像是一样的。同理操作就可以了。

Bitmap图像分析相关推荐

  1. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )

    文章目录 一.解码图片参数 inJustDecodeBounds 二.计算图片的缩小比例 三.设置图片缩小配置 inSampleSize 四.设置图片像素格式 inPreferredConfig 五. ...

  2. Android Jetpack中CameraX保存Bitmap

    先看看官方文档 图片拍摄 图片拍摄用例旨在拍摄高分辨率的优质照片,不仅提供简单的相机手动控制功能,还提供自动白平衡.自动曝光和自动对焦 (3A) 功能.调用方负责决定如何使用拍摄的照片,具体包括以下选 ...

  3. Android 自定义View Canvas —— Bitmap

    Bitmap 绘制图片 常用的方法有一下几种 (1) drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint ...

  4. BitMap 内存使用优化

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  5. 第52章,bitmap图像处理(从零开始学android),第52章、Bitmap图像处理(从零开始学Android)...

    1.Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitma ...

  6. GDI+ Bitmap与WPF BitmapImage的相互转换

    原文:GDI+ Bitmap与WPF BitmapImage的相互转换 using System.Windows.Interop; //... // Convert BitmapImage to Bi ...

  7. Android 中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)...

    1.java.lang.Math类常用的常量和方法: Math.PI 记录的圆周率 Math.E 记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 ...

  8. C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。...

    原文:C#图片灰度处理(位深度24→位深度8) #region 灰度处理/// <summary>/// 将源图像灰度化,并转化为8位灰度图像./// </summary>// ...

  9. R.drawable 转 bitmap

    引用:http://zhidao.baidu.com/question/291703800.html Bitmap bmp=BitmapFactory.decodeResource(r, R.draw ...

最新文章

  1. php回顶层顶层,PHP语言之php顶层类(自家用)
  2. matplotlib----初探------4折线图
  3. WebService 基础
  4. And Then There Was One POJ - 3517(变形约瑟夫环+规律)
  5. leetcode —— 133. 克隆图
  6. 贴一段Jenkins的自动发布脚本
  7. java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android
  8. linux utf8转gbk_「正点原子Linux连载」第四章开发环境搭建(2)
  9. oracle sql抓取1
  10. Javascript--闭包
  11. 记一次nsp解包(nscb解包nsp/xci,cpk解包,转hca、adx到MP3,转nsm、m2v到MP4方法集锦)
  12. 运维学习部分基础知识概括
  13. 联想主板9针开关接线图_空气开关、断路器、漏电保护,汇总学习一下
  14. 搜款网根据ID取商品详情 API
  15. [转载]提升你幽默感的100句经典短语
  16. 大法将致:将Windows Server 2016打造成个人办公系统,WIN2016打造成超级WIN10,WIN2016优化设置
  17. 【用PROTEUS仿真点亮LED项目】
  18. 大数据智能下数据脱敏的思考
  19. 重采样 上采样 下采样
  20. 使用js实现植物大战僵尸的一些基本功能

热门文章

  1. 生日快乐的网页(用HTML和JavaScript)
  2. 11个免费的数据可视化工具推荐
  3. 测试人员如何把控项目进度
  4. MEM/MBA 复试准备(05-01) 英语听力英语面试常见问题01-05
  5. 图像对齐深度学习算法调研
  6. 高德地图之Python爬取上海市所有道路轮廓坐标
  7. 同济大学高等数学上册第七章微分方程以及每日一题
  8. adc量化单位_复习要点8:采样与量化、ADC0809、DAC0832
  9. 医学影像三维可视化软件
  10. 某宝x-sign签名分析-店铺全量商品接口