24位BMP图像
BMP图象格式
![BMP图象格式](https://img.taocdn.com/s3/m/2102b2bc960590c69ec37635.png)
1.BMP文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信息。
2.图像描述信息块
000E-0011:图像描述信息块的大小,常为28H。
0012-0015:图像宽度。
0016-0019:图像高度。
001A-001B:图像的plane总数(恒为1)。
001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。
BMP图象格式
MP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。
打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。这是最普通的生成位图的工具,在这里讲解的BMP位图形式,主要就是指用画图生成的位图(当然,也可以用其它工具软件生成)。
1 dword
位图的宽度,以象素为单位
0016h
Height
1 dword
位图的高度,以象素为单位
001Ah
Planes
1 word
位图的位面数(注:该值将总是1)
图象
信息
24位bmp位图转换为24位ico图标(透明效果)
![24位bmp位图转换为24位ico图标(透明效果)](https://img.taocdn.com/s3/m/244ba71ea8114431b90dd84e.png)
32×32的24位bmp位图转换为24位ico图标2009年03月03日星期二 10:25不需任何控件和外部函数,单击窗体,输入bmp文件名和ico文件名就完成了,如果输入的文件名错误,将取消转换Private Sub Form_Click()On Error GoTo cancelicoHead = Array(0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 24, 0, 168, 12, 0, 0, 22, 0, 0, _0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 128, 12)Dim bmp(3125) As Byte, ico(3261) As Bytebegin:bmpfile = InputBox("请输入要转换的bmp文件名(全路径)")n = FileLen(bmpfile)Open bmpfile For Binary As #1Get #1, , bmpClose #1If bmp(18) <> 32 Or bmp(22) <> 32 Or n <> 3126 Thenm2 = MsgBox("文件不是32×32的24位位图,是否重新选择?", vbYesNo + 32)If m2 = vbNo Then GoTo cancelGoTo beginEnd IfFor i = 0 To 43ico(i) = icoHead(i)Next iFor i = 62 To 3133ico(i) = bmp(i - 8)Next iAutoRedraw = TrueScaleMode = 3Picture = LoadPicture(bmpfile) '在窗体上显示位图文件For y = 31 To 0 Step -1For x = 0 To 31 Step 8For b = 0 To 7ico(i) = ico(i) + 2 ^ (7 - b) * (-(Point(x + b, y) = RGB(192, 192, 192))) '把位图中颜色为RGB(192,192,192)的像素转换为透明Next bi = i + 1Next xNext yicofile = InputBox("请输入要保存的ico文件名(全路径)")Open icofile For Binary As #1Put #1, , icoClose #1MsgBox "32×32的24位位图" & vbCrLf & bmpfile & vbCrLf & _"已成功转换为24位图标" & vbCrLf & icofile, 64MousePointer = 99 '这两句把转换成的图标作为窗体的鼠标图标,以查看效果MouseIcon = LoadPicture(icofile)Exit Subcancel:MsgBox "转换被取消", 64End Sub转换原理:宽和高都不小于4的24位位图,文件的前36个字节(第0~35字节)是24位位图的标记,其中第15~18字节记录着图片的宽度,第19~22字节记录着图片的高度,设首字节为第0字节,第i 字节的值为bmp(i),则对于宽和高都小于65536的24位位图,宽=bmp(17)*256+bmp(18),高=bmp(21)*256+bmp(22),第36~53这18个字节不影响图片效果,文件的第54字节往后,每3个字节(24位)对应一个像素,所以文件大小为(54+宽*高*3)字节.32×32的24位位图文件大小为3126字节(记为第0~3125字节),前36个字节是66,77,54,12,0,0,0,0,0,0,54,0,0,0,40,0,0,0,32,0,0,0,32,0,0,0,1,0,24,0,0,0,0,0,0,12 32×32的24位ico图标文件至少3262字节(记为第0~3261字节),前44个字节(第0~43字节)是32×32的24位ico图标的标记,第44~61这18个字节不影响图标效果,第62~3133这3072个字节(3072*8=32*32*24)每3个字节(24位)对应一个像素,记录着所有像素的颜色,这与32×32的24位位图的第54~3125字节的对应规则一致,第3134~3261这128字节(1024位,128*8=32*32)每位对应一个像素,记录着每个像素是否透明,如果某个像素在这128字节中对应的那一位是1,表示该像素透明,是0则表示不透明.32×32的24位ico图标的前44个字节是0,0,1,0,1,0,32,32,0,0,1,0,24,0,168,12,0,0,22,0,0,0,40,0,0,0,32,0,0,0,64,0,0,0,1,0,24,0,0,0,0,0,128,12。
读取并在屏幕上显示24位bmp图像
![读取并在屏幕上显示24位bmp图像](https://img.taocdn.com/s3/m/c0d7443a763231126edb114e.png)
读取并在屏幕上显示24位bmp图像PS:本文非原创,code来自互联网。
代码如下:/*这里仅仅是一个简单的显示也可以写出适用于各种OpenGL使用例如设置我们甚至可以使用负的系数,使得整个图象进行水平方向或垂直方向的翻转(默认像素从左绘制到右,但翻转后将从右绘制到左。
默认像素从下绘制到上,但翻转后将从上绘制到下。
因此,*/ opengl#include <gl/#definestaticstaticstaticstaticstatic#include <stdio.h>#include <stdlib.h>void{////// glClear(GL_COLOR_BUFFER_BIT);//GL_glutSwapBuffers();}int{FILE* pFile = fopen(str,exit(fseek(pFile,fread(&ImageWidth,fread(&ImageHeight,PixelLength = ImageWidth *++PixelLength;PixelLength *= ImageHeight;exit(fseek(pFile,fread(fclose(pFile);glutInit(&argc, argv);glutInitDisplayMode(GLUT_glutInitWindowPosition(glutInitWindowSize(ImageWidth, ImageHeight);glutCreateWindow(FileName);glutDisplayFunc(&display);glutMainLoop();}显示结果截图如下:为方便理解程序,下面把网上找的关于部分bmp图像格式的说明也写在下面了,如果还想了解的更清楚,就自己再google下,很多相关资料的。
BMP文件是一种像素文件,它保存了一幅图象中所有的像素。
BMP图像格式详解
![BMP图像格式详解](https://img.taocdn.com/s3/m/37728118650e52ea5518983d.png)
BMP格式图像文件详析首先请注意所有的数值在存储上都是按“高位放高位、低位放低位的原则”,如12345678h放在存储器中就是7856 3412)。
下图是导出来的开机动画的第一张图加上文件头后的16进制数据,以此为例进行分析。
T408中的图像有点怪,图像是在电脑上看是垂直翻转的。
在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行,“h”表示是16进制数。
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2......BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头1)1:图像文件头。
424Dh=’BM’,表示是Windows支持的BMP 格式。
2)2-3:整个文件大小。
4690 0000,为00009046h=36934。
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。
4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。
8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。
9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。
0100,为0001h=1。
二、位图信息头9)15:每个像素的位数。
Bmp图像存储格式
![Bmp图像存储格式](https://img.taocdn.com/s3/m/4b45fd6baf1ffc4ffe47ac7b.png)
摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在程序中实现了一种存储格式到另一种存储格式的转换。
关键字:BMP、灰度位图、24位真彩色位图、存储格式一、前言BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。
位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。
许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。
在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。
因此,很有必要介绍一下位图文件的这两种存储格式。
二、24位真彩色图像存储格式把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。
24位真彩色的二进制数据为:这是24位真彩色位图文件数据一部分。
这一部分数据包括位图文件头、位图信息头和位图阵列三部分。
(一)位图文件头位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下:字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000 42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中:42 4D 为位图的标志,即ASCII码为BMCC B4 02 表示位图文件的总字节数,换算成十进制为(02B4CC)H=(177356)10,即这副图像的大小为177356字节。
00 00 00 00 00 为保留字节,用来存储文件大小的数据。
36 00 00 00 00 表示位图阵列的起始位置,(36)H=(54)10即54字节开始为位图阵列。
(二) 位图信息头位图信息头记录和位图相关的一些信息,在文件中占40个字节,存储的内容如下:字节 1 2 3 4 5 6 7 8 9 10 11121314151600000 0 2800001 6 02C1C511800003 2 012B12B00004 8 0其中:28 00 00 00 表示信息头的长度,(28)H=(40)10,即位图信息头占40个字节。
1 怎样读取BMP文件中的像素数据与显示位图
![1 怎样读取BMP文件中的像素数据与显示位图](https://img.taocdn.com/s3/m/306b2d07d1f34693dbef3e37.png)
怎样读取BMP位图的数据与显示位图计算机与信息工程系管庶安一 BMP位图文件的结构以24位BMP位图文件为例说明。
BMP位图文件结构如下表所示:位图数据◇逐行逐列记录各像素点的三基色分量。
◇每一像素点占用三个字节,分别表示蓝色分量B、绿色分量G、红色分量R的值。
◇ 设图像有n行、m列像素,行顺序为从下向上分别为第1行、第2行……;列顺序为从左向右分别为第1列、第2列……。
按此顺序将各像素的三基色值记录于BYTE型的一维数组中,如下图所示:注意:当一行占用的字节数不是4的整数倍时,应补充1~3个无效字节,使一行占用的字节数能被4整除。
无效字节可为任意值,不会影响图像内容。
二读取BMP位图数据(1)在MFC工程中的 .H文件中定义如下全局成员变量:BITMAPFILEHEADER FileHead; // 定义存放 .BMP 文件头的结构BITMAPINFOHEADER BmpInfo; // 定义存放 .BMP 信息头的结构LPBYTE lpImage; // 定义存放 .BMP文件中的位图数据的BYTE型指针typedef struct CCC{ // 定义能存放一个像素的3个基色值的结构类型BYTE B;BYTE G;BYTE R;};CCC C3 [480] [640];// 定义能存放一幅480行、640列像素的二维数组,以便图像处理与识别时运算(2)在.CPP文件中的类构造函数中,为lpImage指针申请内存:lpImage=(LPBYTE)new BYTE[640*480*3];在.CPP文件中的类析构函数中,为lpImage指针释放内存:delete[ ] lpImage;(3)在.CPP文件中的适当函数中打开.BMP文件,读取信息头和位图数据。
CFile f;BOOL OK;OK=f.Open( Bmp.PathName,CFile::modeRead|CFile::typeBinary|CFile::shareExcl usive,NULL);if(!OK) return(-1); //不能打开文件,返回失败标志-1f.Read(&FileHead,sizeof(FileHead)); //读文件头if(FileHead.bfType!=0x4d42) {f.Close();return -2; //不是BMP文件,返回失败标志-2 }short x,y,z;z=(BmpInfo.biWidth*3/4)*4+(BmpInfo.biWidth*3%4==0 ? 0 : 4);f.Read(&BmpInfo,sizeof(BmpInfo)); //读信息头f.Seek(FileHead.bfOffBits,0);f.Read(lpImage,BmpInfo.biHeight*z); //读全部位图数据f.Close();for(y=BmpInfo.biHeight-1;y>=0;y--){memcpy(C3[y],lpImage+(BmpInfo.biHeight-1-y)*z,z); //逐行将位图数据填写到C3数组中}return 1; //最后,返回成功标志1三显示位图1 先按上述方法读取位图数据,再将读取数据予以显示。
BMP格式介绍(一)
![BMP格式介绍(一)](https://img.taocdn.com/s3/m/460ee411b42acfc789eb172ded630b1c59ee9b8a.png)
BMP格式介绍(⼀)原理篇:⼀、编码的意义。
让我们从⼀个简单的问题开始,-2&-255(中间的操作符表⽰and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的⼈并不多。
这个看起来和图⽚格式没有关系的问题恰恰是图⽚格式的核⼼内容以⾄于整个计算机系统的核⼼内容,多媒体技术虽然没有数据结构,操作系统等计算机基础课所占的地位重,但是在于研究编码⽅⾯有着⾮常重要的地位。
图像其实可以看做⼀种特殊编码过的⽂件。
⼆、从简单的24位bmp开始bmp是最常见也是编码⽅式最简单的图⽚格式,这⾥不说明⼀幅图⽚是怎么显⽰在电脑上的,那不是多媒体技术研究的问题,我们来研究bmp的格式问题,为了使各位能够最快的了解bmp格式,我们从24位的⼀个16*16的⼩图像开始。
我们使⽤常⽤的绘图软件创建⼀个16*16的24位bmp图像,如下图所⽰:可以看到图⽚很⼩,我们使⽤ultra-edit看看其内部是什么(ultra-edit是⼀个⽐记事本更加⾼级的编辑软件,可以在⽹上下载到),我们打开其内部看到的是如下的⼀个⼗六进制的数据⽂件:看起来很⾼深⽽⼜很凌乱的样⼦,我们慢慢地说明这些看起来很凌乱的数据流都代表了什么意思,⾸先我们要说明的是,这⾥⾯⼀个数字代表的是⼀个字节,⽐如头两个数42 4d是两个⼗六进制的数,代表了两个字节。
可以看到在UE中⼀⾏是⼗六个字节。
在具体说明每个字节的含义之前,⾸先需要说明的是字节的排布⽅式,在操作系统和计算机组成结构⾥⾯有⼤端法和⼩端法(如果有遗忘可以查⼀下书),简易的说法是这样的,⼩端法的意思是“低地址村存放低位数据,⾼地址存放⾼位数据”,⼤端法就是反过来的,举个例⼦,如果地址从左到右依次增⼤,那么数据01 02的⼩端法存储⽅式是02 01,⼤端法的存储⽅式就是01 02。
在所有的intel的机器上都是采⽤的⼩端法,⽽⼤端法主要存在于摩托罗拉造的处理器的机器上,所以如果你⽤的是⼀个果粉,⽤的是MAC的话,那么你看到的数据排布⽅式是和我们说明中是相反的。
5种Web图像格式简述
![5种Web图像格式简述](https://img.taocdn.com/s3/m/cd447821f78a6529647d53ec.png)
PNG
Portable Network Graphics
特点5:兼容性较好。 gif图像在不同系统上所显示的画面也会跟着不一样,但png却可以让你在
Macintosh上制作的图像与在Windows上所显示的图像完全相同,反之亦然。 png被设计成可以通过网络传送到任何机种及作业系统上读取。 文字资料(如作者、出处)、储存遮罩(MASK)、伽玛值、色彩校正码等 信息均可参杂在 png图像中一起传输。
24位真彩模式。png不仅能储存256色以下的index color图像,还能储存24位真彩 图像,甚至能最高可储存至48位超强色彩图像。
PNG
Portable Network Graphics
特点2:png能把图像文件压缩到极限以利于网络传输,但又能保留所有与
图像品质有关的信息。 如果你的图像是以文字、形状及线条为主,png会用类似gif的压缩方法来得 到较好的压缩率,而且不破坏原始图像的任何细节。据国际网络联盟测算,八位
的png图像比同位的gif图像就小10%到30%。
而对于相片品质一类的压缩,png则采用类似jpg的压缩演算法。但是jpg压缩 程度越大、影像的品质越差。因为它的压缩是采用的是破坏性压缩法、每次压缩 的同时便多多少少漏掉一些像素。 png不同于jpg的地方在于:它处理相片类图像
亦是采用非破坏性压缩,图像压缩后能保持与压缩前图像质量一样,没有一点失
从这个名字可以看出,这种图像格式主要是为了通过网络传输图像而设计的。
GIF格式的特点是压缩比高,磁盘空间占用较少,所以这种图像格式迅速得到
了广泛的应用。
GIF
Graphics Interchange Format
GIF87a:只是简单地用来存储单幅静止图像。
BMP图像存储格式
![BMP图像存储格式](https://img.taocdn.com/s3/m/d41c3a8684868762caaed571.png)
维基百科的BMP定义BMP取自位图BitMaP的缩写,也称为DIB(与设备无关的位图),是微软视窗图形子系统(Graphics Device Interface)内部使用的一种位图图形格式,它是微软视窗平台上的一个简单的图形文件格式。
图像通常保存的颜色深度有2(1位)、16(4位)、256(8位)、65536(16位)和1670万(24位)种颜色(其中位是表示每点所用的数据位)。
8位图像可以是索引彩色图像外,也可以是灰阶图像。
表示透明的alpha通道也可以保存在一个类似于灰阶图像的独立文件中。
带有集成的alpha通道的32位版本已经随着Windows XP出现,它在视窗的登录和主题系统中都有使用。
文件大小计算BMP文件通常是不压缩的,所需存储空间比较大。
一个像素所占的字节数为n∕8字节,n是位深。
文件大小可以根据以下公式近似计算:BMP文件大小≈54+4*2n+(width*height*n)∕8;54是位图文件的文件头,4*2n是调色板的大小(对于没有调色板的位图文件,则不存在这一项),最后一项是像素数据。
由于存储算法决定的因素,实际文件大小和计算值可能有细微差别;因此使用的≈符号而不是等于号。
文件存储格式BMP图像自推出以后,几经演进,存储格式也有所变化。
下表详细描述了位图文件可能包含的数据。
结构体名称可选大小用途备注位图文件头否14字节存储位图文件通用信息仅在读取文件时有用DIB头否固定(存在7种不同版本)存储位图详细信息及像素格式紧接在位图文件头后附加位掩码是3或4 DWORD(12或16字节)定义像素格式仅在DIB头是BITMAPINFOHEADER时存在调色板见备注可变定义图像数据(像素数组)所用颜色色深≤ 8时不能省略填充区A是可变结构体对齐位图文件头中像素数组偏移量的产物像素数组否可变定义实际的像素数值像素数据在DIB头和附加位掩码中定义。
像素数组中每行均以4字节对齐填充区B 是可变结构体对齐DIB头中ICC色彩特性数据偏移量的产物ICC色彩特性数据是可变定义色彩特性可以包含外部文件路径,由该文件来定义色彩特性Remark:像素数组每行均以4字节对齐,这会影响我们怎么读取像素数据。
BMP图像的读写(8位和24位)
![BMP图像的读写(8位和24位)](https://img.taocdn.com/s3/m/c9e33f21763231126edb1153.png)
南通大学计算机科学与技术学院《数字图像处理》课程实验报告书实验名BMP文件的读写(8位和24位)班级计121姓名张进学号**********2014年6月16 日一、实验内容1、了解BMP文件的结构2、8位位图和24位位图的读取二、BMP图形文件简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件结构内容摘要三、读写涉及的原理1、图像的二值化的基本原理图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
24位bmp彩色图转换为24位灰度图的方法
![24位bmp彩色图转换为24位灰度图的方法](https://img.taocdn.com/s3/m/ce1094e5551810a6f524862b.png)
24位bmp彩色图转换为24位灰度图的方法一、所用到的流处理函数:fstream:可同时进行读写操作的文件类;或ofstream:写操作(从内存中读数据到文件)的文件类;ifstream:读操作(从文件读数据到内存)的文件类。
二、位图文件的格式:①位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节②位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节③颜色表项,所用结构体:RGBQUAD,由biBitCount值决定④数据区,当结构体BITMAPINFOHEADER中的成员变量biBitCount = 1时,1个字节代表8个像素;biBitCount = 2时,1个字节代表2个像素;biBitCount = 8时,1个字节代表1个像素;biBitCount = 16时,2个字节代表1个像素;biBitCount = 24时,3个字节代表1个像素;RGBQUAD结构体的定义如下:typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色分量BYTE rgbGreen; // 绿色分量BYTE rgbRed; // 红色分量BYTE rgbReserved; // 保留值,必须为0.} RGBQUAD;即一个RGBQUAD结构体占4个字节,当biBitCount = 1,2,4,8时,颜色表项分别占2,4,16,256个RGBQUAD 结构体大小的空间;当biBitCount = 24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。
三、需要注意的问题:1. bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp 文件,数据区前三个字节代表位图左下角第一个元素;2. bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有biSizeImage = ((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight3. 对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BITMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。
BMP图像大小计算方法
![BMP图像大小计算方法](https://img.taocdn.com/s3/m/15fa2b29b42acfc789eb172ded630b1c59ee9b36.png)
BMP图像大小计算方法大小=分辨率*位深/8分辨率=宽*高(如:1024*768,640*480)位深:如24位,16位,8位/8计算的是字节数。
例如:一幅图像分辨率:1024*768,24位,则其大小计算如下:大小=1024*768824/8=2359296byte=2304KBBMP是一种与硬件设备无关的图像文件格式,使用非常广。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
BMP文件的图像深度可选lbit、4bit、8bit及24bit。
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
典型的BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
具体数据举例:如某BMP文件开头:424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。
424Dh=’BM’,表示是Windows支持的BMP格式。
三分钟解析24位真彩BMP格式文件 - 推酷
![三分钟解析24位真彩BMP格式文件 - 推酷](https://img.taocdn.com/s3/m/be34a06fddccda38376baf22.png)
请 输 入 评 论 内 容 ...
已发表评论数(0)
搜索文章
/articles/FvaIVj
登录后评论
4/7
15-4-9
相关站点
ITeye-博客
+ 订阅
相关主题
技术
三分钟解析24位真彩BMP格式文件 - 推酷
热门文章
1. 栈溢出的利用
2. 记一次tcmalloc分配内存引起的coredump
3. RapidJSON —— C++ 快速 JSON 解析器和生成器
4. C++学习之引用
/articles/FvaIVj
5/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷
5. 在 Visual Studio 本地引用 Boost 6. Exploiting CVE-2015-0311, Part II: Bypassing Control Flow Guard on Window..
/articles/FvaIVj
7/7
/articles/FvaIVj
1/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷
000000XX0h 是用来方面看数据的(也可以方便记数),比如数据表的第一行的第三个字节数 据 9E 的位置就是 00000000h + 2 = 00000002h ,这就是为什么在一些解释中定位中使用 000000XXXh 的原因。
因此在我们的读取数据中需要根据 BMP 图像的宽度来判断是否被补 0 ,判断方法就是先 判断一行的字节数是否可以被 4 整除,如果整除则不需要补 0 ,如果没有整除,则求出补的 0 的个数(具体计算方法是, bu_0_number = width( 像素 ) * 3 % 4 ),那么就知道在每 一行的末尾都补了 bu_0_number 个 0 ,因此我们在读取时绘制图片时就要忽略这些数据。 (补充:求每一行的字节数 size = width * 3 )
CC++BMP(24位真彩色)图像处理(2)------图像截取
![CC++BMP(24位真彩色)图像处理(2)------图像截取](https://img.taocdn.com/s3/m/9c6a4b71dcccda38376baf1ffc4ffe473368fd0a.png)
CC++BMP(24位真彩⾊)图像处理(2)------图像截取对上⼀篇博客《C/C++ BMP(24位真彩⾊)图像处理(1)------图像打开与数据区处理》的代码做⼩部分的修改,就可以进⾏BMP图像的截取操作,代码如下:#include <string.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include<time.h>//时间相关头⽂件,可⽤其中函数计算图像处理速度#define WIDTHBYTES(bits) (((bits)+31)/32*4)//⽤于使图像宽度所占字节数为4byte的倍数#define MYCUT_HEIGHT 100 //截取⾼度#define MYCUT_WIDTH 100 //截取宽度#define BEGIN_X 0 //截取位图开始位置X坐标#define BEGIN_Y 0 //截取位图开始位置Y坐标typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned long DWORD;typedef long LONG;//位图⽂件头信息结构定义//其中不包含⽂件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取⽂件信息)typedef struct tagBITMAPFILEHEADER {DWORD bfSize; //⽂件⼤⼩WORD bfReserved1; //保留字,不考虑WORD bfReserved2; //保留字,同上DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和} BITMAPFILEHEADER;//信息头BITMAPINFOHEADER,也是⼀个结构,其定义如下:typedef struct tagBITMAPINFOHEADER{//public:DWORD biSize; //指定此结构体的长度,为40LONG biWidth; //位图宽LONG biHeight; //位图⾼WORD biPlanes; //平⾯数,为1WORD biBitCount; //采⽤颜⾊位数,可以是1,2,4,8,16,24,新的可以是32DWORD biCompression; //压缩⽅式,可以是0,1,2,其中0表⽰不压缩DWORD biSizeImage; //实际位图数据占⽤的字节数LONG biXPelsPerMeter; //X⽅向分辨率LONG biYPelsPerMeter; //Y⽅向分辨率DWORD biClrUsed; //使⽤的颜⾊数,如果为0,则表⽰默认值(2^颜⾊位数)DWORD biClrImportant; //重要颜⾊数,如果为0,则表⽰所有颜⾊都是重要的} BITMAPINFOHEADER;void main(){long now=0;now=clock();//存储图像处理开始时间BITMAPFILEHEADER bitHead,writebitHead;BITMAPINFOHEADER bitInfoHead,writebitInfoHead;FILE* pfile;//输⼊⽂件FILE* wfile;//输出⽂件char strFile[50]="E:\\testpicture\\1.bmp";//打开图像路径,BMP图像必须为24位真彩⾊格式char strFilesave[50]="E:\\testpicture\\2.bmp";//处理后图像存储路径pfile = fopen(strFile,"rb");//⽂件打开图像wfile = fopen(strFilesave,"wb");//打开⽂件为存储修改后图像做准备//读取位图⽂件头信息WORD fileType;fread(&fileType,1,sizeof(WORD),pfile);fwrite(&fileType,1,sizeof(WORD),wfile);if(fileType != 0x4d42){printf("file is not .bmp file!");return;}//读取位图⽂件头信息fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);writebitHead=bitHead;//由于截取图像头和源⽂件头相似,所以先将源⽂件头数据赋予截取⽂件头//读取位图信息头信息fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);writebitInfoHead=bitInfoHead;//同位图⽂件头相似writebitInfoHead.biHeight=MYCUT_HEIGHT;//为截取⽂件重写位图⾼度writebitInfoHead.biWidth=MYCUT_WIDTH;//为截取⽂件重写位图宽度int mywritewidth=WIDTHBYTES(writebitInfoHead.biWidth*writebitInfoHead.biBitCount);//BMP图像实际位图数据区的宽度为4byte的倍数,在此计算实际数据区宽度 writebitInfoHead.biSizeImage=mywritewidth*writebitInfoHead.biHeight;//计算位图实际数据区⼤⼩writebitHead.bfSize=54+writebitInfoHead.biSizeImage;//位图⽂件头⼤⼩为位图数据区⼤⼩加上54bytefwrite(&writebitHead,1,sizeof(tagBITMAPFILEHEADER),wfile);//写回位图⽂件头信息到输出⽂件fwrite(&writebitInfoHead,1,sizeof(BITMAPINFOHEADER),wfile);//写回位图信息头信息到输出⽂件int width = bitInfoHead.biWidth;int height = bitInfoHead.biHeight;//分配内存空间把源图存⼊内存int l_width = WIDTHBYTES(width*bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为4byte的倍数int write_width = WIDTHBYTES(writebitInfoHead.biWidth*writebitInfoHead.biBitCount);//计算写位图的实际宽度并确保它为4byte的倍数BYTE *pColorData=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像数据memset(pColorData,0,height*l_width);BYTE *pColorDataMid=(BYTE *)malloc(mywritewidth*MYCUT_HEIGHT);//开辟内存空间存储图像处理之后数据memset(pColorDataMid,0,mywritewidth*MYCUT_HEIGHT);long nData = height*l_width;long write_nData = mywritewidth*MYCUT_HEIGHT;//截取的位图数据区长度定义//把位图数据信息读到数组⾥fread(pColorData,1,nData,pfile);//图像处理可通过操作这部分数据加以实现//截取图像数据区操作,在操作过程中注意截取图像是否越界,可在此处加⼊代码进⾏越界处理for(int hnum=height-BEGIN_Y-MYCUT_HEIGHT;hnum<height-BEGIN_Y;hnum++)//由于BMP图像的数据存储格式起点是图像的左下⾓,所以需要进⾏坐标换算操作 for(int wnum=BEGIN_X;wnum<BEGIN_X+MYCUT_WIDTH;wnum++){int pixel_point=hnum*l_width+wnum*3;//数组位置偏移量,对应于图像的各像素点RGB的起点int write_pixel_point=(hnum-height+BEGIN_Y+MYCUT_HEIGHT)*mywritewidth+(wnum-BEGIN_X)*3;pColorDataMid[write_pixel_point]=pColorData[pixel_point];pColorDataMid[write_pixel_point+1]=pColorData[pixel_point+1];pColorDataMid[write_pixel_point+2]=pColorData[pixel_point+2];}fwrite(pColorDataMid,1,write_nData,wfile); //将处理完图像数据区写回⽂件fclose(pfile);fclose(wfile);printf("图像处理完成\n");printf("运⾏时间为:%dms\n",int(((double)(clock()-now))/CLOCKS_PER_SEC*1000));//输出图像处理花费时间信息}。
高二信息技术试题大全
![高二信息技术试题大全](https://img.taocdn.com/s3/m/d2695a22ad51f01dc381f10e.png)
高二信息技术试题答案及解析1.下列4幅图均为220×120像素、24位色的BMP图像,其存储容量依次为a,b,c,d 下列说法正确的是()A.d最大B.a最小C.c比b小D.a,b,c,d一样大【答案】D2.马云演示购物支付时,用人脸识别完成购物,下面没有用到的相关技术是()A.人工智能B.网上数据库C.图像识别D.OCR软件和金山译霸【答案】D3. Internet基本协议是 ( )A.TCP/IP协议B.电子邮件协议C.FTP协议D.新闻讨论组协议【答案】A4.在Excel 单元格中的数据显示为“###”是由于该单元格中输入的公式或函数错误。
()A.正确B.错误【答案】B5.关于信息表达与交流,下列说法正确的是()A.信息表达是在因特网出现后产生的B.信息的表达与交流不需要遵守任何规范C.同一种信息内容可以采用不同的表达方式D.电子公告板是网上唯一的信息交流方式【答案】C6. MP3已成为目前最通用的声音文件格式,是因为()A.出现最早的声音文件格式B.把声音文件进行了压缩,但对音质却没有多大损害C.在音频文件中它的音质最好D.在音频文件中它占用的存储空间最小【答案】B7.学校要举行篮球比赛,采用淘汰赛制,各队之间对阵方案,采用下列哪种表达方法更好些?()A.结构图B.文本描述C.流程图D.表格【答案】A【解析】A(表达对阵各方)C(主要表达时间与事件先后)8.申请一个电子邮箱并向朋友发送邮件的操作过程如下:(1)填写用户名、密码等相关信息,完成注册(2)打开提供电子邮件服务的网站(3)登录邮箱并发送邮件(4)找到并单击有关注册的链接正确的操作顺序是()A.(2)(3)(4)(1)B.(3)(4)(1)(2)C.(1)(2)(3)(4)D.(2)(4)(1)(3)【答案】D9.下列哪一选项,使得人类在信息传递方面首次突破了时间和空间的限制?()A.造纸术和印刷术的发明和应用B.语言的产生和使用C.电报电话的发明和应用D.文字的发明和使用【答案】D【解析】文字记录下来,可以突破时间限制,传递出去,突破空间限制。
颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式(8位1。。。
![颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式(8位1。。。](https://img.taocdn.com/s3/m/11a31836a4e9856a561252d380eb6294dd8822fc.png)
颜⾊模式中8位,16位,24位,32位⾊彩是什么意思?会有什么区别?计算机颜⾊格式(8位1。
颜⾊模式中8位,16位,24位,32位⾊彩是什么意思?会有什么区别简单地说这⾥说的位数和windows系统显⽰器设置中的颜⾊位数是⼀样的。
表⽰的是能够显⽰出来的颜⾊的多少。
8位的意思是说,能够显⽰出来的颜⾊的数量有8位数。
16、24都是⼀样的。
24位的颜⾊数量已经很多了,叫做“真彩⾊”,其实32位和24位颜⾊数量是⼀样多的。
32位多出来的8位数是⽤来表⽰透明度信息的,所以更加真实。
如果⼀有⼀张真彩⾊的照⽚,放到⼀个只有8位的显⽰器上的话,显⽰出来的效果就会很差。
所以当需常见的颜⾊有 8位 16位 24位 32位⾊,其中24位及以上称为真彩,是PC上最常⽤的颜⾊,其他基本⽤于嵌⼊式系统或⼀些⼯控领域,详情可查阅⼀下表格:Bit-深度⾊彩数1 2 (monochrome)2 4 (CGA)4 16 (EGA)8 256 (VGA)16 65,536 (High Color, XGA)24 16,777,216 (True Color/真彩⾊, SVGA)32 16,777,216 (True Color + Alpha Channel/控制透明度,-游戏特效)关于256⾊,早先的⼀些较为形象的解释是理解为256个油漆桶/256⾊调⾊板,分配给它们编号/索引号。
“叫到哪个颜⾊”哪个颜⾊就出来填充像素。
因为如16⾊、256⾊的⾊彩数有限所以这么解释很简单易理解。
然⽽电脑操作过程中必须经过数码编码,那么实际上256种颜⾊对应256个数码(⼆进制数值),也就是2^2 * 2^3 * 2^3 = 2^8 = 256。
256⾊模式下电脑没有必要去按24bit处理,在当时DOS时代,处理8bit⾊彩⽐24bit要容易多了。
当然256⾊中的任意⼀种颜⾊都可以⽤24bit表⽰,甚⾄可以⽤32bit,64bit表⽰。
但是不管如何,24bit模式就意味着 17.7million种颜⾊。
BMP图像大小计算方法
![BMP图像大小计算方法](https://img.taocdn.com/s3/m/a9b9d91fa300a6c30c229fd0.png)
12)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
14)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
15)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。
三、彩色板
16)28-35:彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00FB 0000为FB00h=1111100000000000(二进制),是红色分量的掩码。
,其中高度和宽度都是像素数。 需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。 如果想知道这些值是如何得到的,请参考下面文件格式的部分。 由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>
#include<malloc.h>
void main()
{
FILE *fpIn,*fpOut;
///////////////////////////
struct RGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} bicolor;
char bfty[2];
short bfreserved1,biplanes,bibitcount;
long bfsize,bfoffbit,bisize,biwidth,biheight;
long bicompression,bisizeimage,bix,biy,biclrused,biclrimportant;
char *cR;
int iCol,iRow;
int i,j;
int iWidth;
char *lpsData;
int iL;
short sTemp;
////////////////////////////////////
fpIn=fopen("F:/课堂学习/遥感数字图像处理/data/AA","rb");
fpOut=fopen("F:/课堂学习/遥感数字图像处理/data/Tm23.bmp","wb");
//D:\??\??????????\Data\data
iCol=600;
iRow=600;
bfty[0]='B';
bfty[1]='M';
bfsize=54+iCol*iRow*3;
bfreserved1=0;
bfoffbit=54;
/////////////////
bisize=40;
biwidth=iCol;
biheight=iRow;
biplanes=1;
bibitcount=24;
bicompression=0;
bisizeimage=iRow*iCol*3;
bix=0;
biy=0;
biclrused=0;
biclrimportant=0;
/////////////////////////
fwrite(&bfty[0],1,1,fpOut);//fprintf
fwrite(&bfty[1],1,1,fpOut);
fwrite(&bfsize,4,1,fpOut);
fwrite(&bfreserved1,2,1,fpOut);
fwrite(&bfreserved1,2,1,fpOut);
fwrite(&bfoffbit,4,1,fpOut);
///////////////////////////////////
fwrite(&bisize,4,1,fpOut);
fwrite(&biwidth,4,1,fpOut);
fwrite(&biheight,4,1,fpOut);
fwrite(&biplanes,2,1,fpOut);
fwrite(&bibitcount,2,1,fpOut);
fwrite(&bicompression,4,1,fpOut);
fwrite(&bisizeimage,4,1,fpOut);
fwrite(&bix,4,1,fpOut);
fwrite(&biy,4,1,fpOut);
fwrite(&biclrused,4,1,fpOut);
fwrite(&biclrimportant,4,1,fpOut);
////////////////////////////////////////////// ///////////////////////////////
iWidth=(iCol*3+3)/4*4;//为什么?
cR=(char *)malloc(iWidth*sizeof(char)*iRow); lpsData=(char *)malloc(600*sizeof(char));
////////////////////////////
fseek(fpIn,600*600*1,0);
for(i=0;i<iRow;i++)
{
fread(lpsData,1,600,fpIn);
for(j=0;j<iCol;j++)//600
{
iL=(iRow-1-i)*iWidth+j*3;
sTemp=lpsData[j];//[750+j*5+0];
cR[iL]=sTemp*2;
}
}
fseek(fpIn,600*600*2,0);
for(i=0;i<iRow;i++)
{
fread(lpsData,1,600,fpIn);
for(j=0;j<iCol;j++)//600
{
iL=(iRow-1-i)*iWidth+j*3+1;
sTemp=lpsData[j];//[750+j*5+0];
cR[iL]=sTemp*2;
}
}
fseek(fpIn,600*600*3,0);
for(i=0;i<iRow;i++)
{
fread(lpsData,1,600,fpIn);
for(j=0;j<iCol;j++)//600
{
iL=(iRow-1-i)*iWidth+j*3+2;
sTemp=lpsData[j];//[750+j*5+0];
cR[iL]=sTemp*2;
}
}
fwrite(cR,sizeof(char),iWidth*iRow,fpOut); free(cR);
free(lpsData);
fclose(fpOut);
fclose(fpIn);
}。