C/C++實現RGB565轉換成BMP位圖

kdloeki 9年前發布 | 1K 次閱讀 C/C++

//主函數

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 = nWidthnHeight; unsigned short rgb_buffer = malloc(nDatasizeof(short));
fread(rgb_buffer,2,nData,p); long total = nWidth
nHeight3; unsigned char pVisit = malloc(totalsizeof(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,G,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,FILEfp1) { BmpHead m_BMPHeader;
char bfType[2]={'B','M'}; m_BMPHeader.imageSize=3nWidthnHeight+54; 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.realSize=3*nWidth*nHeight;
 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);
 fwrite(rgb_buffer,3*nWidth*nHeight,1,fp1);
 return 0;

}</pre>

 本文由用戶 kdloeki 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!