/*************** input data *********** |
***********************************************/ |
char * filename = "rgb565_800_480_woman" ; |
char * newFile = "rgb565_800_480_woman_0x7f.bmp" ; |
p = fopen (filename, "rb" ); |
printf ( "!!!file %s open failed.n" , filename); |
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; |
G = (*rgb_buffer>>5)&0x3f; |
B = (*rgb_buffer>>11)&0x1f; |
printf ( "read file over.nData%ldn" ,nData); |
/*****************************************************/ |
/*********** write file *******************/ |
FILE *result = fopen (newFile, "wb" ); |
printf ( "open new file failed.n" ); |
RGB2BMP(tmp,nWidth,nHeight,result); |
typedef unsigned char BYTE ; |
typedef unsigned short WORD ; |
該結構的長度是固定的,爲14個字節,各個域的依次如下: |
2byte :文件類型,必須是0x4d42,即字符串"BM"。 |
4byte :從文件頭到實際的位圖圖像數據的偏移字節數。 |
該結構的長度也是固定的,爲40個字節,各個域的依次說明如下: |
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 :本圖像實際用到的顏色數,如果該值爲0,則用到的顏色數爲2的(顏色位數)次冪,如顏色位數爲8,2^8=256,即256色的位圖 |
4byte :指定本圖像中重要的顏色數,如果該值爲0,則認爲所有的顏色都是重要的。 |
***********************************/ |
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); |
/*************************** |
/*************************** |
對於256色BMP位圖,顏色位數爲8,需要2^8 = 256個調色盤; |
對於24bitBMP位圖,各象素RGB值直接保存在圖像數據區,不需要調色盤,不存在調色盤區 |
************************/ |
printf("Mix Plate B,G,R:%d %d %dn",rgbBlue,rgbGreen,rgbRed); |
/**************************** |
*****************************/ |
int RGB2BMP( char *rgb_buffer, int nWidth, int nHeight, FILE *fp1) |
char bfType[2]={ 'B' , 'M' }; |
m_BMPHeader.imageSize=3*nWidth*nHeight+54; |
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.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); |
|