精华内容
下载资源
问答
  • 位图文件格式

    千次阅读 2011-12-14 00:30:45
    一、位图文件结构 位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据 1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义: typedef struct tagBITMAPFILEHEADER { // ...

    一、位图文件结构

    位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据

    1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:

    typedef struct tagBITMAPFILEHEADER { // bmfh 
        WORD    bfType; 
        DWORD   bfSize; 
        WORD    bfReserved1; 
        WORD    bfReserved2; 
        DWORD   bfOffBits; 
    } BITMAPFILEHEADER;
    其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小。
    2、位图信息 中所记录的值用于分配内存,设置调色板信息,读取像素值等。
    以下是位图信息结构的定义:

    typedef struct tagBITMAPINFO {
        BITMAPINFOHEADER    bmiHeader;
        RGBQUAD             bmiColors[1];
    } BITMAPINFO;

    可见位图信息也是由两部分组成的:位图信息头 + 颜色表



    2.1位图信息头。 位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:
    typedef struct tagBITMAPINFOHEADER{ // bmih 
        DWORD  biSize; 
        LONG   biWidth; 
        LONG   biHeight; 
        WORD   biPlanes; 
        WORD   biBitCount 
        DWORD  biCompression; 
        DWORD  biSizeImage; 
        LONG   biXPelsPerMeter; 
        LONG   biYPelsPerMeter; 
        DWORD  biClrUsed; 
        DWORD  biClrImportant; 
    } BITMAPINFOHEADER; 

    下表是对结构体当中各个成员的说明: 
    结构成员说 明
    biSize结构BITMAPINFOHEADER的字节数,即sizeof(BITMAPINFOHEADER)*
    biWidth以像素为单位的图像宽度*
    biHeight以像素为单位的图像长度*
    biplanes目标设备的位平面数
    biBitCount每个像素的位数*(1)
    biCompression图像的压缩格式(这个值几乎总是为0)
    biSizeImage以字节为单位的图像数据的大小(对BI_RGB压缩方式而言)
    biXPelsPermeter水平方向上的每米的像素个数
    biYpelsPerMeter垂直方向上的每米的像素个数
    biClrused调色板中实际使用的颜色数(2)
    biClrImportant现实位图时必须的颜色数(3)

    说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量
    (1)对于每个像素的字节数,分别有一下意义:
    0,用在JPEG格式中
    1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片
    4,16色图
    8,256色图,通常说的灰度图
    16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量
    24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量
    32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式

    (2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色树木小于制定的颜色深度的颜色数目的最大值。

    (3)这个值通常为0,表示所有的颜色都是必需的

    2.2颜色表。颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。

    下图是带调色板和不带调色板的位图的简单示意图

    图1 带调色板和不带调色板位图之间的区别

    颜色表是由颜色表项组成的,颜色表项结构的定义如下:

    typedef struct tagRGBQUAD { // rgbq 
        BYTE    rgbBlue; 
        BYTE    rgbGreen; 
        BYTE    rgbRed; 
        BYTE    rgbReserved; 
    } RGBQUAD;

     
    其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。 
    

    3、位图数据。最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:位图数据。根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个像素,对于16位位图,每两个字节代表了一个像素,对于24位位图,每三个字节代表了一个像素,对于32位位图,每四个字节代表了一个像素。

    展开全文
  • BMP位图文件格式

    2015-05-11 20:14:52
    简洁明了的介绍了BMP位图格式,以及获取不同位图颜色分量的方式。
  • Windows位图文件格式

    2011-06-21 15:40:00
    Windows位图文件格式 位图概述位图格式位图文件头结构包含关于类型,大小以及与设备无关的文件层。typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; ...

    Windows位图文件格式

     

    位图概述

    位图格式
    位图文件头
    结构包含关于类型,大小以及与设备无关的文件层。
    typedef struct tagBITMAPFILEHEADER {
      WORD bfType; 
      DWORD bfSize; 
      WORD bfReserved1; 
      WORD bfReserved2; 
      DWORD bfOffBits; 
    } BITMAPFILEHEADER;

    typedef struct tagBITMAPINFOHEADER { 
      DWORD biSize;                        // 大小
      LONG biWidth;                        // 宽度
      LONG biHeight;                       // 高度
      WORD biPlanes;                       // 平面?
      WORD biBitCount                      // 为个数
      DWORD biCompression;                 // 压缩
      DWORD biSizeImage;                   // 图像大小
      LONG biXPelsPerMeter;                // 每公尺X上的像素
      LONG biYPelsPerMeter;                // 每公尺Y上的像素
      DWORD biClrUsed;                     // ???
      DWORD biClrImportant;                // ???
    } BITMAPINFOHEADER; 
    位图信息头

    该结构体包含关于与颜色格式相关的设备无关位图。

    指定的颜色表内的颜色索引,该索引是在位土内被使用的。如果这个值是零。
    如果biClrUsed是非零值且biBitCount值小于16, biClrUsed成员指定实际图形引擎或设备驱动的存取值。
    biClrImportant被指定的颜色索引必须显示在位图上。
    如果颜色值是零,所有颜色是必须的。

     

     

    目录

    位图格式分析

    一.位图文件存储格式

    二.BitmapFileHeader

    三.BitmapInfo

    四.BitmapInfoHeader

    五.BitmapData

    六.保存位图为文件

    1. 错误信息函数

    2. 建立位图信息结构体函数

    3. 建立位图文件函数

    4. 保存位图到文件函数

    七.从文件加载位图

    1.错误信息函数

    2. 从位图文件加载图象函数

     

    一.位图文件存储格式

    位图文件存储格式请参考图1.1。

     

    图1.1 位图文件存储格式

    图说明请参考表1.1。

    表1.1 位图文件存储格式说明

    结构体

    说明

    BitmapFileHeader

    位图文件信息头

    BitmapInfo

    位图信息,由以下两个结构体组成

    BitmapInfoHeader

    位图信息头

    RGBQUAD

    颜色表

    BitmapData

    位图数据

    二.BitmapFileHeader

    typedef struct tagBITMAPFILEHEADER { // bmfh

        WORD    bfType;

        DWORD   bfSize;

        WORD    bfReserved1;

        WORD    bfReserved2;

        DWORD   bfOffBits;

    } BITMAPFILEHEADER;

    bfType:文件类型,0x4d42,也就是BM

    bfSize:文件大小,计算方法是
    位图文件头大小【sizeof(BITMAPFILEHEADER)】
    +位图信息头大小【pbih->biSize】
    +颜色表大小【pbih->biClrUsed*sizeof(RGBQUAD)】
    +位图数据大小【pbih->biSizeImage】

    bfReserved1:预留字段,为0。

    bfReserved2:预留字段,为0。

    bfOffBits:图象数据的偏移量,计算方法是
    位图文件头大小【sizeof(BITMAPFILEHEADER)】
    +位图信息头大小【pbih->biSize】
    +颜色表大小【pbih->biClrUsed*sizeof(RGBQUAD)】

     

    三.BitmapInfo

    typedef struct tagBITMAPINFO { // bmi

        BITMAPINFOHEADER bmiHeader;

        RGBQUAD          bmiColors[1];

    } BITMAPINFO;

    bmiHeader:位图信息头,见下节的结构体说明。

    bmiColors:RGB颜色表数组。一般不存储到位图,在GetDIBits时将丢失这个信息,biClrUsed将被设置为0。

     

    四.BitmapInfoHeader

    typedef struct tagBITMAPINFOHEADER{ // bmih

        DWORD biSize;

        LONG   biWidth;

        LONG   biHeight;

        WORD   biPlanes;

        WORD   biBitCount

        DWORD biCompression;

       DWORD biSizeImage;

        LONG   biXPelsPerMeter;

        LONG   biYPelsPerMeter;

        DWORD biClrUsed;

        DWORD biClrImportant;

    } BITMAPINFOHEADER;

    biSize:结构体大小。

    biWidth:位图宽度,象素。对应位图宽度,bmp.bmWidth。

    biHeight:位图高度,象素。对应位图高度,bmp.bmHeight。

    biPlanes:调色板数目,一般是1。对应位图调色板数目,bmp.bmPlanes。

    biBitCount:颜色位数。对应位图bmp.bmBitsPixel。

    biClrUsed:使用的颜色数,在24位以下时需要使用,计算方法
    if(cClrBits < 24) pbmi->bmiHeader.biClrUsed=(1<<cClrBits);

    biSizeImage:图象数据大小,计算方法
    位图宽度象素数目转换成字节【(pbmi->bmiHeader.biWidth+7)/8】
    *位图高度象素数目【pbmi->bmiHeader.biHeight】
    *象素位数【cClrBits】

    注:宽度象素数目+7再除以8,用来处理余数的情况,如位图宽度为2,除以8为0,所以要+7再除以8。

    五.BitmapData

    24位位图图象数据的存储是RGB序列,在windows中是BGR序列:

    象素B蓝色分量值

    象素G绿色分量值

    象素R红色分量值

    32位位图象素数据的存储是RGBA序列,A是Alpha值,windows是BGRA序列:

    象素B蓝色分量值

    象素G绿色分量值

    象素R红色分量值

    象素alpha分量值

    16位图象的分布是:

    最高位保留,为0

    高5位,红色分量

    中间5位,绿色分量

    最低5位,蓝色分量

     

    六.保存位图为文件

    可以将程序中的图象保存为文件,具体代码如下:

    1. 错误信息函数

    //错误信息

    void exitWND(LPCTSTR msg)

    {

         MessageBox(NULL,msg,"Error",0);

         exit(0);

    }

    2. 建立位图信息结构体函数

    //建立位图信息结构体

    PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp)

    {

         BITMAP bmp;

         if(!GetObject(hBmp,sizeof(BITMAP),&bmp))

             exitWND("Error when get object from hbitmap");

         //获取颜色位数

         WORD cClrBits;

         cClrBits=(WORD)(bmp.bmPlanes*bmp.bmBitsPixel);

         if(cClrBits == 1)

             cClrBits=1;

         else if(cClrBits <= 4)

             cClrBits=4;

         else if(cClrBits <= 8)

             cClrBits=8;

         else if(cClrBits <= 16)

             cClrBits=16;

         else if(cClrBits <= 24)

             cClrBits=24;

         else cClrBits=32;

         //分配位图信息结构体

         PBITMAPINFO pbmi;

         if(cClrBits != 24)

             pbmi=(PBITMAPINFO)

             LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cClrBits));

         else

             pbmi=(PBITMAPINFO)

             LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));                           

         //初始化位图结构体

         pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

         pbmi->bmiHeader.biWidth=bmp.bmWidth;

         pbmi->bmiHeader.biHeight=bmp.bmHeight;

         pbmi->bmiHeader.biPlanes=bmp.bmPlanes;

         pbmi->bmiHeader.biBitCount=bmp.bmBitsPixel;

         if(cClrBits < 24)

             pbmi->bmiHeader.biClrUsed=(1<<cClrBits);

         //不压缩位图

         pbmi->bmiHeader.biCompression=BI_RGB;

         //初始化图象数据大小

         pbmi->bmiHeader.biSizeImage=

             (pbmi->bmiHeader.biWidth+7)/8

             *pbmi->bmiHeader.biHeight

             *cClrBits;

         //所有的设备颜色都重要

         pbmi->bmiHeader.biClrImportant=0;

         //返回指针

         return pbmi;

    }

    3. 建立位图文件函数

    //建立位图文件

    void CreateBMPFile(LPTSTR pszFile,PBITMAPINFO pbi,HBITMAP hBmp,HDC hDC)

    {

         PBITMAPINFOHEADER pbih=(PBITMAPINFOHEADER)pbi;

         LPBYTE lpBits;

         lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);

         if(!lpBits)

             exitWND("error to global alloc memory");

         //获取位图图象数据

         GetDIBits(hDC,hBmp,0,(WORD)pbih->biHeight,lpBits,pbi,DIB_RGB_COLORS);

         //建立位图文件

         HANDLE hf;

         hf=CreateFile(pszFile,GENERIC_READ|GENERIC_WRITE,

             NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

         if(hf == INVALID_HANDLE_VALUE)

             exitWND("error to create file");

         //建立位图文件信息头

         BITMAPFILEHEADER hdr;

         hdr.bfType=0x4d42;

         hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+

             pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD)+

             pbih->biSizeImage);

         hdr.bfReserved1=0;

         hdr.bfReserved2=0;

         //计算位图数据偏移量

         hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+

             pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD);

         //写入位图文件头

         DWORD wt;

         if(!WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),&wt,NULL))

             exitWND("error when write bitmap file header");

         //写入位图信息头

         if(!WriteFile(hf,(LPVOID)pbih,

             sizeof(BITMAPINFOHEADER)+pbih->biClrUsed*sizeof(RGBQUAD),

             &wt,NULL))

             exitWND("error when write bitmap info header and RGBquad");

         //写入位图数据

         if(!WriteFile(hf,(LPVOID)lpBits,pbih->biSizeImage,&wt,NULL))

             exitWND("error when write data");

         //关闭文件

         if(!CloseHandle(hf))

             exitWND("error when close file handle");

         //释放图象数据所占内存

         GlobalFree(lpBits);

    }

    4. 保存位图到文件函数

    //保存位图到文件

    void SaveBitmapFile(LPTSTR fileName,HWND hWnd,HBITMAP bmp)

    {

         PBITMAPINFO pbmi;

         pbmi=CreateBitmapInfoStruct(bmp);

         HDC hdc;

         hdc=GetDC(hWnd);

         CreateBMPFile(fileName,pbmi,bmp,hdc);

         ReleaseDC(hWnd,hdc);

    }

     

    七.从文件加载位图

    从文件加载位图,用ReadFile定位文件需要使用OVERLAPPED,展开位图到DC使用StretchDIBits函数。代码如下:

    1.错误信息函数

    //错误信息

    void exitWND(LPCTSTR msg)

    {

         MessageBox(NULL,msg,"Error",0);

         exit(0);

    }

    2. 从位图文件加载图象函数

    //从位图文件加载图象

    HBITMAP LoadBitmapFile(LPCTSTR fileName,HWND hWnd)

    {

         //打开文件

         HANDLE hf;

         hf=CreateFile(fileName,GENERIC_READ,FILE_SHARE_READ,

             NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);

         if(hf == INVALID_HANDLE_VALUE){

             exitWND("error when open file handle");

             return 0x00;

         }

         //展开位图文件到DC

         DWORD read;

         //读取文件信息头

         BITMAPFILEHEADER bfh;

         OVERLAPPED olbfh;

         memset(&olbfh,0,sizeof(OVERLAPPED));

         olbfh.Offset=0;

         ReadFile(hf,&bfh,sizeof(bfh),&read,&olbfh);

         //读取位图信息

         BITMAPINFO bi;

         OVERLAPPED olbi;

         memset(&olbi,0,sizeof(OVERLAPPED));

         olbi.Offset=sizeof(BITMAPFILEHEADER);

         ReadFile(hf,&bi.bmiHeader,sizeof(bi.bmiHeader),&read,&olbi);

         //读取位图数据

         LPBYTE lpBits;

         lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,bi.bmiHeader.biSizeImage);

         OVERLAPPED ollpbits;

         memset(&ollpbits,0,sizeof(OVERLAPPED));

         ollpbits.Offset=bfh.bfOffBits;

         ReadFile(hf,lpBits,bi.bmiHeader.biSizeImage,&read,&ollpbits);

         //建立和窗口关联的DC

         HDC hdc;

         hdc=GetDC(hWnd);

         HDC mem;

         mem=CreateCompatibleDC(hdc);

         //建立和DC关联的位图

         HBITMAP bmp;

         bmp=CreateCompatibleBitmap(hdc,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight);

         SelectObject(mem,bmp);

         //在DC中展开

         StretchDIBits(mem,

             0,0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight,

             0,0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight,

             (LPVOID)lpBits,&bi,DIB_RGB_COLORS,SRCCOPY);

         //清理工作

         GlobalFree(lpBits);

         DeleteDC(mem);

         ReleaseDC(hWnd,hdc);

         CloseHandle(hf);

         //返回位图对象

         return bmp;

    }


    展开全文
  • Bmp位图文件格式详解

    2011-01-09 10:54:09
    该文文档中介绍了Bmp图像的完整格式!欢迎各爱好者下载使用,另外本人还写了个简单的图像分析软件:BMPAnalyzer
  • BMP位图文件格式分析今天实验课主要要做BMP格式的文件解析。参照着学姐(长)的代码,将BMP文件按二进制格 式读到内存中。 所用的图片是一张25*25的全白色图片,由于背景图也为白色,就不上图了 首先对位图做一个...

    BMP位图文件格式分析

    今天实验课主要要做BMP格式的文件解析。参照着学姐(长)的代码,将BMP文件按二进制格
    式读到内存中。
    所用的图片是一张25*25的全白色图片,由于背景图也为白色,就不上图了
    首先对位图做一个解释

    BMP文件格式

    图片描述
    BMP文件格式由文件头,位图信息段,调色板信息(如果有的话),位图数据RGB像素或索引数据组成
    由此,可以知道位图文件的代码可以这么表示:

    typedef struct tagBITMAP_FILE {
    
        BITMAPFILEHEADER bitmapheader;
        BITMAPINFOHEADER bitmapinfoheader;
        PALETTEENTRY palette[256];
        UCHAR *buffer;   //UCHAR 大小1字节(同BYTE), 在VC6下
    
    } BITMAP_FILE;

    BMP文件头:BITMAPFILEHEADER bitmapheader

    typedef struct tagBITMAPFILEHEADER {
        WORD    bfType; 
        DWORD   bfSize; 
        WORD    bfReserved1; 
        WORD    bfReserved2; 
        DWORD   bfOffBits; 
    } BITMAPFILEHEADER;
    • bfType:表明文件类型,位图文件设置为”BM”,占用一个字的存储空间
    • bfSize:表明文件大小,占用两个字的存储空间
    • bfReserved1:保留字,占用一个字的存储空间
    • bfReserved2:保留字,占用一个字的存储空间
    • bfOffBits:从文件头位置到图像数据位置的偏移量。占用两个字的存储空间

    文件头的大小总共7个字,共14字节

    以下是我那张25*25纯白色的图的详细信息以及通过程序解析得到的数据
    图片描述
    图片描述

    • 其中42 4d是文件类型,查阅ASCII表可得到BM
    • 00 00 07 a2表明文件大小为1954字节
    • 00 00 00 00是两个保留字
    • 00 00 00 36是偏移量,大小为54字节(我数了一下,文件头开始偏移54字节,刚好到第一个ff的位置)

    位图信息段

    typedef struct tagBITMAPINFOHEADER { // bmih 
        DWORD  biSize;
        LONG   biWidth;
        LONG   biHeight;
        WORD   biPlanes;
        WORD   biBitCount;
        DWORD  biCompression;
        DWORD  biSizeImage;
        LONG   biXPelsPerMeter;
        LONG   biYPelsPerMeter;
        DWORD  biClrUsed;
        DWORD  biClrImportant;
    } BITMAPINFOHEADER;
    • biSize:说明BITMAPINFOHEADER所需要的字节数。占用2个字
    • biWidth:说明图像的宽度。占用2个字
    • biHeight:说明图像的高度。占用2个字
    • biPlanes:表示BMP图像的平面属性。由于显示器只有一个平面,顾恒等于1。占用1个字
    • biBitCount:说明比特数,其值位1/4/8/16/24或32。占用1个字
    • biCompression:说明图像数据压缩的类型。占用2个字
      • BI_RGB:没有压缩
      • BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复像素和颜色索引)
      • BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
      • BI_BITFIELDS:每个象素的比特由指定的掩码决定。
      • BI_JPEG:JPEG格式
    • biSizeImage:说明图像的大小,以字节为单位。当用BI_RGB格式时,可设置为0。占用2个字
    • biXPelsPerMeter:说明水平分辨率,用像素/米表示。占用2个字
    • biYPelsPerMeter:说明竖直分辨率,用像素/米表示。占用2个字
    • biClrUsed:说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。占用2个字
    • biClrImportant:说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。占用2个字

    总共使用20个字,共40字节。

    到目前为止,文件头和位图信息总共使用了14+40=54字节。因此文件首部到图像数据位置总共偏移了54字节

    以下是我那张白色25*25的图片的位图信息
    图片描述

    • biSize:00 00 00 28,大小为40,表明位图信息字段占了40字节
    • biWidth:00 00 00 19,大小为25,表明位图宽度为25像素
    • biHeight:00 00 00 19,大小为25,表明位图高度为25像素
    • biPlanes:00 01,大小为1,表明这张图只有一个平面
    • biBitCount:00 18,大小为24,这是24位位图
    • biCompression:00 00 00 00,表示没有压缩
    • biSizeImage:00 00 07 6c,1900字节,表示图像的大小信息,计算方法是25*25*3+25
            每一个像素的颜色信息占3个字节,为了对齐在末尾补了0,多了25字节。
    • biXPlsPerMeter:00 00 00 00
    • biYPlsPerMeter:00 00 00 00
    • biClrUsed:00 00 00 00;为0表明没有使用调色板
    • biClrImportant:00 00 00 00;表明都很重要

    图像信息段

    接下里要展示最精彩的部分了,那就是位图的颜色信息字段。(虽然我用的25*25的白色位图都是白色,但是不会影响分析质量)
    这张图便显示了这张位图的所有颜色信息
    图片描述
    直接从这里分析确实不好看,我把它们复制出来就好看多了。
    图片描述
    图片太多,就不一一列举了。
    从中我们可以发现,25个 ff ff ff,表示白色。最后添一个0是为了对齐,凑成4的倍数
    如果把biWidth设置为4的倍数就不会出现这种问题,不信你看,这是32*25的白色图片
    图片描述

    为什么需要对齐

      这是由于Windows在进行行扫描的时候最小单位为4个字节
    所以当图片宽X每个像素的字节数MOD4!=0时,以0填充。

    这张图有没有调色板

      显然没有,因为我们这张BMP是24位真彩色的BMP,所谓真彩色图(true color),就是它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用R、G、B三个分量字节表示,而不采用调色板技术。原因很明显:如果用调色板,表示一个象素也要用24位,这是因为每种颜色的索引要用24位(因为总共有256×256×256种颜色,即调色板有256×256×256行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256×256×256×3个字节的大调色板。所以真彩色图直接用R、G、B三个分量表示,它又叫做24位色图。

    代码

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<fstream>
    using namespace std;
    unsigned char binaryData[256*1024];
    int main() {
        string str;
        ifstream fin("***\\white.bmp", ios::binary|ios::app);//自己弄自己的文件吧
        int length;
        int length_sum = 0;
        while (getline(fin, str)) {
            length = str.length();
            memcpy(binaryData+length_sum, str.c_str(), length);
            length_sum += length;
        }
        int count = 0;
        for (int i = 0; i < length_sum; i++,count++) {
            if (count > 0 && count % 16 == 0)
                cout << endl;
            cout << hex << (int)(binaryData[i]) << " ";
        }
        fin.close();
        return 0;
    }


    Copyright© by 寒江雪
    QQ:211392413
    Email:211392413@qq.com
    Date:2016-11-23

    展开全文
  • 几种位图文件格式

    千次阅读 2004-10-27 15:01:00
    bmp文件 bmp(bitmap的缩写)文件格式是windows本身的位图文件格式,所谓本身是指windows内部存储位图即采用这种格式。一个.bmp格式的文件通常有.bmp的扩展名,但有一些是以.rle为扩展名的,rle的意思是行程长度编码...

     bmp文件

      bmp(bitmap的缩写)文件格式是windows本身的位图文件格式,所谓本身是指windows内部存储位图即采用这种格式。一个.bmp格式的文件通常有.bmp的扩展名,但有一些是以.rle为扩展名的,rle的意思是行程长度编码(runlengthencoding)。这样的文件意味着其使用的数据压缩方法是.bmp格式文件支持的两种rle方法中的一种。

      bmp文件可用每象素1、4、8、16或24位来编码颜色信息,这个位数称作图象的颜色深度,它决定了图象所含的最大颜色数。一幅1-bpp(位每象素,bitperpixel)的图象只能有两种颜色。而一幅24-bpp的图象可以有超过16兆种不同的颜色。

      下一页的图说明了一个典型.bmp文件的结构。它是以256色也就是8-bpp为例的,文件被分成四个主要的部分:一个位图文件头,一个位图信息头,一个色表和位图数据本身。位图文件头包含关于这个文件的信息。如从哪里开始是位图数据的定位信息,位图信息头含有关于这幅图象的信息,例如以象素为单位的宽度和高度。色表中有图象颜色的rgb值。对显示卡来说,如果它不能一次显示超过256种颜色,读取和显示.bmp文件的程序能够把这些rgb值转换到显示卡的调色板来产生准确的颜色。

      bmp文件的位图数据格式依赖于编码每个象素颜色所用的位数。对于一个256色的图象来说,每个象素占用文件中位图数据部分的一个字节。象素的值不是rgb颜色值,而是文件中色表的一个索引。所以在色表中如果第一个r/g/b值是255/0/0,那么象素值为0表示它是鲜红色,象素值按从左到右的顺序存储,通常从最后一行开始。所以在一个256色的文件中,位图数据中第一个字节就是图象左下角的象素的颜色索引,第二个就是它右边的那个象素的颜色索引。如果位图数据中每行的字节数是奇数,就要在每行都加一个附加的字节来调整位图数据边界为16位的整数倍。

      并不是所有的bmp文件结构都象表中所列的那样,例如16和24-bpp,文件就没有色表,象素值直接表示rgb值,另外文件私有部分的内部存储格式也是可以变化的。例如,在16和256色.bmp文件中的位图数据采用rle算法来压缩,这种算法用颜色加象素个数来取代一串颜色相同的序列,而且,windows还支持os/2下的.bmp文件,尽管它使用了不同的位图信息头和色表格式。

      pcx文件

      .pcx是在pc上成为位图文件存储标准的第一种图象文件格式。它最早出现在zsoft公司的paintbrush软件包中,在80年代早期授权给微软与其产品捆绑发行,而后转变为microsoftpaintbrush,并成为windows的一部分。虽然使用这种格式的人在减少,但这种带有.pcx扩展名的文件在今天仍是十分常见的。

      pcx文件分为三部分,依次为:pcx文件头,位图数据和一个可选的色表。文件头长达128个字节,分为几个域,包括图象的尺寸和每个象素颜色的编码位数。位图数据用一种简单的rle算法压缩,最后的可选色表有256个rgb值,pcx格式最初是为cga和ega来设计的,后来经过修改也支持vga和真彩色显示卡,现在pcx图象可以用1、4、8或24-bpp来对颜色数据进行编码。

      tiff文件

      pcx格式是所有位图文件格式中最简单的,而tiff(taggedimagefileformat)则是最难的一种。

      tiff文件含有.tif的扩展名。它以8字节长的图象文件头开始(ifh),这个文件头中最重要的成员是一个指向名为图象文件目录(ifd)的数据结构的指针。ifd是一个名为标记(tag)的用于区分一个或多个可变长度数据块的表,标记中含有关于图象的信息。tiff文件格式定义70多种不同类型的标记,有的用来存放以象素为单位的图象宽度和高度,有的用来存放色表(如果需要的话),当然还必须有用来存放位图数据的标记,一个tiff格式文件完全为它的标记所决定,而且这种文件结构极易扩展,因为你要附加一些特征只须增加一些额外的标记。

      究竟是什么使tiff文件如此复杂?一方面,要写一种能够识别所用不同标记的软件非常困难。大多数tiff的阅读程序只能识别一部分标记,所以会出现这种情况:有时一个应用程序创建的tiff文件,另一个应用程序却不能使用。创建tiff文件的程序还可能会在文件中加一些只有它自己认识的标记,虽然tiff的阅读程序可以跳过那些它们不认得的标记,但这样做总是有可能影响到图象的质量。

      另一方面,一个tiff文件可以包含多个图象,每个图象都有自己的ifd和一系列标记。tiff文件中的位图数据可能会用好几种方法来压缩,所以一个完备的tiff阅读程序应该有rle解压缩程序,lzw解压缩程序和其他一些算法的解压缩程序。然而更糟的是使用lzw的解码必须得到unisys公司的同意,且通常是需要付版税的。所以即使是一些相当不错的tiff阅读程序在它们遇到lzw算法压缩的图象时也是无能为力的。

      尽管tiff是那么的复杂,但仍是一种最好的跨平台格式。因为它非常灵活,无论在视觉上还是其他方面,都能把任何图象编码成二进制形式而不丢失任何属性。

      gif文件

      当许多图象方面的权威一想到lzw的时候,他们也会想到gif(graphicsinterchangeformat,读作jiff)这是一种常用的跨平台的位图文件格式,最初为compuserve公司所创。gif文件通常带有.gif的扩展名,而且在compuseve上大量存在。

      gif文件的结构取决于它属于哪一个版本,目前的两种版本分别是gif87a和gif89a,前者较简单。无论是哪个版本,它都以一个长13字节的文件头开始,文件头中包含判定此文件是gif文件的标记、版本号和其他的一些信息。如果这个文件只有一幅图象,文件头后紧跟一个全局色表来定义图象中的颜色。如果含有多幅图象(gif和tiff格式一样,允许在一个文件里编码多个图象),那么全局色表就被各个图象自带的局部色表所替代。

      在gif87a文件中,文件头和全局色表之后是图象,它可能会是头尾相接的一串图象中的第一个,每个图象由三部分组成,一个10字节长的图象描述,一个可选的局部色表和位图数据。为有效利用空间,位图数据用lzw算法来压缩。

      gif89a结构与此类似,但它还包括可选的扩展块来存放每个图象的附加信息。gif89a详细定义了四种扩展块:图象控制扩展块,它用来描述图象怎样被显示(例如,显示是应该象一个透明物去覆盖上一个图象,还是简单的替换它);简单文本扩展块,它包含显示在图象中的文本;注释扩展块,它以ascii文本形式存放注释;应用扩展块,它存放生成该文件的应用程序的私有数据。这些扩展块可以出现在文件中全局色表的任何地方。

      gif最显著的优点是它的广泛使用和它的紧密性。但它有两个弱点,一个是用gif格式存放的文件最多只能含有256种颜色。另一个可能更重要,就是那些使用了gif格式的软件开发者必须征得compuserve的同意,他们每卖出一个拷贝都要向compuserve付版税。这个政策是compuserve仿效unisys公司作出的,它抑制了那些程序员在他的图象应用程序中支持gif文件。

      png文件

      png(portablenetworkgraphic,发音做ping)文件格式是作为gif的替代品开发的,它能够避免使用gif文件所遇到的常见问题。它从gif那里继承了许多特征,而且支持真彩色图象。更重要的是,在压缩位图数据时它采用了一种颇受好评的lz77算法的一个变种,lz77则是lzw的前身,而且可以免费使用。由于篇幅所限,在这里就不花时间来具体讨论png格式了。

      jpeg文件

      jpeg(jointphotographicexpertsgroup,发音做jay-peg)文件格式最初由c-cubemicrosystems推出,是为了提供一种存储深度位象素的有效方法,例如对于照片扫描,颜色很多而且差别细微(有时也不细微)。jpeg和这里讨论的其他格式的最大区别是jpeg使用一种有损压缩算法,无损压缩算法能在解压后准确再现压缩前的图象,而有损压缩则牺牲了一部分的图象数据来达到较高的压缩率。但是这种损失很小以至于人们很难察觉。

      jpeg图象压缩是一个复杂的过程,经常需要专门的硬件来帮助。首先图象以象素为单位分成8*8的块。然后,每个块分三个步骤被压缩。第一步使用dct(discretecosinetransform)离散余弦变换把8*8的象素矩阵变成8*8的频率(也就是颜色改变的速度)矩阵。第二步对频率矩阵中的值用量化矩阵进行量化,滤掉那些总体上对图象不重要的部分。第三步,也就是最后一步,对量化后的频率矩阵使用无损压缩。

      因为被量化后的频率矩阵缺了许多高频信息,通常能被压缩到一半甚至更少。无损压缩一般根本不能压缩真正的照片图象,所以50%的压缩率已是相当不错了,但另一方面,无损压缩能把一些图象文件尺寸减少90%,这样的图象文件就不适合用jpeg来压缩。

      jpeg的有损部分产生在第二步,量化矩阵的值越高,从图象中丢掉的信息就越多,从而压缩率就越高,可是同时图象的质量就越差。在jpeg压缩时可以选择一个量化因子,这个因子的值决定了量化矩阵中的数值。理想的量化因子要在压缩率和图象质量间达到平衡,所以对不同的图象要选择不同的量化因子,通常要经过若干次尝试后方可确定。

    展开全文
  • bmp位图文件格式

    千次阅读 2006-06-10 09:51:00
    最近在做视频数据采集,要求将采集到的数据...BMP 格式支持 RGB、索引颜色、灰度和位图颜色模式。可以为图像指定 Windows 或 OS/2? 格式和位深度。对于使用 Windows 格式的 4 位和 8 位图像,还可以指定 RLE 压缩。 BM
  • Windows位图文件格式[转]

    千次阅读 2008-11-14 15:27:00
    位图概述位图格式位图文件头结构包含关于类型,大小以及与设备无关的文件层。typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } ...
  • 位图文件

    2018-08-05 13:55:24
    常用的位图文件格式有   BMP格式不采用其他任何压缩, 所以BMP文件所占用的空间很大, 但图像中的资料不会被丢失. JPEG格式可以把文件压缩到最小, 图像中重复或不重要的资料会被丢失. GIF格式支持透明度、压缩...
  • 详细的BMP(位图)文件格式解析,对BMP文件的读取操作编程具有很大帮助.
  • 位图文件, JPG格式,PNG格式

    千次阅读 2015-07-23 09:49:54
    位图文件是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8...
  • 位图文件的存储格式

    千次阅读 2011-12-01 18:04:33
    摘 要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在程序中实现了一种存储格式到另一种存储格式的转换。 关键字:BMP、灰度...
  • RFC797 位图文件格式

    千次阅读 2004-08-18 10:27:00
    ... ... 译者:郭大刚(guodagang guodagang@163.net) 译文发布时间:2002-1-9 版权:本中文翻译文档版权归中国互动出版网所有。...RFC797——FORMAT FOR BITMAP FILES 位图文件格式 1 RFC文档中文翻译计划
  • 位图(bmp)文件格式分析

    万次阅读 2014-05-14 11:42:46
    位图(bmp)文件格式分析 作者:深蓝(由博主分享) 一、什么是位图 计算机能以位图和矢量图格式显示图像。 1、位图(Bitmap): 图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述...
  • 一个可查看位图数据信息的软件。并可将32或24位位图转换为24位或16位BMP格式,以及C语言数组格式。 bootloader 或是单片机显示图片时,经常需要将图片信息,转换成C数组。use it freely
  • 实现位图文件转化为JPEG文件 实现位图文件转化为JPEG文件 实现位图文件转化为JPEG文件 实现位图文件转化为JPEG文件
  • BMP位图文件的存储格式

    千次阅读 2009-01-23 15:36:00
    摘 要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在程序中实现了一种存储格式到另一种存储格式的转换。关键字:BMP、灰度位图...
  • ANDROID平台,从SD卡中读取解析原始的RGB565图片颜色数据,进行位图显示。
  • BMP位图文件结构.pptx

    2021-04-10 22:20:23
    BMP位图文件结构
  • 实现目录下BMP位图文件批量转换为JPG格式图片文件
  • BMP位图图像格式简介

    2015-01-07 11:48:09
    BMP位图图像格式简介,位图文件结构表,简单举例
  • BMP位图文件解析

    2018-07-20 15:41:49
    步骤:(1) 读取文件信息,以二进制方式打开并读取位图文件信息复制给新的变量后关闭文件;(2) 定义灰色为图文件变量,套用灰度化公式,改变RGB值,将真彩色图像转换为灰色图像;(3) 将转换成的灰色图像存储到...
  • 一、位图文件结构 位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据 1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义: [cpp] view plaincopy ...
  • 本来是打算弄个BadApple玩玩,不过不满足于简单地读取文本文件并输出,所以最后变成了研究如何用C语言读取位图文件并通过二维数组来存储像素信息。 第一步自然是弄清楚bmp的文件格式。在各种位图格式中,bmp因为...
  • 一个可查看位图数据信息的软件。并可将32或24位位图转换为24位或16位BMP格式,以及C语言数组格式。 bootloader 或是单片机显示图片时,经常需要将图片信息,转换成C数组。use it freely
  • 位图文件(BMP)格式分析

    千次阅读 2012-08-29 17:57:54
     Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,293
精华内容 41,717
关键字:

属于位图文件格式的是