精华内容
下载资源
问答
  • LPBITMAPINFOHEADER lpbmiHeader...计算BMP方法 法一:lpbmiHeader->biSizeImage = (cx * biBitCount + 31)/32*4*cy; 法二:lpbmiHeader->biSizeImage = ((cx * biBitCount + 31) & ~31) / 8 * cy; 法三:lpbmiHea

    LPBITMAPINFOHEADER lpbmiHeader;

    // ...

    计算BMP方法

    法一:lpbmiHeader->biSizeImage = (cx * biBitCount + 31)/32*4*cy;

    法二:lpbmiHeader->biSizeImage = ((cx * biBitCount + 31) & ~31) / 8 * cy;

    法三:lpbmiHeader->biSizeImage = ((cx * biBitCount + 31) & ~31) >> 3 * cy;


    前提: 在BMP的文件格式中规定每行的字节数必须是4的整数倍,不是4的整数倍要补齐。

    上面公式红色部分都是一样的结果,都是计算BMP图像中每行的字节数。

    其中cx * biBitCount是实际一行占用的位数。暂且用dwRowBit表示吧。

    情况1:dwRowBit小于32位(假设dwRowBit为31),那么dwRowBit/8 就小于4,但是我们需要补齐4个字节。办法就是(31 + 31)/32 * 4

    情况2: dwRowBit正好32位,不需要考虑多少。 32/8 ,和32/32 * 4都是一样的

    情况3: dwRowBit为34位,按理说最少需要4个字节带1位,但是因为必须是4的整数倍,所以应该以8个字节保存。

    如何将34位转化为8个字节呢?就是要将dwRowBit中除以32的余数部分添加到满足32位的情况。

    所以(dwRowBit + 31)/32 * 4;

    其实我们也可以换个思维考虑:

    如下dwRowBit分成2个部分: dwRowBit1为正好能被32整除的部分,dwRowBit2为不能被32整除的部分(则dwRowBit2肯定小于32,为什么?你们想想?)

    那么上述公式划分为

    (dwRowBit1 + dwRowBit2 + 31) / 32 * 4;

    再简化一下就是dwRowBit1 / 32 * 4 + (dwRowBit2 + 31) / 32 * 4

    再简化一下dwRowBit1 / 8 + (dwRowBit2 + 31) / 32 * 4

    dwRowBit2从31位中取一定的位数使自己补齐为32,31剩余的部分除以32的话自动为0.


    另外还要补充一点: 对单位的考虑

    (dwRowBit1 + dwRowBit2 + 31) bit / 32 bit  * 4 Byte


    //===============================================================================================//

    // 参考资料1 

    计算biSizeImage的两种方法:

    1.最简单的方法是由BITMAPFILEHEADER结构的bfSize减去bfOffBits。

    2.由图像的高度和宽度来计算图像数据的字节数。要注意的是并不是图像的高度乘以图像宽度乘以表示每象

    素的字节数就行了,因为在BMP的文件格式中规定每行的字节数必须是4的整数倍,不是4的整数倍的要补

    零。因此,正确的算法是:

    biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight

    其中,biWidth*biBitCount是每一行图像占用的位数,除以8是每行图像占用的字节数,要为4的整数倍,所

    以除以32再乘以4,整数除法自动取整。(不能直接除以8,想想为什么?加31有什么作用?)

    不足的位数补充上如241存储为244.(..........如果可以位数舍去,241为240,这是不可能的,那不用加31)


    // 参考资料2

    csdn论坛搜索关键字:

    biSizeImage

    VC/MFC分区——图形处理/算法

    主要链接:

    http://topic.csdn.net/u/20070929/13/9ED13464-121E-401E-B827-91E3BF5F0036.html

    http://topic.csdn.NET/u/20100114/21/0A67123E-1407-4FC0-B4E0-6D27FB8626C2.html

    http://topic.csdn.net/u/20100116/17/4590fdf6-91c7-49a6-a76f-fa3effbae759.html

     

    关键心得:

     

    biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight其中,biWidth*biBitCount是每一行图像占用的位数,除以8是每行图像占用的字节数,要为4的整数倍,所以除以32再乘以4
    31是按整数除法自动取整的原则来的,其保证每行图像字节数必须是4的整倍数!
    举一个例子,对于2色图,如果图象宽是31,则每一行需要31位存储,合3个字节加7位,因为字节数必须是4的整倍数,所以应该是4。所以补齐时需要加上4个字节数即32位

     

    ===================================

    1:biWidth = 241 是位图的宽度而不是字节数目
    2:(bits)其实需要输入:(biWidth * biBitCount),
    3:WIDTHBYTES()根据输入(biWidth*biBitCount)而得出行字节数,而扫描行字节数乘以扫描行总数(位图的高度biHeight),就得出位数据的实际字节数目,估计你是理解错误了.
    4:那估计是乱写的,正确是不能把 (xx)/32*4写成(xx)/8的,在计算机那是不相等的,举例:
    width = 2,bpp = 8那么行字节数应该是
    (2*8+31)/32*4 得4个字节.
    (2*8+31)/8 得5个字节.
    有少少常识的都知道,上面那个是对的,下面那个是错的,原因那些家伙根本不理解"对齐"的意思,片面地把"/32*4"合成为"/8"来误人误已. hoho.

    展开全文
  • biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight其中,biWidth*biBitCount是每一行图像占用的位数,除以8是每行图像占用的字节数,要为4的整数倍,所以除以32再乘以4 31是按整数除法自动取整的原则来的,其保证...

    csdn论坛搜索关键字:

    biSizeImage

    VC/MFC分区——图形处理/算法

    主要链接:

    http://topic.csdn.net/u/20070929/13/9ED13464-121E-401E-B827-91E3BF5F0036.html

    http://topic.csdn.net/u/20100114/21/0A67123E-1407-4FC0-B4E0-6D27FB8626C2.html

    http://topic.csdn.net/u/20100116/17/4590fdf6-91c7-49a6-a76f-fa3effbae759.html

     

    关键心得:

     

    biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight其中,biWidth*biBitCount是每一行图像占用的位数,除以8是每行图像占用的字节数,要为4的整数倍,所以除以32再乘以4
    31是按整数除法自动取整的原则来的,其保证每行图像字节数必须是4的整倍数!
    举一个例子,对于2色图,如果图象宽是31,则每一行需要31位存储,合3个字节加7位,因为字节数必须是4的整倍数,所以应该是4。所以补齐时需要加上4个字节数即32位

     

    ===================================

    1:biWidth = 241 是位图的宽度而不是字节数目
    2:(bits)其实需要输入:(biWidth * biBitCount),
    3:WIDTHBYTES()根据输入(biWidth*biBitCount)而得出行字节数,而扫描行字节数乘以扫描行总数(位图的高度biHeight),就得出位数据的实际字节数目,估计你是理解错误了.
    4:那估计是乱写的,正确是不能把 (xx)/32*4写成(xx)/8的,在计算机那是不相等的,举例:
    width = 2,bpp = 8那么行字节数应该是
    (2*8+31)/32*4 得4个字节.
    (2*8+31)/8 得5个字节.
    有少少常识的都知道,上面那个是对的,下面那个是错的,原因那些家伙根本不理解"对齐"的意思,片面地把"/32*4"合成为"/8"来误人误已. hoho.

    展开全文
  • BMP图像结构及其大小计算

    千次阅读 2012-05-18 05:38:37
     本文详细介绍了BMP图像结构,位图文件头、位图信息头及彩色表的数据结构及作用;深入阐述了BMP文件大小的精准计算方法,包括“补零”原则。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到

    转自http://hi.baidu.com/%D7%B7%D2%E4%B5%C4%C4%BE%CE%DD/blog/item/b34010eea7aa93e3b3fb95dc.html

     

           本文详细介绍了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文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。注意:很多文章都分错了!!

     

    一、位图文件头

    typedef struct tagBITMAPFILEHEADER {
    UINT bfType;       
    // 
    2字节1字节(1Byte=二进制8位(8bit=十六进制2
    DWORD bfSize;     // 4字节
    UINT bfReserved1;
    UINT bfReserved2;
    DWORD bfOffBits;
    } BITMAPFILEHEADER;

    11:(这里的数字代表的是"",即两个字节,下同)图像文件头。0x4D42="BM",表示是Windows支持的BMP格式。若问为什么加"BM"Windows就喜欢这么干。

    22-3:整个文件大小。4690 0000,为00009046h=36934.

    34:保留,必须设置为0

    45:保留,必须设置为0。也可能考虑以后还能加点什么。

    56-7:从文件开始到实际位图数据之间的字节偏移量。4600 0000,为00000046h=70(十进制),文件头14字节+下面的位图信息头40字节+此例彩色板16字节=70字节。

     

    二、位图信息头

    typedef struct tagBITMAPINFOHEADER {
    DWORD biSize; 
    LONG biWidth;     
    //
    4个字节
    LONG biHeight; 
    WORD biPlanes;    
    //位图的位面数,该值总是被设为1
    WORD biBitCount;  //
    说明此位图的位数(bit数)
    DWORD biCompression; 
    DWORD biSizeImage; 
    LONG biXPelsPerMeter; 
    LONG biYPelsPerMeter; 
    DWORD biClrUsed; 
    DWORD biClrImportant;
    } BITMAPINFOHEADER;

    68-9:位图信息头所需字节数,固定值2800 0000=00000028h=40(十进制)。Windows开辟这4个字节有点浪费内存的说。

    710-11:位图宽度,以像素为单位。8000 0000,为00000080h=128.

    812-13:位图高度,以像素为单位。9000 0000,为00000090h=144.

    914:位图的位面数,该值总是被设为1.  0100,为0001h=1.

    1015:说明比特数/像素的颜色深度。有1(单色),42^4=16色),8256色),1665536色,又称64K色,高彩色),2416777216色,即16M色,真彩色),324294967296色,即4096M色,增强型真彩色)。1000,为0010h=16.由此可知,此例是16位位图,而不是真彩图(24位位图)。

    1116-17:压缩说明:有0(不压缩),1RLE 88RLE压缩),2RLE 44RLE压缩,3Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 000000000003h=3.

    1218-19:说明图像的大小,以字节为单位。该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素字节数。0090 000000009000h=128×144×2=36864.

    1320-21:用象素/米表示的水平分辨率。A00F 00000000 0FA0h=4000.

    1422-23:用象素/米表示的垂直分辨率。A00F 00000000 0FA0h=4000.

    1524-25:位图使用的彩色表中的颜色索引数。设为0的话,则说明使用所有调色板项。

    1626-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。

     

    三、彩色表

    对于调色板中的每个表项,用下述方法来描述RGB的值:

    typedef struct tagRGBQUAD {
    BYTE rgbBlue;    
     //1
    字节用于蓝色分量
    BYTE rgbGreen;    //1字节用于绿色分量
    BYTE rgbRed;      //1字节用于红色分量
    BYTE rgbReserved; // 1字节用于填充符(设置为0
    } RGBQUAD;

    注意:彩色表多在伪彩色(不够十进制16777216种颜色)时用到。对于24位(24bit)真彩色(2^24= 256蓝色*256绿色*256红色=16777216色)位图,又叫RGB彩色BMP图像,则不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。那要彩色表干嘛呢?在伪彩色图中,极端一点比如一幅512*512的伪彩色图就只有2种颜色,非黑(00000000)即红(FFFF0000),那么该图可以设为1位位图,彩色版中只有两色,每个像素其实1bit就可以表示,用半个字节(4bit)就足以表示了,何必每像素3个字节的浪费内存呢?

    1728-35:彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,这幅伪彩色图中只有4种颜色,分别是:

    00FB 0000FB00h=64256(十进制),某种混合色。

    E007 000007E0h=2016(十进制),某种混合色。

    1F00 0000001Fh=31(十进制),某种混合色。

    0000 0000为纯黑色。

    另外举几个颜色案例:


     

    四、图像数据阵列

    18) 36-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。

          

    五、位图文件大小的精准计算方法

          8位(bit)位图:彩色版中有2^8=256种颜色,具体哪256种颜色可由调色板灵活规定,因此每个像素点最多有256种情况(颜色),故刚好可用两位十六进制码(16^2=256)表示,占1字节。一幅512×5128位位图大小计算方法:位图文件头(14字节)+位图信息头(40字节)+调色板(256×彩色表4字节)+实际像素点占内存512×512×1字节)=263 222字节(Byte)。

          24位位图:又名RGB真彩色图,含2^24=16 777 216=16M色,没有彩色表,原因上文已说明。每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red)。为什么每种颜色用1个字节控制呢?我们知道,图像中任何颜色都是由蓝、绿、红混合而成,而在24位位图中这三种颜色的跨度(深度)分别为256=2^8,占二进制8bit=1字节,故蓝、绿、红刚好可用1个字节表示。那么每个像素点可能的颜色就有256×256×256=2^24种。一幅256×25624位位图大小计算方法:位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存256×256×3字节)=196 662字节(Byte)。

        需要注意的是,Windows有“补零”的习惯!即要求位图的每一行像素所占字节数必须被4整除。若不能倍4整除,则在该位图每一行的十六进制码末尾“补”1至3个字节的“00”。例如:一幅宽253×高25624位位图,微软在生成该图为实际文件时,计算每一行像素所占字节=253×3字节=759字节,检验其被4除余1,则在每行的十六进制码末尾加1个字节,补“00”,变为760字节。因此我们计算该图大小时应先判断是否“补零”,再得出算法:该图大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存高256×每行760字节)=194614字节(Byte)。

        有趣的是,“补零”只针对位图的宽进行检验,一幅宽256×高25324位位图,其大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存高253×每行768字节)=194358字节(Byte< 196 662字节(Byte)。这样,只是把此图像的宽和高颠倒,图像所占内存竟然变小了。


     

    展开全文
  • 计算机图像显示原理与BMP图像的文件格式:一、计算机图像显示原理简述1.计算机图像分类:2.显示3.彩色图转灰白图原理二、BMP图像1.BMP/.JPG/.PNG2.组成(1)文件头(2)信息头(3)调色板(4)图像数据区 一、...

    本篇文章详细讲述图像文件,里面有一些阐述为个人理解,如有不对的地方欢迎指正,后续会修正补全。


    一、计算机图像显示原理简述

    1.计算机图像分类:

    关于计算机图像,可以分为两类:位图(Bitmap)和矢量图(Metafile)。

    位图由许多的矩形块组成,每个矩形代表一个点,点的个数等于位图的横向矩形块的个数乘上纵向矩形块的个数,每一个点则被称为像素点,而且每个像素点都有确定的颜色,因此形成了一幅完整的图像。通常使用的图像大部分是位图,如相机拍摄的照片,因为位图可以表示图像的细节,能够较好的还原现实场景。位图的缺点是体积比较大,因此产生了很多压缩图像格式来存储位图图像,目前应用最广的是JPEG格式,另外还有GIF、PNG等。而且位图在放大时,会出现“锯齿”现象,就是所谓的失真,这也由位图的本质特点决定。所以在现实中,还需要使用另外一种图像格式:矢量图。

    矢量图在一些商标设计上使用比较多,矢量图同位图不同,矢量图是利用数学公式通过线段绘制出来的,所以不管如何放大都不会出现失真现象,但是矢量图不能描述非常复杂的图像。所以各种图形图案、CAD软件等等都是使用矢量格式来保存文件。


    2.显示

    跟PE文件有32位和64位一样,位图也是要分位数的,分类依据主要是像素的位数。

    位图的每个像素采用不同的位数(即BMP的图像深度),就可以表示出不同的颜色,不同位图的颜色数量计算如下:

    • 4位图像:2^4=16
    • 8位图像:2^8=256
    • 16位图像:2^16=65536
    • 24位图像:2^24=16777216

    n位图说明n个二进制位是一个像素,这一个像素中再分配给透明度和RGB三原色各一个数值,每一个数值代表该颜色的亮度,因为没有亮度分量,亮度直接可以从颜色分量中得到,每一颜色分量值的范围都是0~255,某一颜色分量的值越大,就表示这一分量的亮度越高,所以可以理解为一个像素由三个平面叠加【一个平面(n/4位二进制数)代表RGB中的一个颜色或一个元素】,无数个这样的像素叠加形成一个BMP图像。

    对于现在的计算机,一般使用32位来表示颜色,32位平分给四个分量,也就是每个分量8位。(红蓝绿每种颜色可以分8种,另一个分量是透明度)这三种颜色组合起来就有256 * 256 * 256 = 16777216种颜色,基本可以表示大自然的任意色彩。


    3.彩色图转灰白图原理

    在24位彩色图像中,3个字节分别表示R、G、B三种颜色分量,在RGB表示方式中,。一个真彩色像素点转换为灰度图时它的亮度值则采用了心理学灰度公式计算:

    Y=0.299R+0.587G+0.114B
    

    使用上述公式转换时得到的灰度图最接近人眼对灰度图的感觉。灰度图中颜色数量一共只有256种(8bit),所以转换后的图像保存为8位格式(8位图像),可以节省空间。因此彩色图像转变为灰度图像是不可逆的过程。调色板中可以保存256颜色,所以可以正好将256种灰度颜色保存到调色板中。


    二、BMP图像

    1.BMP/.JPG/.PNG

    每张图片都是由像素块组成的,每个像素块都是可以由三原色组合而成的,三原色中的每一种颜色都可以用二进制来表示,不同的组合方案则显示不同颜色,在计算机显示图片当中会有压缩图片或解析图片的软件,于是计算机就能够显示图片了。

    • bmp: BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图文件默认的文件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。图片需要保存多少个点的数据就是实实在在多少个点的数据 ,没有进行压缩,类比源代码,这便是最原始的图像。

    • jgp: 图片进行了压缩 ,两种多种颜色的色差看起来不明显,将它们归纳为同一种颜色显示。JPEG的压缩方式通常是破坏性资料压缩,即在压缩过程中图像的品质会遭受很大的破坏。一张图片在多次覆盖保存后,图片会逐渐失真。

    • png: 算法类似于jpg ,是一种无损数据压缩,根据人的视觉在人可识别的颜色范围外的颜色被算法隐藏。

    相对占用空间:BMP > PNG > JPG

    2.组成

    BMP图像文件由4部分组成:

    • 文件头(BMP file header):文件的格式、大小等信息,通常,在BMP图片装载入内存后,此部分将被抛弃;
    • 信息头(Bitmap information):每像素所使用的位数、图片宽度、高度(一般为负数,当信息头的参数高为正数时,图片将是倒立的)、压缩方式、颜色索引等信息。虽然这个结构标准不一,但大多数BMP图片依然是windows NT是发布的组成结构,不同的BMP格式标准的区别主要在于信息头的大小,这可以通过信息头的第一个参数(长为四个字节的DIB Header Size)区分分辨;
    • 调色板(color palette):可选,一般位数小于8的时候存在,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表,为节省空间而存在;
    • 位图数据(bitmap data):图像数据区,也叫像素组,记录每个像素点具体的颜色或颜色索引;
      由于计算机一次处理四字节的效率更好,所以像素组的扫描行有比特补零的标准(字节对齐)。也就是说如果一张图片的尺寸是121120,它的BMP的像素组尺寸实际是124120,多出的位置零,但信息头的参数宽不因此改变,是121

    具体结构字段如下,为了更直观的看到,我们结合案例,同时给出BMP案例图。
    在这里插入图片描述

    (1)文件头

    typedef struct tagBITMAPFILEHEADER
    {
    UINT16 bfType;//2Bytes,必须为"BM",即0x424D,才是Windows位图文件
    DWORD bfSize;//4Bytes,整个BMP文件的大小(图片大小计算:bfOffBits + 长(像素) X 宽(像素) X 位数(每个像素占的位数) 。例如对于128X128X24位的图像  bfSize=128X128X24 + 54+sizeof(RGBQUAD)*256)
    UINT16 bfReserved1;//2Bytes,保留,为0
    UINT16 bfReserved2;//2Bytes,保留,为0
    DWORD bfOffBits;//4Bytes,文件起始位置到图像像素数据的字节偏移量,
    }BITMAPFILEHEADER;
    

    在这里插入图片描述
    文件大小计算:54+1152 * 648 * 3 == 2239542

    • 位图文件头+位图信息头+调色板 的大小:54
    • 位图宽:1152(0x480)
    • 位图高:648(0x288)
    • 一个像素占的字节:24bit/8 ==3
      在这里插入图片描述

    (2)信息头

    typedef struct_tagBMP_INFOHEADER
    {
    DWORD biSize;//4Bytes ,INFOHEADER结构体大小,存在其他版本INFOHEADER,用作区分
    LONG biWidth;//4Bytes,图像宽度(以像素为单位)
    LONG biHeight;//4Bytes,图像高度,指明该图像是倒向的位图,还是正向的位图(+:图像存储顺序为倒向,-:图像存储顺序为正向)
    WORD biPlanes;//2Bytes,图像数据平面,BMP存储RGB数据,因此总为1
    WORD biBitCount;//2Bytes,图像像素位数
    DWORD biCompression;//4Bytes,0:不压缩,1:RLE8,2:RLE4
    DWORD biSizeImage;//4Bytes, 4字节对齐的图像数据大小
    LONG biXPelsPerMeter;//4Bytes,用像素/米表示的水平分辨率
    LONG biYPelsPerMeter;//4Bytes,用像素/米表示的垂直分辨率
    DWORD biClrUsed;//4Bytes,实际使用的调色板索引数,0:使用所有的调色板索引
    DWORD biClrImportant;//4Bytes,重要的调色板索引数,0:所有的调色板索引都重要
    }BMP_INFOHEADER;
    

    在这里插入图片描述
    对比属性面板的分辨率,可以看出位图宽高是一致的。
    在这里插入图片描述

    (3)调色板

    typedef struct_tagRGBQUAD
    {
    BYTE rgbBlue; //指定蓝色强度
    BYTE rgbGreen;//指定绿色强度
    BYTE rgbRed; //指定红色强度
    BYTE rgbReserved;//保留,设置为0
    }RGBQUAD;
    

    (4)图像数据区

    根据信息头的biBitCount(颜色位数)从左到右,从下到上记录位图的每一个像素值(也就是说最上面的数据其实记录的是位于图像最下面的像素)像素值也是倒着念的,原始数据是按B、G、R的顺序排列的。

    • 当biBitCount=1时,8个像素占1个字节,黑白图,位图数据是指向调色板的索引序号,可以根据需要选择压缩与不压缩;
    • 当biBitCount=4时,2个像素占1个字节,16色图,位图数据是指向调色板的索引序号,可以根据需要选择压缩与不压缩,如果选择压缩,则采用RLE4算法;
    • 当biBitCount=8时,1个像素占1个字节,256色图,位图数据是指向调色板的索引序号,可以根据需要选择压缩与不压缩,如果选择压缩,采用的是RLE8算法;
    • 当biBitCount=16时,1个像素占2个字节,图像的颜色直接在位图数据中给出;有RGB555(5位红5位绿5位蓝)和RGB565(5位红6位绿5位蓝)两种情况,BMP图片不压缩时(信息头的参数Compress = 0),使用的就是RGB555模式,即R、G、B三个通道分别用五位,最高位悬空置零。
    • 当biBitCount=24位时,1个像素占3个字节,R、G、B三个通道分别用八位,真彩色图
    • 当biBitCount=32位时,R、G、B三个通道依旧分别用八位,除了RGB,还有Alpha通道,即透明色。

    之前说过,扫描行必须要是4的倍数,所以像素尺寸大小计算就是补零后的行像素数*高像素数(如果要计算文件大小还应该先乘位数,再加上信息头文件头,调色板),代码表示如下:

    DataSizePerLine = (biWidth*biBitCount+31)/8;//一个扫描行所占的字节数
    DataSizePerLine=DataSizePerLine/4*4;//字节数必须是4的倍数
    Datasize=DataSizePerLine*biHeight;//计算大小
    

    参考位图(bmp)文件格式分析

    展开全文
  • bmp图像数据说明

    2019-09-20 18:44:30
    bmp图像数据说明 BMP说明 BMP是BitMap的缩写,即位图,是一种非压缩格式,图像文件一般比较大,Windows系统内部各图像绘制操作都是以BMP为基础的。 BMP图像组成 BMP文件由四部分: 文件头信息,固定大小,结构体...
  • BMP图像数据格式详解

    万次阅读 2017-08-05 15:03:46
    Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3
  • 图像分辨率和图像大小计算

    万次阅读 2019-06-05 16:39:01
    一、BMP位图 1. 一个实际例子,选择一个24位深度的225×225位图, 由于24位位图是真彩色,没有颜色表这一样,所以 其文件大小为152.154字节,则 152.154=14+40+(225×3+1)×225 注:因为1个像素用三个字节来...
  • BMP图像格式

    2017-11-13 14:02:00
    BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两 类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP...
  • BMP图像格式详解

    千次阅读 2014-03-04 14:53:53
    ◆ 位图文件头(bmp file header): 提供文件的格式、大小等信息 ◆ 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息 ◆ 调色板(color palette):可选,如使用索引来...
  • Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows...
  • bmp图像文件

    2016-09-11 18:21:52
    (1)BMP图像分为两类,DDB和DIB,DDB(device-dependent bitmap)即为设备相关位图,DIB(device-independent bitmap)即为设备无关位图。 (2)DDB中不包括颜色信息,显示时是系统的调色板为基础进行各位的颜色映射的...
  • BMP图像格式学习

    2013-09-30 11:30:49
    对应数据结构 1:BMP文件组成 BMP文件由文件头、位图信息头、颜色信息和...BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 其结构定义如下: 1 2 3 4 5 6 7 8 9 10 11 12
  • BMP图像介绍

    2019-09-02 11:15:49
    上个周老师让我们用C++读取一张BMP图片(并显示),本文主要介绍的是读取BMP文件,至于显示,是一些其他知识,就不在这里展开。 首先BMP文件的主要结构: file header - allBMPimages starts with a five elements...
  • bmp图像旋转算法

    千次阅读 2019-04-25 18:36:56
      在图像处理,图形学、计算机视觉中,我们经常能够见到bmp这种格式的图片;那么对于我们来说想要处理这种图片,首先就应当了解这种图片,知己知彼方能百战不殆。   那么首先我们来了解一下bmp格式的图片: 一...
  • 彩色(24位)bmp图像结构: typedef struct{ bitmapFileHeader bfHeader; bitmapInfoHeader biHeader; unsigned char *imgData; }bmp; 灰度(8位)bmp图像结构: typedef struct{ bitmapFileHeader bfHeader; ...
  • BMP图像的结构及读写和灰度化

    千次阅读 2014-03-29 17:03:30
    本文档主要给出24位真彩BMP图像的结构、读写和灰度化方法。 2.一般BMP图像的结构 一般的bmp文件的结结构主要包括文件头,BMP信息头,调色板,位图数据内容 (1)BMP文件头(14字节) ,文件的第0字节到第13字节为BMP...
  • 图像大小怎么计算

    千次阅读 2021-02-24 15:30:55
    之前没有怎么注意图像大小计算,粗略的认为从【图像】到【电子图像】是经过了【采集】-【量化】-【编码】,究竟怎么计算还真没仔细想过 那么量化究竟是怎么一个【量化】法呢? 首先,图片大小的存储基本单位是...
  • C语言读取bmp图像并做简单显示

    千次阅读 2020-10-20 19:46:00
    C语言读取bmp图像信息并做简单显示)bmp文件格式读取bmp文件信息并展示 bmp文件格式 bmp文件大体上分为四个部分: bmp文件构成 位图文件头BITMAPFILEHEADER 位图信息头BITMAPINFOHEADER 调色板Palette ...
  • stm32 读取bmp图像的信息 分类:嵌入式 2011-07-04 17:14:51 在sd卡文件系统下读取bmp图像和显示是比较容易的,为了给jpeg解码提供一个过程,这里我先介绍一下bmp的读取方式 这里主要是介绍读取bmp信息的...
  • BMP图像文件结构

    千次阅读 2010-12-16 15:18:00
     典型的BMP图像文件由四部分组成:  1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;  2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,868
精华内容 1,547
关键字:

bmp图像大小计算公式