真彩位图格式是什么样子的,与256色有什么区别
如何显示真彩位图

解决方案 »

  1.   

    BITMAP Structure
    The BITMAP structure has the following form:typedef struct tagBITMAP {  /* bm */
        int     bmType;
        int     bmWidth;
        int     bmHeight;
        int     bmWidthBytes;
        BYTE    bmPlanes;
        BYTE    bmBitsPixel;
        LPVOID  bmBits;
    } BITMAP;The BITMAP structure defines the height, width, color format, and bit values of a logical bitmap. MembersbmTypeSpecifies the bitmap type. For logical bitmaps, this member must be 0. bmWidthSpecifies the width of the bitmap in pixels. The width must be greater than 0. bmHeightSpecifies the height of the bitmap in raster lines. The height must be greater than 0. bmWidthBytesSpecifies the number of bytes in each raster line. This value must be an even number since the graphics device interface (GDI) assumes that the bit values of a bitmap form an array of integer (2-byte) values. In other words, bmWidthBytes * 8 must be the next multiple of 16 greater than or equal to the value obtained when the bmWidth member is multiplied by the bmBitsPixel member. bmPlanesSpecifies the number of color planes in the bitmap. bmBitsPixelSpecifies the number of adjacent color bits on each plane needed to define a pixel. bmBitsPoints to the location of the bit values for the bitmap. The bmBits member must be a long pointer to an array of 1-byte values. CommentsThe currently used bitmap formats are monochrome and color. The monochrome bitmap uses a 1-bit, 1-plane format. Each scan is a multiple of 16 bits. Scans are organized as follows for a monochrome bitmap of height n: Scan 0
    Scan 1
    .
    .
    .
    Scan n-2
    Scan n-1The pixels on a monochrome device are either black or white. If the corresponding bit in the bitmap is 1, the pixel is turned on (white). If the corresponding bit in the bitmap is 0, the pixel is turned off (black). All devices support bitmaps that have the RC_BITBLT bit set in the RASTERCAPS index of the CDC::GetDeviceCaps member function. Each device has its own unique color format. In order to transfer a bitmap from one device to another, use theGetDIBits andSetDIBits Windows functions. See Also   CBitmap::CreateBitmapIndirect
      

  2.   

    呵呵,以上是从MSDN贴出来的。:)位图的文件格式如下:1.文件头:
    偏移 长度 名称 描述
    0 2 bfType ASCII字符"BM"
    2 4 bfSize 文件大小
    6 2 bfReserved1 0
    8 2 bfReserved2 0
    10 4 bfOffBits  头之后的文件偏移2.位图头:
    偏移 长度 名称 描述
    14 4 bfSize 头大小,40字节
    18 4 biWidth 图象宽度像素
    22 4 biHeight 图象高度像素
    26 2 biPlanes 图象位平面数目,必须为1
    28 2 biBitCount 每像素的位数(1,4,8,24)
    30 4 biCompression 压缩类型
    34 4 biSizeImage 压缩图象大小的字节值
    38 4 biXpelsPerMeter 水平分辨率
    42 4 biYpelsPerMeter 垂直分辨率
    46 4 biClrUsed 使用的颜色数目
    50 4 biClrImportant 重要颜色数目
    54 4*N bmiColors 彩色映像
    其中,24位图象没有彩色映像,直接是RGB彩色3.位图数据
    可以压缩或不压缩,4,8位图象可以用RLE压缩
    位逻辑地(没有压缩时也是物理地)存入一行,每行被填充到一个4字节边界24位每像素3字节,依次为红,绿和蓝
    ....
    ...
    ....
      

  3.   

    实际上真彩与256色的区别是在调色板上。256的bmp图具有相应的调色板,保存图像中使用的颜色。而真彩色由于其每个像素都有8位,如果用调色板保存其颜色值,其需要的字节数是巨大的。因为,表示一个象素要用24位,这时每种颜色的索引要用24位(因为总共有2的24次方种颜色,即调色板有2的24次方行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256*256*256*3个字节的大调色板。所以真彩色图直接用R,G,B三个分量表示,它又叫做24位色图。
    windows bmp的文件格式是:
                 BITMAPFILEHEADER   //位图文件信息头
                 BITMAPINFOHEADER   //位图信息头
                 调色板palette
                 实际位图数据第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:
    typedefstructtagBITMAPFILEHEADER{
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved1;
    WORD bfReserved2;
    DWORD bfOffBits;
    } BITMAPFILEHEADER;
    这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:
    bfType
    指定文件类型,必须是0x424D,即字符串"BM",也就是说所有.bmp文件的头两个字节都是"BM"
    bfSize
    指定文件大小,包括这14个字节
    bfReserved1,bfReserved2
    为保留字,不用考虑
    bfOffBits
    为从文件头到实际的位图数据的偏移字节数,即图3中前三个部分的长度之和。
    第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:
    typedef struct tagBITMAPINFOHEADER{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
    } BITMAPINFOHEADER; 这个结构的长度是固定的,为40个字节(WORD为无符号16位整数,DWORD无符号32位整数,LONG为32位整数),各个域的说明如下:
    biSize
    指定这个结构的长度,为40
    biWidth
    指定图象的宽度,单位是象素
    biHeight
    指定图象的高度,单位是象素
    biPlanes
    必须是1,不用考虑
    biBitCount
    指定表示颜色时要用到的位数,常用的值为1(黑白二色图),4(16色图),8(256色),24(真彩色图)(新的.bmp格式支持32位色,这里就不做讨论了)。
    biCompression
    指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。
    biSizeImage
    指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
    biSizeImage=biWidth'*biHeight
    要注意的是:上述公式中的biWidth'必须是4的整倍数(所以不是biWidth,而是biWidth',表示大于或等于biWidth的,离4最近的整倍数。举个例子,如果biWidth=240,则biWidth'=240;如果biWidth=241,biWidth'=244)如果biCompression为BI_RGB,则该项可能为零
    biXPelsPerMeter
    指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在打印部分详细介绍。
    biYPelsPerMeter
    指定目标设备的垂直分辨率,单位同上。
    biClrUsed
    指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方。
    biClrImportant
    指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
    第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。
    调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
    typedef struct tagRGBQUAD{
    BYTE rgbBlue; //该颜色的蓝色分量
    BYTE rgbGreen; //该颜色的绿色分量
    BYTE rgbRed; //该颜色的红色分量
    BYTE rgbReserved; //保留值
    } RGBQUAD;
    第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值,对于真彩色图,图象数据就是实际的R,G,B值。下面就2色,16色,256色位图和真彩色位图分别介绍。
    对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。
    对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。
    对于256色位图,一个字节刚好可以表示1个像素。
    对于真彩色图,三个字节才能表示1个像素。
    要注意两点:
    1.每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。
    2.一般来说,.BMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素…接下来是倒数第二行左边第一个像素,左边第二个像素…依次类推,最后得到的是最上面一行的最右一个像素。
      

  4.   

    显示bmp的示例,具体请看MSDN中DIBLOOK的samples ,其中的dib.cpp一定很有帮助。在www.vckbase.com中也有很多的示例