精华内容
下载资源
问答
  • VC++对话框模式打开BMP格式图片

    热门讨论 2010-11-23 12:18:27
    打开bmp格式图片 浏览bmp图片 VC++浏览BMP图片 VC++打开bmp图片 VC++显示Bmp位图 并做处理
  • bmp文件的结构比较简单,主要包括文件头,BMP信息头,BMP数据内容。

    原文地址:http://blog.sina.com.cn/s/blog_6612e1860100hckw.html

     

    内容我也没看,保存着先,会的进来看看这个是干啥的。

     

     

    bmp文件的结构比较简单,主要包括文件头,BMP信息头,BMP数据内容。文件头BITMAPFILEHEADER结构为:

      Windows GDI提供了

    typedef struct tagBITMAPFILEHEADER {
      WORD bfType;
      DWORD bfSize;
      WORD bfReserved1;
      WORD bfReserved2;
      DWORD bfOffBits;
      } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
      BMP信息头BITMAPINFO结构为:
      typedef struct tagBITMAPINFO {
      BITMAPINFOHEADER bmiHeader;
      RGBQUAD bmiColors[1];
      } BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
      typedef struct tagBITMAPCOREINFO {
      BITMAPCOREHEADER bmciHeader;
      RGBTRIPLE bmciColors[1];
      } BITMAPCOREINFO, FAR *LPBITMAPCOREINFO, *PBITMAPCOREINFO;
      #include 
      typedef struct tagBITMAPFILEHEADER {
      WORD bfType;
      DWORD bfSize;
      WORD bfReserved1;
      WORD bfReserved2;
      DWORD bfOffBits;
      } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

     

     

     

    一套BMP文字的图片,想把BMP转化为字库,需要去掉BMP的头和BMP信息,只取数据部分,并存为数组,就根据BMP结构,写了如下一个小程序,主要包括文件读写,文件查找等:

     

     

    #include 
      #include 
      #include 
      #include 
      BITMAPFILEHEADER file_head;
      BITMAPINFO fileinfo;
      //把彩色的图转为黑白色,输入源文件名字和转出的文件名字
      #define FONT_WIDTH_1 (28)
      #define FONT_WIDTH_2 (22)
      char * getfilename(char * filename)
      {
      char strResult[128]={0}; //保存结果
      char *temp, *ret;
      temp = filename;
      int nStrLen = strlen(filename); //原始字符串长度
      for(int i = nStrLen; i > 0; i--) //倒查,每个字符和反斜杠对比
      {
      if (filename[i] == '//') //如果当前字符是反斜杠
      {
      //复制倒数第一个斜杠后的数据,并去掉.bmp
      strncpy(strResult, (char *)(temp+i+1), nStrLen-i-1-4);
      break;
      }
      else
      {
      //复制字符串,去掉.bmp
      if (i = 1)
      {
      strncpy(strResult, (char *)temp, nStrLen-4);
      break;
      }
      }
      }
      ret = strResult;
      return (ret);
      }
      #if 1
      char * getfilepath(char * filename)
      {
      char strResult[128] = {0}; //保存结果
      char *temp, *ret;
      temp = filename;
      int nStrLen = strlen(filename); //原始字符串长度
      for(int i = nStrLen; i > 0; i--) //倒查,每个字符和斜杠对比
      {
      if (filename[i] == '//') //如果当前字符是斜杠
      {
      //复制路径,包括斜杠
      strncpy(strResult, (char *)temp, i+1);
      break;
      }
      }
      ret = strResult;
      return (ret);
      }
      #endif
      int colorbmp2bwbmp(char * f_in, char * f_out)
      {
      int infileLen; //文件长度
      int n=0; //n 字节计数器
      unsigned char c,c_in; //C_in文件字节,C转化
      FILE *fh_in;
      FILE *fh_out;
      assert((f_in != NULL) && (f_out != NULL));
      fh_in=fopen(f_in,"rb");
      if (NULL==fh_in)
      {
      printf("open read file error!!");
      return 1;
      }
      fseek(fh_in,0,SEEK_END);
      infileLen=ftell(fh_in);
      fseek(fh_in,0,SEEK_SET);
      
      if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))
      {
      printf("read bmp file error!!");
      fclose(fh_in);
      return 1;
      }
      
      if (file_head.bfType!=0x4d42)
      {
      printf("bmp file error!!");
      fclose(fh_in);
      return 1;
      }
      
      fseek(fh_in,0,SEEK_SET);
      fh_out=fopen(f_out,"wb");
      if (NULL==fh_out)
      {
      printf("open write file error!!");
      return 1;
      }
      
      while((int)file_head.bfOffBits--)
      {
      c_in=getc(fh_in);
      c=c_in;
      putc(c,fh_out);
      }
      
      while (n<(infileLen-(int)file_head.bfOffBits))
      {
      c_in=getc(fh_in);
      c=c_in;
      if (c>0x7f)
      {
      c =0xff;
      }
      else
      {
      c = 0x00;
      }
      putc(c,fh_out);
      n++;
      }
      fclose(fh_in);
      fclose(fh_out);
      return 0;
      }
      //byte转为BIT
      void ByteToBit(char *Out, const char *In, unsigned char bits)
      {
      unsigned char i;
      for(i=0; i 
      {
      Out[i] = (In[i/8]>>(i%8)) & 1;
      }
      }
      //BIT转为byte
      void BitToByte(char * Out, const char *In, unsigned bits)
      {
      unsigned char i;
      memset(Out, 0, (bits+7)/8);
      for(i=0; i 
      {
      Out[i/8] |= In[i]<<(i%8);
      }
      }
      //把位图转为文件,输入bmp文件名和头文件名
      int bmp2headfile(char * bmpfile, char * headfile)
      {
      int infileLen; //文件长度
      int n=0,num=1; //n 字节计数器, NUM换行指示
      unsigned char c, c_in; //C_in文件字节,C转化
      FILE *fh_in;
      FILE *fh_out;
      char com[256]={0};
      char ch[2]={0};
      long wid, hig;
      assert((bmpfile != NULL) && (headfile != NULL));
      fh_in=fopen(bmpfile,"rb");
      if (NULL==fh_in)
      {
      printf("open read file error!!");
      return 1;
      }
      fseek(fh_in,0,SEEK_END);
      infileLen=ftell(fh_in);
      fseek(fh_in,0,SEEK_SET);
      
      if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))
      {
      printf("read bmp file error!!");
      fclose(fh_in);
      return 1;
      }
      
      if (sizeof(fileinfo)!=fread(&fileinfo,1,sizeof(fileinfo),fh_in))
      {
      printf("read bmp file error!!");
      fclose(fh_in);
      return 1;
      }
      
      if (file_head.bfType!=0x4d42)
      {
      printf("bmp file error!!");
      fclose(fh_in);
      return 1;
      }
      fseek(fh_in,file_head.bfOffBits,SEEK_SET);
      fh_out=fopen(headfile,"ab");
      if (NULL==fh_out)
      {
      printf("open write file error!!");
      return 1;
      }
      
      memcpy(ch, getfilename(bmpfile), sizeof(getfilename(bmpfile)));
      wid = fileinfo.bmiHeader.biWidth;
      hig = fileinfo.bmiHeader.biHeight;
      sprintf(com, "", wid, hig, ch);
      fputs(com, fh_out);
      putc(0x0d,fh_out);
      putc('/n',fh_out);
      
      while (n<(infileLen-(int)file_head.bfOffBits))
      {
      putc('0',fh_out);
      putc('X',fh_out);
      c_in=getc(fh_in);
      c=c_in;
      c=(c>>4)&0x0f; //获取高四个BIT的内容
      if (c<0x0a)
      {
      c+=0x30; //把符号转成数字
      }
      else
      {
      c+=0x37; //转成a到f
      }
      putc(c,fh_out);
      c=c_in&0x0f; //获取低四个BIT内容
      if (c<0x0a)
      {
      c+=0x30;
      }
      else
      {
      c+=0x37;
      }
      putc(c,fh_out);
      putc(',',fh_out);
      n++;
      if (num++ % (fileinfo.bmiHeader.biWidth/8 + 1) ==0)
      {
      putc(0x0d,fh_out);
      putc('/n',fh_out);
      }
      }
      putc(0x0d,fh_out);
      putc('/n',fh_out);
      fclose(fh_in);
      fclose(fh_out);
      return 0;
      }
      int main(int argc, char* argv[])
      {
      WIN32_FIND_DATA fd;
      if (argc>2)
      {
      printf("***************位图帮助***************/n");
      printf("bmptofile [drive:][path][filename]");
      return 1;
      }
      else if (argc == 2)
      {
      if (strchr(argv[1], '.')!=NULL)
      {
      bmp2headfile(argv[1], (char *)"font.h");
      }
      else //if (memcmp(argv[1], "/?", sizeof(argv[1])) == 0)
      {
      printf("***************位图帮助***************/n");
      printf("bmptofile [drive:][path][filename]");
      return 1;
      }
      }
      else if (argc == 1)
      {
      HANDLE hd=::FindFirstFile((LPCTSTR)"*.bmp",&fd); //开始查找
      if(hd==INVALID_HANDLE_VALUE)
      {
      printf("没有找到文件");
      return 0;
      }
      bmp2headfile(fd.cFileName, (char *)"font.h");
      while(FindNextFile(hd,&fd)) //继续查找
      {
      bmp2headfile(fd.cFileName, (char *)"font.h");
      }
      FindClose(hd);//关闭查找
      }
      return 0;
      }

    展开全文
  • BMP格式

    千次阅读 2015-08-05 14:15:12
    BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图和设备无关位图,使用非常广泛。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此BMP文件所占用的空间...
    BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图和设备无关位图,使用非常广泛。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此BMP文件所占用的空间很大。BMP文件的图像深度可选1bit、4bit、8bit以及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
    一个BMP文件由四部分组成:

        -     位图文件头:它包含BMP图像文件的类型、显示内容等信息;
        -     位图信息段:它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
        -     调色板:这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;b
        -     位图数据:这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

    一个BMP文件,可以用代码表示如下:
    typedef struct tagBITMAP_FILE{
            BITMAPFILEHEADER  bitmapheader;
            BITMAPINFOHEADER  bitmapinfoheader;
            PALETTEENTRY  palette[256];
            UCHAR  *buffer;        //UCHAR  大小1字节(同BYTE),在VC6下
    }  BITMAP_FILE;

    ①BMP文件头(14字节):BITMAPFILEHEADER
    typedef struct tagBITMAPFILEHEADER  
            WORD bfType;//位图文件的类型,必须为BM(1-2字节)
            DWORD bfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前)
            WORD bfReserved1;//位图文件保留字,必须为0(7-8字节)
            WORD bfReserved2;//位图文件保留字,必须为0(9-10字节)
            DWORD bfOffBits;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)
            //文件头的偏移量表示,以字节为单位
    }BITMAPFILEHEADER;

    bfType
    说明文件的类型,该值必须是0x4D42,也就是字符'BM',否则表示根本不是BMP
    bfSize
    说明该位图文件的大小,用字节为单位
    bfReserved1
    保留,必须设置为0
    bfReserved2
    保留,必须设置为0
    bfOffBits
    说明从文件头开始到实际的图像数据之间的字节偏移量。这个参数是非常有用的,因为位图信息和调色板的长度会根据不同的情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

    下面用Notepad++打开一个BMP文件

    如图所示:
    bfType:0X4D42。表示字符'BM'
    bfSize:0X0004a436 == 304182字节 == 297K字节,说明这个位图文件的大小为297K字节,和我们看到的正好符合。
    跳过四个字节的保留字节,
    bfOffBits:0X00000036 == 54字节。表示从头文件开始到实际的图像数据之间的字节偏移量为54字节。BMP文件头14字节、位图信息头40字节,省略了颜色表,共54字节。

    ②位图信息段(40字节):BITMAPINFOHEADER
    typedef struct tagBITMAPINFOHEADER  {
            DWORD biSize;//本结构所占用字节数(15-18字节)
            LONG biWidth;//位图的宽度,以像素为单位(19-22字节)
            LONG biHeight;//位图的高度,以像素为单位(23-26字节)
            WORD biPlanes;//目标设备的级别,必须为1(27-28字节)
            WORD biBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)
            //4(16色),8(256色)16(高彩色)或24(真彩色)之一
            DWORD biCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)
            //1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
            DWORD biSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)
            LONG biXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)
            LONG biYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)
            DWORD biClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)
            DWORD biClrImportant;//位图显示过程中重要的颜色数(51-54字节)
    }  BITMAPINFOHEADER;

    biSize
    说明BITMAPINFOHEADER结构所需要的字节数
    biWidth
    说明图像的宽度,以像素为单位
    biHeight
    说明图像的高度,以像素位单位。注:这个值除了用于描述图像的高度之外,它还有另外一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,即数据的第一行其实是图像的最后一行,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是高度值是一个正数。
    biPlanes
    表示bmp图片的平面属性,显然显示器只有一个平面,所以恒等于1
    biBitCount
    说明比特数/像素,其值为1、4、8、16、24或32.
    biCompression
    说明图像数据压缩的类型,其中:
    BI_RGB:没有压缩
    BI_RLE8:每个像素8比特的RLE压缩编码,压缩格式由2字节组成(重复像素计数和颜色索引)
    BI_RLE4:每个像素4比特的RLE压缩编码,压缩格式由2字节组成
    BI_BITFIELDS:每个像素的比特由指定的掩码决定
    BI_JPEG:JPEG格式
    biSizeImage
    说明图像的大小,以字节为单位。当用BI_RGB格式时,可设置为0
    biXPelsPerMeter
    说明水平分辨率,用像素/米表示
    biYPelsPerMeter
    说明垂直分辨率,用像素/米表示
    biClrUsed
    说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有的调色板项)
    biClrImportant
    说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要


    biSize:位图信息段结构BITMAPINFOHEADER所需的字节数  0X00000028 == 40字节
    biWidth:图像的宽度。0X00000160 == 352 像素
    biHeight:图像的高度。0X00000120 == 288 像素

    和图片信息相符
    biPlanes:bmp图片的平面属性,显示器只有一个平面,恒等于1。0X0001 == 1
    biBitCount:比特数/像素。0X0018 == 24 位
    biCompression:0X00000000 == 0 。没有压缩
    biSizeImage:图像压缩的类型。0X0004a400 == 304128 字节。位图的大小
            bigSizeImage = biWidth * biHeight * 每个像素的字节数
            那么这里应该是:352 * 288 * 24/8 = 304128 。
            这里的biBitCount是24位,所以每个像素的字节数是24/8 = 3
            注意:这里的biWidth必须是4的倍数,如果不是4的倍数,则需要取4的倍数。eg。241,则取244.
            因为这里涉及到了一个行对齐的问题。由于windows在进行行行扫描的时候,最小的单位是4个字节,所以当图片的宽度不是4的倍数的时候,需要在每行的后面补上缺少的字节,以0填充。
    biXPelsPerMeter:0x00000000
    biYPelsPerMeter:0x00000000
    biClrUsed:0x00000000  表示使用所有调色板项
    biClrImportant:0X00000000 。 表示所有颜色对图像显示都有重要影响。在早期的计算机中,显卡相对来说比较落后,不一定能保证显示所有的颜色,所以在调色板中的颜色数据应尽可能的将图像中主要的颜色按顺序排列在前面,biClrImportant指出了有多少种颜色是重要的。


    ③调色板
    typedef struct tagRGBQUAD { 
            BYTE    rgbBlue; 
            BYTE    rgbGreen; 
            BYTE    rgbRed; 
            BYTE    rgbReserved;
     } RGBQUAD;

    字段名称
    大小(单位:字节)
    描述
    rgbBlue
    1
    蓝色值
    rgbGreen
    1
    绿色值
    rgbRed
    1
    红色值
    rgbReserved
    1
    保留,总为0

    调色板是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像的数据是指向调色板的索引。
    如果图像是单色、16色和256色,则紧跟着调色板的是位图数据,位图数据是指向调色板的索引号。
    如果位图是16位、24位和32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中绘出。
    如果图像带有调色板,则位图数据可以根据需要选择压缩与不压缩,如果选择压缩,则根据BMP图像是16色或256色,采用RLE4或RLE8压缩算法。
    灰度图的调色板共有256项RGBQUAD结构,存放0到255的灰度值,每一项rgbRed、rgbGreen、rgbBlue分量值相等。灰度图调色板空间的申请的具体设置如下:
    RGBQUAD *ipRGB2 = (RGBQUAD *)malloc(256*sizeof(RGBQUAD));//调色板的大小为1024字节

    for (int   i = 0; i < 256; i++ )

    ipRGB2[i].rgbRed = ipRGB2[i].rgbGreen = ipRGB2[i].rgbBlue = i;


    上面例子的这幅图片并没有调色板

    也验证了bfOffBits == sizeof(BITMAPFILEHEADER )+sizeof(BITMAPINFOHEADER);正好是54字节。

    三原色RGB:自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。每种颜色都可以量化为0到255共256个等级。不同的组合会显示出不同的颜色。

    当一幅图中每个像素被赋予不同的额RGB值时,就能呈现出五彩缤纷的颜色了,这样就形成了彩色图。
    让我们距离说明什么是调色板?为什么需要调色板?

    有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R、G、B三个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200×200×3,约120k字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。

    因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。

    让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200×200×0.5,约20k字节,再加上表占用的字节为3×16=48字节.整个占用的字节数约为前面的1/6,省很多吧?

    这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。

    那么为什么我们这张BMP不带调色板呢?

           是因为我们这张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位色图。

    这么看来BMP文件不能一概而论了,其是否用调色板或者是RGB掩码,位图数据中的数据的真正含义直接与biBitCount 有关,不同类型的位图,其中的设计原理也不同,下面对此作一个对比:




    ④位图数据
    24位BMP图,每三个字节表示一个像素,三个字节分别代表R、G、B的分量值


    这里每3个字节表示一个像素的颜色,注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。

    http://blog.csdn.net/u013162930/article/details/47296455







    展开全文
  • bmp格式解析

    2019-02-27 19:19:00
    位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-...

    位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independent bitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。
          位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列。可以文本打开方式打开BMP文件。
    (1)文件头信息块
    0000-0001:文件标识,为字母ASCII码“BM”,42 4D。亦或者与19778相比较。
    0002-0005:整个文件大小,单位字节。  低字节在前。
    0006-0009:保留,每字节以“00”填写。
    000A-000D:记录图像数据区的起始位置。从文件开始到位图数据(bitmap data)之间的偏移量。 
    (2)图像描述信息块
    000E-0011:图像描述信息块的大小,常为28H。
    0012-0015:图像宽度。以像素为单位。低字节在前。
    0016-0019:图像高度。以像素为单位。低字节在前。
    001A-001B:图像的plane总数(恒为1)。
    001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
    1 - Monochrome bitmap,
    4 - 16 color bitmap,
    8 - 256 color bitmap,
    F - 16位位图,
    10 - 16位RGB565位图,
    18 - 24bit (true color) bitmap,
    20 - 32位位图。
    001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩;3:Bitfields压缩)。
    0022-0025:图像区数据的大小。单位字节,该数必须是4的倍数。
    0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
    002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
    002E-0031:此图像所用的颜色数。
    0032-0035:指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要。
         如上,整个位图的信息头共54字节,每个位置有特定含义。
    (3)颜色表(调色板)
          颜色表的大小根据所使用的颜色模式而定,其中每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B (蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号1的颜色,接下来表示颜色号2的颜色,依此类推。   
          对于24-位真彩色图象就不使用彩色表(同样也包括16位、和32位位图),因为位图中的RGB值就代表了每个象素的颜色;而对于使用索引颜色的,则需要较大的调色板。
    (4)图像数据区
           颜色表接下来为位图文件的图像数据区,在此部分记录着每点像素对应的颜色索引号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。
           然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个:
    BMP文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度为奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信息。 
    (5)实例分析

         如下的4x4像素的位图

    经过UE打开成16进制文件后,显示如下:

    我们可以通过查找对应的数据位来验证上面所分析的各部分信息。这样就比较清楚了。
    24位真彩色的数据格式为  B(8位)G(8位)R(8位),这是由于低字节在前造成的。 
    (6)位图操作常使用的结构体 
          位图头文件结构:
    typedef struct tagBITMAPFILEHEADER{
         short bfType;
         int bfSize;
         short bfReserved1;
         short bfReserved2;
         int bfOffBits;
    }BITMAPFILEHEADER, *PBITMAPFILEHEADER;
          位图信息结构:
    typedef struct tagBITMAPINFOHEADER{
          int biSize;
          int biWidth;
          int biHeight;
          short biPlanes;
          short biBitCount;
          int biCompression;
          int biSizeImage;
          int biXPelsPerMeter;
          int biYPelsPerMeter;
          int biClrUsed;
          int biClrImportant;
    }BITMAPINFOHEADER,*PBITMAPINFOHEADER;
     (7)扫描顺序
    BMP位图扫描顺序是从图片的左下角像素由左至右,由下至上进行扫描的

    参考原文:http://blog.csdn.net/jsjjms/archive/2007/04/18/1568615.aspx

    展开全文
  • BMP图像 - BMP格式

    2020-05-29 14:54:11
    是Windows操作系统中的标准图像文件格式,采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。 BMP文件存储数据时, ...

    BMP - (全称Bitmap)

    • 是Windows操作系统中的标准图像文件格式,采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。
    • BMP文件存储数据时, 图像的扫描方式是按从左到右、从下到上的顺序。所以图案加载到内存后,行数据和显示的行顺序是上下颠倒的

    BMP文件格式如下:

    数据段名称 大小(Byte) 作用
    bmp文件头 14 提供文件的格式、大小等信息
    位图信息头 40 提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
    调色板 由颜色索引数决定 可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
    位图数据 由图像尺寸决定 图像数据

    我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。

    我们以二进制形式打开一张BMP图片:
    在这里插入图片描述
    上面0 - 0x36就是bmp文件头和位图信息头

    关于bmp文件头和位图信息头在UEFI下有定义:
    edk2/MdePkg/Include/IndustryStandard/Bmp.h

    #pragma pack(1)
    
    typedef struct {
      UINT8   Blue;
      UINT8   Green;
      UINT8   Red;
      UINT8   Reserved;
    } BMP_COLOR_MAP;
    
    typedef struct {
      CHAR8         CharB; 
      CHAR8         CharM; //数据为'BM'时表示这个文件是BMP文件
      UINT32        Size;  //位图文件大小
      UINT16        Reserved[2]; //保留,为0
      UINT32        ImageOffset; //位图数据距离文件头的偏离
      UINT32        HeaderSize;  //位图信息头长度--40Byte
      UINT32        PixelWidth;  //位图宽
      UINT32        PixelHeight; //位图长
      UINT16        Planes;          ///< Must be 1
      UINT16        BitPerPixel;     ///< 1, 4, 8, or 24
      UINT32        CompressionType; //压缩方式,0表示不压缩
      UINT32        ImageSize;       //实际位图数据占用的字节数
      UINT32        XPixelsPerMeter; //X方向分辨率
      UINT32        YPixelsPerMeter; //Y方向分辨率
      UINT32        NumberOfColors;  //使用的颜色数,为0表示(2^BitPerPixel)
      UINT32        ImportantColors; //重要影响颜色索引数目,为0表示所有都重要
    } BMP_IMAGE_HEADER;
    
    #pragma pack()
    
    展开全文
  • 【数字图像处理】一.MFC详解显示BMP格式图片

    万次阅读 多人点赞 2014-01-14 19:31:46
    主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存...
  • MFC详解显示BMP格式图片

    千次阅读 2018-07-24 11:00:56
    主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存...
  • 之前整理计算机图形学作业时因为计算机可以使用的图像格式为BMP格式,在这里先简单介绍一下什么是BMP格式 BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备...
  • 创建一个bmp格式的简单方法

    千次阅读 2016-12-21 20:32:16
    在MFC编程中会涉及到位图的显示,那么我们如何创建一个能够用于VS导入的bmp格式位图呢,方法如下: 1.将JPG格式的图片用“画图”软件打开 2.点击左上角的“下拉菜单”->另存为->"BMP图片格式"->类型选择“24位位图”...
  • C++读取bmp格式图片

    千次阅读 2019-09-05 23:59:22
    类的格式按照bmp的文件头...因为bmp格式规定存储时每行的像素数要补齐至4的整数倍,所以读入和写出时要加一些对应的操作 #include <bits/stdc++.h> using namespace std; typedef unsigned short w; typede...
  • 如下图,导入文件为一BMP图片(红框部分), 然后点击确认键(黑框部分)。 结果却出错,提示不是BMP文件,如下图红框部分。...下图enjoy.bmp是下载下来的图片的属性,3.BMP是上传的图片的属性。对比了一下感觉...
  • 我们编程或很多地方会用到bmp格式的图片,但是很多图片又不是bmp格式的,有时去网上下一个软件工具,可能导致图片的褪色,不清晰,很纠结。现在我找到一个很简洁的方法,不用下软件,图片质量也ok,,十分实用。步骤...
  • 如何将JPG格式图片转换成BMP格式

    千次阅读 2017-04-06 18:56:35
    从Win7的开始菜单里打开系统自带的“画图”工具 ...在画图工具里打开我们需要转换的图片:首先单击如图所示的白色倒...再次单击如图所示的白色倒三角符号,然后打开“另存为”的隐藏菜单,单击“BMP格式图片”
  • MATLAB raw格式转为bmp格式

    千次阅读 2019-03-04 22:18:00
    今天是第一天写博客,哈哈哈!把完成的数字图像作业放上来和大家一起分享一下!  如果有什么问题,希望大家和我多多交流 ... width=512; ...% 打开原图像%同文件夹下 m = fread(img,[width height],'uchar')...
  • C语言读取BMP格式图片

    万次阅读 多人点赞 2012-09-08 10:06:24
    C语言读取BMP格式图片 BMP 维基百科,自由的百科全书 汉漢▼ 位图 扩展名 .bmp 开发者 Microsoft 格式 图像文件格式  本文介绍的是一种图像文件...
  • BMP格式详解

    千次阅读 2009-11-06 10:33:00
    列举图片:C:/WINDOWS/Blue Lace 16.bmp位图文件头的格式:typedef struct{int bfType;//bfType(2字节),这里恒定等于&H4D42,ASCII字符BMlong bfSize;//文件大小,以4字节为单位int bfReserve1;//备用int bfReserve2;...
  • framebuffer显示bmp格式文件

    千次阅读 2012-10-18 13:59:52
    bmp格式的位图文件的编码格式简单,解析也较容易。在linux framebuffer 的基础上,可以很快的编写一些代码来显示图片。本文将基于此实现在arm开发板上对bmp位图的显示。  bmp格式中的结构组成分为四部分:  ...
  • 最近,在写代码时候发现使用MATLAB2015的imread 函数读取32位的bmp图像不成功。 使用malab2019可以读取成功。... bmp格式24位 imread读取成功 imread读取成功 bmp格式32位 imread读取失败 ...
  • 怎么将bmp格式图片转换jpg格式的

    千次阅读 2018-12-11 17:15:30
    BMP是Windows操作系统中的标准图像文件格式,因为不会对图片进行压缩,所以图像还原较高,清晰度较高,但是因为不会对图片进行压缩,所以体积较大,占用的空间内存较大,而且对于一些网站时不支持该格式的图片上传的...
  • 哪里能下载到bmp格式的图片

    万次阅读 多人点赞 2018-06-13 07:21:12
    如果你电脑里已经有图片了,那你就右击你的图片--打开方式--画图,打开图片后再点文件--另存为,把保存类型改为bmp格式就可以了,如果。要网上下的话很多写着是bmp,下载下来还是JPG什么的,气!学到了学到了...
  • CAD怎么才能输出BMP格式呢?

    千次阅读 2019-02-13 17:59:29
    你知道吗,BMP格式也是CAD图纸输出格式中使用比较广泛的一种图纸格式哦!这时很多小伙伴们要开始有疑问了,BMP格式是怎么样的一种图纸格式呢?为什么平时见到的会比较少呢?接下来为小伙伴们解答! BMP(全称BitMap...
  • 对与DICOM图片的打开也就实现了,“窗位”,“窗宽”标明的。把显示部分的代码放上来,希望对刚接触DICOM图片格式的人有点帮助,若有高手希望指点下,“窗宽”,“窗位”的取值问题。 我碰到过三种DICOM图片:1.窗位...
  • verilog读取bmp格式图片

    千次阅读 2018-05-28 17:12:21
    代码如下: `timescale 1 ns/1 ns module test_t; integer fileId, cc,out_file,i; reg [7:0] bmp_data [0:2000000];...integer bmp_width, bmp_hight, data_start_index, bmp_size; in...
  • 查看BMP格式图片的十六进制代码 1、下载notepad++: 下载地址 2、在notepad++中安装Hex-Editor插件: 打开notepad++ ——> 点击插件按钮 ——> 插件管理,如下图所示 ——> 找到Hex-Editor,安装即可 ——&...
  • BMP格式的图片怎在线压缩,大家在上传图片的时候有没有遇到过“因文件太大,上传失败”的问题,图片太大不仅占用空间,而且十分影响传递,那有没有什么解决方法呢,接下来让小编来告诉大家吧。 第一、打开电脑,进入...
  • VS2015实现bmp格式图片的读取

    千次阅读 热门讨论 2020-04-26 13:59:10
    预备知识:掌握一些mfc基本的控件用法以及bmp格式的图片的一些内容,当然不知道也无伤大雅。 step1:新建基于对话框的mfc工程 step2:拖控件 step3:读文件 1. 双击打开按钮进行添加事件响应程序,当然...
  • BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,不采用其他任何压缩,因此,它的画质比较清晰,基本可以还原拍摄画质,淡水BMP文件所占用的空间很大。由于BMP文件格式是Windows环境中交换与图有关的数据...
  • raw格式数据转BMP格式(OpenCV)

    千次阅读 2017-08-07 11:38:27
    raw转bmp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,188
精华内容 15,675
关键字:

怎么打开bmp格式