C++实现RGB565转BMP图像的代码

把代码过程中比较重要的代码片段备份一次,如下的资料是关于CC++实现RGB565转BMP图像的代码,希望能对各位朋友也有用途。

#include

#include

#include

#include "rgb2bmp.h"

int  main()

    filename      :RGB数据文件名称

    nWidth        :所生成文件的水平像素

    nHeight      :所生成文件的垂直像素

    newFile      :最终生成文件的名称

    int nWidth = 800;

    int nHeight = 480;

    p = fopen(filename,"rb");

    if (p == NULL)

    {

        printf("!!!file %s open failed.n", filename);

        return 0;

    }

    printf("file %s open success.n",filename);

    fread(rgb_buffer,2,nData,p);

    long i =0;

    unsigned char R,G,B;

    while(i

    {

    B = B<<3;

    G = G<<2;

    R = R<<3;

      rgb_buffer++;

      i++; 

    }

    printf("read file over.nData%ldn",nData);

    if (result == NULL)

    {

      printf("open new file failed.n");

      return -1;

    }

    RGB2BMP(tmp,nWidth,nHeight,result);

    fclose(result);

    return 0;

}


#include

typedef unsigned char  BYTE;

typedef unsigned short WORD;

    第一部分    位图文件头

该结构的长度是固定的,为14个字节,各个域的依次如下:

    2byte  :文件类型,必须是0x4d42,即字符串"BM"。

    4byte  :整个文件大小

    4byte  :保留字,为0

    4byte  :从文件头到实际的位图图像数据的偏移字节数。

typedef struct

{    long imageSize;

    long blank;

    long startPosition;

}BmpHead;

第二部分    位图信息头

该结构的长度也是固定的,为40个字节,各个域的依次说明如下:

    4byte  :本结构的长度,值为40

    4byte  :图像的宽度是多少象素。

    4byte  :图像的高度是多少象素。

    2Byte  :必须是1。

    2Byte  :表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。

    4byte  :指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。

    4byte  :指定实际的位图图像数据占用的字节数,可用以下的公式计算出来:

    要注意的是:上述公式中的biWidth'必须是4的整数倍(不是biWidth,而是大于或等于biWidth的最小4的整数倍)。

    如果biCompression为BI_RGB,则该项可能为0。

    4byte  :目标设备的水平分辨率。

    4byte  :目标设备的垂直分辨率。

    4byte  :本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的(颜色位数)次幂,如颜色位数为8,2^8=256,即256色的位图

    4byte  :指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的。

typedef struct

{

    long    Length;

    long    width;

    long    height;

    WORD    colorPlane;

    WORD    bitColor;

    long    zipFormat;

    long    realSize;

    long    xPels;

    long    yPels;

    long    colorUse;

    long    colorImportant;

    {   

        printf("infoHead Length:%dn",Length);

        printf("colorPlane:%dn",colorPlane);

        printf("bitColor:%dn",bitColor);

        printf("Compression Format:%dn",zipFormat);

        printf("Image Real Size:%dn",realSize);

        printf("Pels(X,Y):(%d,%d)n",xPels,yPels);

        printf("colorUse:%dn",colorUse);   

        printf("Important Color:%dn",colorImportant);

}InfoHead;

    第三部分    调色盘结构  颜色表

    对于256色BMP位图,颜色位数为8,需要2^8 = 256个调色盘;

    对于24bitBMP位图,各象素RGB值直接保存在图像数据区,不需要调色盘,不存在调色盘区

    rgbBlue:  该颜色的蓝色分量。

    rgbGreen:  该颜色的绿色分量。

    rgbRed:    该颜色的红色分量。

    rgbReserved:保留值。

typedef struct

{        BYTE  rgbBlue;

        BYTE  rgbGreen;

        BYTE  rgbRed;

        BYTE  rgbReserved;

        {

            printf("Mix Plate B,G,R:%d %d %dn",rgbBlue,rgbGreen,rgbRed);

}RGBMixPlate;

      RGB加上头部信息转换成BMP

      参数說明:

      rgb_buffer        :RGB数据文件中的信息

      nData            :RGB数据的长度

      nWidth            :图像宽度的像素数

      nHeight          :图像高度的像素数

      fp1              :所存放的文件

{

    BmpHead m_BMPHeader;       

    char bfType[2]={'B','M'};

    m_BMPHeader.blank=0;

    m_BMPHeader.startPosition=54;

    fwrite(bfType,1,sizeof(bfType),fp1);

    fwrite(&m_BMPHeader.imageSize,1,sizeof(m_BMPHeader.imageSize),fp1);

    fwrite(&m_BMPHeader.blank,1,sizeof(m_BMPHeader.blank),fp1);

    fwrite(&m_BMPHeader.startPosition,1,sizeof(m_BMPHeader.startPosition),fp1);


    InfoHead  m_BMPInfoHeader;

    m_BMPInfoHeader.Length=40;

    m_BMPInfoHeader.width=nWidth;

    m_BMPInfoHeader.height=nHeight;

    m_BMPInfoHeader.colorPlane=1;

    m_BMPInfoHeader.bitColor=24;

    m_BMPInfoHeader.zipFormat=0;

    m_BMPInfoHeader.xPels=0;

    m_BMPInfoHeader.yPels=0;

    m_BMPInfoHeader.colorUse=0;

    m_BMPInfoHeader.colorImportant=0;

    fwrite(&m_BMPInfoHeader.Length,1,sizeof(m_BMPInfoHeader.Length),fp1);

    fwrite(&m_BMPInfoHeader.width,1,sizeof(m_BMPInfoHeader.width),fp1);

    fwrite(&m_BMPInfoHeader.height,1,sizeof(m_BMPInfoHeader.height),fp1);

    fwrite(&m_BMPInfoHeader.colorPlane,1,sizeof(m_BMPInfoHeader.colorPlane),fp1);

    fwrite(&m_BMPInfoHeader.bitColor,1,sizeof(m_BMPInfoHeader.bitColor),fp1);

    fwrite(&m_BMPInfoHeader.zipFormat,1,sizeof(m_BMPInfoHeader.zipFormat),fp1);

    fwrite(&m_BMPInfoHeader.realSize,1,sizeof(m_BMPInfoHeader.realSize),fp1);

    fwrite(&m_BMPInfoHeader.xPels,1,sizeof(m_BMPInfoHeader.xPels),fp1);

    fwrite(&m_BMPInfoHeader.yPels,1,sizeof(m_BMPInfoHeader.yPels),fp1);

    fwrite(&m_BMPInfoHeader.colorUse,1,sizeof(m_BMPInfoHeader.colorUse),fp1);

    fwrite(&m_BMPInfoHeader.colorImportant,1,sizeof(m_BMPInfoHeader.colorImportant),fp1);

    return 0;

}

你可能感兴趣的:(C++实现RGB565转BMP图像的代码)