CC++实现RGB565转换成BMP位图

CC++实现RGB565转换成BMP位图,第1张

概述C/C++实现RGB565转换成BMP位图

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

//主函数#include <string.h>#include <stdlib.h>#include <stdio.h>#include "rgb2bmp.h"int  main(){    file* p;/***************  input data  ***********    filename      :RGB数据文件名称    nWIDth        :所生成文件的水平像素    nHeight       :所生成文件的垂直像素    newfile       :最终生成文件的名称***********************************************/    char* filename = "rgb565_800_480_woman";    int nWIDth = 800;    int nHeight = 480;    char* newfile = "rgb565_800_480_woman_0x7f.bmp";    p = fopen(filename,"rb");    if (p == NulL)    {        printf("!!!file %s open Failed.n",filename);        return 0;    }    printf("file %s open success.n",filename);/***********  read Image Data  **************/        long nData = nWIDth*nHeight;    unsigned short* rgb_buffer = malloc(nData*sizeof(short));       fread(rgb_buffer,2,nData,p);    long total = nWIDth*nHeight*3;    unsigned char* pVisit =  malloc(total*sizeof(char));    unsigned char* tmp = pVisit;    long i =0;    unsigned char R,G,B;    while(i<nData)    {       R = *rgb_buffer&0x1f;    G = (*rgb_buffer>>5)&0x3f;    B = (*rgb_buffer>>11)&0x1f;    B = B<<3;    G = G<<2;    R = R<<3;      *pVisit=R;pVisit++;      *pVisit=G;pVisit++;      *pVisit=B;pVisit++;      rgb_buffer++;      i++;      }    printf("read file over.nData%ldn",nData);/*****************************************************//***********  write file *******************/    file *result = fopen(newfile,"wb");    if (result == NulL)    {       printf("open new file Failed.n");       return -1;    }    RGB2BMP(tmp,nWIDth,nHeight,result);    fclose(result);    return 0;}   //rgb2bmp.h文件#include <stdio.h>typedef unsigned char  BYTE;typedef unsigned short WORD;// BMP图像各部分说明如下/***********    第一部分    位图文件头该结构的长度是固定的,为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   :指定实际的位图图像数据占用的字节数,可用以下的公式计算出来:     图像数据 = WIDth' * Height * 表示每个象素颜色占用的byte数(即颜色位数/8,24bit图为3,256色为1)     要注意的是:上述公式中的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;  /*  voID show()      {            printf("infohead Length:%dn",Length);        printf("wIDth&height:%d*%dn",wIDth,height);        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;      /*   voID show(voID)         {            printf("Mix Plate B,R:%d %d %dn",rgbBlue,rgbGreen,rgbRed);         }*/}RGBMixPlate;/****************************      RGB加上头部信息转换成BMP      参数說明:      rgb_buffer        :RGB数据文件中的信息      nData             :RGB数据的长度      nWIDth            :图像宽度的像素数      nHeight           :图像高度的像素数      fp1               :所存放的文件*****************************/int RGB2BMP(char *rgb_buffer,int nWIDth,int nHeight,file*fp1){     Bmphead m_BMPheader;            char bfType[2]={'B','M'};     m_BMPheader.imageSize=3*nWIDth*nHeight+54;     m_BMPheader.blank=0;     m_BMPheader.startposition=54;       fwrite(bfType,1,sizeof(bfType),fp1);     fwrite(&m_BMPheader.imageSize,sizeof(m_BMPheader.imageSize),fp1);     fwrite(&m_BMPheader.blank,sizeof(m_BMPheader.blank),fp1);     fwrite(&m_BMPheader.startposition,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.realSize=3*nWIDth*nHeight;     m_BMPInfoheader.xPels=0;     m_BMPInfoheader.yPels=0;     m_BMPInfoheader.colorUse=0;     m_BMPInfoheader.colorimportant=0;       fwrite(&m_BMPInfoheader.Length,sizeof(m_BMPInfoheader.Length),fp1);     fwrite(&m_BMPInfoheader.wIDth,sizeof(m_BMPInfoheader.wIDth),fp1);     fwrite(&m_BMPInfoheader.height,sizeof(m_BMPInfoheader.height),fp1);     fwrite(&m_BMPInfoheader.colorPlane,sizeof(m_BMPInfoheader.colorPlane),fp1);     fwrite(&m_BMPInfoheader.bitcolor,sizeof(m_BMPInfoheader.bitcolor),fp1);     fwrite(&m_BMPInfoheader.zipformat,sizeof(m_BMPInfoheader.zipformat),fp1);     fwrite(&m_BMPInfoheader.realSize,sizeof(m_BMPInfoheader.realSize),fp1);     fwrite(&m_BMPInfoheader.xPels,sizeof(m_BMPInfoheader.xPels),fp1);     fwrite(&m_BMPInfoheader.yPels,sizeof(m_BMPInfoheader.yPels),fp1);     fwrite(&m_BMPInfoheader.colorUse,sizeof(m_BMPInfoheader.colorUse),fp1);     fwrite(&m_BMPInfoheader.colorimportant,sizeof(m_BMPInfoheader.colorimportant),fp1);     fwrite(rgb_buffer,3*nWIDth*nHeight,fp1);     return 0;}

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的C/C++实现RGB565转换成BMP位图全部内容,希望文章能够帮你解决C/C++实现RGB565转换成BMP位图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1232282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存