好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

纯手写bmp图片.doc

3页
  • 卖家[上传人]:平***
  • 文档编号:8584443
  • 上传时间:2017-09-28
  • 文档格式:DOC
  • 文档大小:53.29KB
  • / 3 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 纯手写 bmp 图片 bmp 图片就是位图,是在几乎任何的操作平台上都支持的图片格式,今天我们就用 bmp 图片来做一个有趣的试验,不用任何的画图工具, 我们只用 16 进制编辑器,在里面输入 16 进制数,然后保存后缀为.bmp的文件,由此而构成一副 bmp 图片虽然最后生成的 bmp 图片在现实生活中没有任何的用处, 但是在纯手工构建这个图片的过程中,你能深刻的体会到 bmp 图片是怎么构成的,这样对于我们做有关 bmp 图片的编程时也是大有裨益的,同时我们还能从中体会到计算机表示数据的思想OK, let's begin:为了减少我们输入和计算的麻烦,我将会构建一个比较简单的图片,16*16 的图片,即宽 16 个像素,高16 个像素的 bmp 图片,同时为了不涉及到调色板这种比较麻烦的问题,我们将构建 24 位色的图片,即用 R,G,B 三原色表示一个像素点的图片首先我们需要了解一下 bmp 图片的文件头的组成:bmp 图片的文件头由下面 2 个结构构成:typedef struct tagBITMAPFILEHEADER {WORD bfType; // 文件类型DWORD bfSize; // 文件大小WORD bfReserved1; // 保留值,为 0WORD bfReserved2; // 保留值,为 0DWORD bfOffBits; // 文件中数据的偏移} BITMAPFILEHEADER;typedef struct tagBITMAPINFO {BITMAPINFOHEADER bmiHeader; // bmp 文件信息头RGBQUAD bmiColors[1]; // 调色板数组} BITMAPINFO;在 BITMAPINFO 结构中,根据 bmp 图片位数的不同(1bit, 2bit, 8bit, 16bit, 24bit, 32bit)RGQUARD 这个数组的大小也不一样,而对于 24 位色以上的图片,这个结构大小为 0,即没有调色板,它的后面的数值就代表了像素的颜色。

      所以,对于 24 位色的 bmp 图片,实际构成将会是下面这个样子:BITMAPFILEHEADERBITMAPINFOHEADERDATA (R, G, B)所以,对于我们的任务就是填充文件头 BITMAPFILEHEADER 和信息头 BITMAPINFOHEADER 以及数据区域接着,我们要做的事情就是,根据文件头每个字段的意义以及大小分别填充它们为了让大家看的更加清楚,我将会以表格的形式来填充每个字段大小 字段 值和意义WORD bfType 文件类型,标识,必须为”BM”,即 0x4d42DWORD bfSize 整个 bmp 文件的大小,包括 2 个头以及数据区域,计算方法如下:sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+16*16*3因为我们要设计一个 16×16 的 24 色位图,所以整个数据区域的大小为:宽度×高度×每个像素的大小,因为每个像素是用 RGB 三原色表示的,所以,每个像素所占大小为 3 个字节,即这个字段的大小为:sizeof(BITMAPFILEHEADER) = 14 +sizeof(BITMAPINFOHEADER) = 40 +16*16*3 = 768即 14+40+768=822 个字节,即 0x0336 字节WORD bfReserved1 保留值,必须为 0WORD bfReserved2 保留值,必须为 0DWORD bfOffBits 数据到文件开始位置的偏移,即sizeof(BITMAPFILEHEADER) = 14 +sizeof(BITMAPINFOHEADER) = 40即 14+40=54,即DWORD biSize 本结构的大小,即 sizeof(BITMAPINFOHEADER) = 40,即 0x28LONG biWidth 位图的宽度,我们设为 16,即 0x10LONG biHeight 位图的高度,我们设为 16,即 0x10WORD biPlanes 固定值 1,即 0x01WORD biBitCount 多少位色的图片,这里为 24,0x18DWORD biCompression 压缩方式,这里为 BI_RGB= 0x00DWORD biSizeImage 这里无需关心,设置为 0,详细意义查 MSDNLONG biXPelsPerMeter 这里无需关心,设置为 0,详细意义查 MSDNLONG biYPelsPerMeter 这里无需关心,设置为 0,详细意义查 MSDNDWORD biClrUsed 这里无需关心,设置为 0,详细意义查 MSDNDWORD biClrImportant 这里无需关心,设置为 0,详细意义查 MSDN了解了每个字段的含义以及计算好了它们的值之后,下面的任务就是要在 16 进制编辑器里面把它写出来,这里,我将使用比较流行的 WinHex。

      打开 WinHex,新建立一个文件,大小为 822 个字节,然后将文件保存为 test.bmp,接着我们开始填充这个文件的每个字节因为平时我们表示一个 16 进制数字的时候,高字节在前,低字节在后,而文件中正好相反,即低字节在前,而高字节在后,所以,当一个数字是 0x4d42 的时候,我们在编辑器里面填入42 4D ,所有的数字都以此类推,不再说明我们先来填充 BITMAPFILEHEADER 结构的每个字段的值,如下:0 1 2 3 4 5 6 7 8 9 A B C D E F00000000 42 4D 36 03 00 00 00 00 00 00 36接着,我们来填充 BITMAPINFOHEADER 结构的每个字段的值,要接着上面的开始填:0 1 2 3 4 5 6 7 8 9 A B C D E F00000000 42 4D 36 03 00 00 00 00 00 00 36 00 00 00 28 0000000010 00 00 10 00 00 00 10 00 00 00 01 00 18 00 00 0000000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000030 00 00 00 00 00 00 FF 00 00 FF 00 00 FF 00 00 FF00000040.......00000330 00 FF FF 00 FF FF 上面的红色部分表示 BITMAPFILEHEADER 结构填充的内容,蓝色部分表示 BITMAPINFOHEADER 结构填充的内容,从 0x0036 开始,到 0x0335 结束,都是数据区域的内容,这里面可以随便填,填入内容的不同,显示的 bmp 图片也不一样,全部内容填充完毕,重新保存一下文件,然后用 windows 自带的图片浏览器就可以查看自己纯手写出来的 bmp 图片了。

      需要说明的是,我们在计算图片数据大小的时候,一定是宽度×高度×3, 我刚开始做的时候,因为忘了×3, 结果图片总是无法正确显示,后来检查了多遍,才发现这个问题对于文件头的数据,每个字节都必须填写正确,只要有一个字节出错,图片就可能无法正确显示。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.