bmp图像16位格式获取及解读(python版和matlab版)

背景

数字图像处理的作业,截取我完成的作业图片,以方便以后复习。

作业要求

  • 原图
  • 图片所对应文件的以下内容,以16进制数据显示。文件头,位图头,调色板(有的话),数据开始的头2行数据byte,中心的32*32数据。
  • 题目要求的分析

在这里插入图片描述

作业完成图

下面是我作业的截图, 包括说明及运行结果图。

  1. 作业1:使用16进制文本编辑器打开

在这里插入图片描述
2. 作业2:分析相应格式数据
在这里插入图片描述在这里插入图片描述
在这里插入图片描述2. 作业3:利用代码分析图像
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载链接

这里是对应文档的下载链接:
Word链接:bmp图像16位格式获取及解读(python版和matlab版)

作业文档

下面附上文档部分内容,有需要的可直接复制啦!

Work1.1——使用16进制文本编辑器打开

可见.bmp图像文件头对应16进制数如下图1、图2、图3所示(这里由于图片太大,我只取了3张数据截图)。
在这里插入图片描述

Work1.2——分析相应格式数据

Part1_文件头分析

文件头提供文件的格式、大小等信息,共14字节。
在这里插入图片描述
如图4 所示,所画为bmp图像文件头,包括14个字节,其中:
第1-2字节”424D”为文件类型(2byte),具体值为0x4D42 = “BM”,故所读取图像为.bmp图像。
第3-6字节”36 00 1E 00”为文件大小(4byte),具体值为 ,即文件长度为1966134。
第7-10字节”00 00 00 00”为文件保留项bfReserved1和bfReserved2(每个2byte),必须设置为0。
(4byte)第11-14字节”36 00 00 00”为文件从文件开头到具体图像数据的字节偏移量,具体值为。

Part2_信息头分析

位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息。
在这里插入图片描述

如图5 所示,所画 为bmp图像文件头,包括40个字节,其中:
第15-18字节”28 00 00 00”为位图信息头的大小,此图片具体值为0x00000028 = 40byte。
第19-22字节”00 04 00 00”为位图宽度(4byte),单位为像素,此图片具体值为0x00000400 = 1024(十进制)。
第23-26字节”00 04 00 00”为位图高度(4byte),单位为像素,此图片具体值为0x00000280= 640(十进制)。
第27-28字节”10 00”为位图的平面数(2byte),设置为1,即0x0001。
第29-30字节”18 00”为颜色深度(位数)(2byte),单位为bit/像素点,有1,4,8,16,24,32;此图片具体值为0x0018 = 24位。
第31-34字节”00 00 00 00”为位图压缩类型(4byte),是否压缩,0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放);此图片具体值为0x00000000=0,即为不压缩。
第35-38字节”00 00 1E 00”为图像的大小(4byte),单位字节,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素字节数;此图片具体值为0x001E0000 = 1966080。
第39-42字节”13 0B 00 00”为用像素/米表示的水平分辨率(4byte),此图片具体值为0x00000B13 = 2835。
第43-46字节”13 0B 00 00”为用像素/米表示的垂直分辨率(4byte),此图片具体值为0x00000B13 = 2835。
第47-50字节”00 00 00 00”为调色板中的颜色索引数(4byte),此图片具体值为0x00000000 = 0,0为图片有调色板。
第51-54字节”00 00 00 00”为重要影响的颜色索引数(4byte),此图片具体值为0x00000000 = 0,0表示都重要。

Part3_调色板分析

由于此图片为24位真彩图,无调色板,故无需调色板分析。
若为其他数值:
调色板中的数据每4字节一组,分别表示蓝、绿、红和保留值(十六进制)。
1.4位BMP图片的图像数据:
每个像素点用4bit表示,4位的图片2像素/字节,而图片的宽度为25像素,就需要12.5字节表示,而每行的字节数必须是4的整数倍,离12.5最近的数是16字节,所以每行就需要16字节存储,不足的用其他值补全。4位的24×24每行为12byte,33×33为16.5byte,补全为20byte。图像的数据大小根据biSizeImage的值末尾不够的位会用00补全。
每行的字节数为:DataSizePerLine1=biBitCount * biWidth/32 * 4,
实际每个扫描行所占字节数计算方法为:
DataSizePerLine2= (biWidth * biBitCount+31)/ 32 * 4;(计算要按照程序中计算的方式)
2.8位BMP图片的图像数据:
每个像素点用8bit表示。

Part4_图像数据

由于此图片为24位真彩图,而24位真彩色的BMP图片,没有调色板,在文件头和位图信息头后面直接是图像数据。
如图6所示,红色 开始位置,即为图片数据的开始。
图6

由于真彩图片数据每个像素点为3byte,有上述分析可知:图片宽度为1024像素,故图片每一行为1024×3=3027byte,3027÷4=768,故3027可被4整除,无需补0,如图7红色箭头所指,我选取了3027byte。
在这里插入图片描述

由上述图片分析可知,图片数据大小为1966080,图片高度为640,图片每一行所需为3027byte,由于3027×640=1966080,故所读数据无误。

Work1.3——利用代码分析图像

利用visual studio2019获取图像数据与上述分析一致,代码见代码附录1:
在这里插入图片描述

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
void CExample10View::OnSave555BiBitfields() { // TODO: Add your command handler code here if(lpBmpDataBuf==NULL) { MessageBox("当前没有打开的图"); return; } BYTE r,g,b; LPBYTE lpDest,lpSrc; int i,j; int nheapSize; CFileDialog filesavebox(FALSE,"bmp","BI_BITFIELDS.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"files(*.bmp)|*.bmp|",NULL); CFile file; CString strPathname; if(m_bmi.biBitCount!=24) { MessageBox("当前打开的图不是24图"); return; } memcpy(&m_newbmf,&m_bmf,sizeof(BITMAPFILEHEADER)); memcpy(&m_newbmi,&m_bmi,sizeof(BITMAPINFOHEADER)); m_newbmi.biBitCount=16; m_newbmi.biCompression=BI_BITFIELDS;//即3 m_newbmi.biSizeImage=WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3; nheapSize=sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; if(lpnewBmpDataBuf!=NULL) { delete []lpnewBmpDataBuf; lpnewBmpDataBuf=NULL; } lpnewBmpDataBuf=new BYTE[nheapSize]; memcpy(lpnewBmpDataBuf,&m_newbmi,sizeof(BITMAPINFOHEADER)); DWORD* lp=(DWORD*)(lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)); *lp++=0x00007c00; *lp++=0x000003e0; *lp =0x0000001f; for(i=0;i<m_newbmi.biHeight;i++) { for(j=0;j<m_newbmi.biWidth;j++) { lpSrc=lpBmpDataBuf+sizeof(BITMAPINFOHEADER) +WIDTHBYTES(m_bmi.biWidth,m_bmi.biBitCount)*(m_bmi.biHeight-1-i) +j*3; lpDest=lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*(m_newbmi.biHeight-1-i) +j*2; b=*lpSrc++; b&=0xf8; g=*lpSrc++; g&=0xf8; r=*lpSrc++; r&=0xf8; WORD* lp=(WORD*)lpDest; *lp=0; *lp=r<<7; *lp+=(g<>3); } } if(filesavebox.DoModal()!=IDOK) return; strPath
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobai_Ry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值