把RAW转成RGB后保存为BMP的示例

  1 #include <string.h>
  2 #include <stdlib.h>
  3 #include <stdio.h>
  4
  5 #define IMAGE_WIDTH (5344)
  6 #define IMAGE_HEIGHT (4016)
  7 
  8 typedef struct
  9 { 
 10      char bfType[2];//文件类型,必须是0x4d42,即字符串"BM"。
 11     long imageSize;//整个文件大小
 12     long blank;//保留字,为0
 13     long startPosition;//从文件头到实际的位图图像数据的偏移字节数。
 14 }BmpHead;
 15 
 16 
 17 
 18 /*********************
 19 /*********************
 20 第二部分    位图信息头
 21 该结构的长度也是固定的,为40个字节,各个域的依次说明如下:
 22     4byte   :本结构的长度,值为40
 23     4byte   :图像的宽度是多少象素。
 24     4byte   :图像的高度是多少象素。
 25     2Byte   :必须是1。
 26     2Byte   :表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。
 27     4byte   :指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。
 28     4byte   :指定实际的位图图像数据占用的字节数,可用以下的公式计算出来:
 29      图像数据 = Width' * Height * 表示每个象素颜色占用的byte数(即颜色位数/8,24bit图为3,256色为1)
 30      要注意的是:上述公式中的biWidth'必须是4的整数倍(不是biWidth,而是大于或等于biWidth的最小4的整数倍)。
 31      如果biCompression为BI_RGB,则该项可能为0。
 32     4byte   :目标设备的水平分辨率。
 33     4byte   :目标设备的垂直分辨率。
 34     4byte   :本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的(颜色位数)次幂,如颜色位数为8,2^8=256,即256色的位图
 35     4byte   :指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的。
 36 ***********************************/
 37 typedef struct
 38 
 39 {
 40     long    Length;
 41     long    width;
 42     long    height;
 43     short    colorPlane;
 44     short    bitColor;
 45     long    zipFormat;
 46     long    realSize;
 47     long    xPels;
 48     long    yPels;
 49     long    colorUse;
 50     long    colorImportant;
 51 }InfoHead;
 52 
 53 
 54 
 55 int RGB2BMP(unsigned char *pRGB, unsigned long RGBWidth, unsigned long RGBHeight, unsigned char *pBMP)
 56 {
 57     unsigned long RGBStride;
 58     unsigned long RGBSize;
 59     RGBStride = RGBWidth*3;
 60     RGBSize = RGBStride*RGBHeight;
 61 
 62     unsigned long RealRGBSize;
 63     RealRGBSize = (RGBStride+RGBWidth%4)*RGBHeight;
 64     unsigned char *pRealRGB = (unsigned char *)malloc(RealRGBSize);
 65 
 66     //RGB to BGR
 67     unsigned char tmp;
 68     for(unsigned long i=0; i<=RGBSize-3; i+=3)
 69     {
 70         tmp = pRGB[i];
 71         pRGB[i] = pRGB[i+2];
 72         pRGB[i+2] = tmp;
 73     }
 74 
 75     //line1 to line n
 76     unsigned char *pRealRGBIdx = pRealRGB;
 77     for(unsigned long i=1;i<=RGBHeight;i++)
 78     {
 79         memcpy(pRealRGBIdx,&pRGB[RGBSize-RGBStride*i],RGBStride);
 80         pRealRGBIdx += RGBStride;
 81         memset(pRealRGBIdx,0x00,RGBWidth%4);
 82         pRealRGBIdx += RGBWidth%4;
 83     }
 84     pRealRGBIdx = 0;
 85     
 86     BmpHead m_BMPHeader;
 87     m_BMPHeader.bfType[0]='B';
 88     m_BMPHeader.bfType[1]='M';
 89     m_BMPHeader.imageSize=RealRGBSize+0x36;
 90     m_BMPHeader.blank=0;
 91     m_BMPHeader.startPosition=0x36;
 92 
 93     InfoHead  m_BMPInfoHeader;
 94     m_BMPInfoHeader.Length=0x28; 
 95     m_BMPInfoHeader.width=RGBWidth;
 96     m_BMPInfoHeader.height=RGBHeight;
 97     m_BMPInfoHeader.colorPlane=1;
 98     m_BMPInfoHeader.bitColor=0x18;
 99     m_BMPInfoHeader.zipFormat=0;
100     m_BMPInfoHeader.realSize=RealRGBSize;
101     m_BMPInfoHeader.xPels=0;
102     m_BMPInfoHeader.yPels=0;
103     m_BMPInfoHeader.colorUse=0;
104     m_BMPInfoHeader.colorImportant=0;
105 
106     unsigned char *pBMPIndex = pBMP;
107 
108     memcpy(pBMPIndex,m_BMPHeader.bfType,sizeof(m_BMPHeader.bfType));
109     pBMPIndex += sizeof(m_BMPHeader.bfType);
110     memcpy(pBMPIndex,&m_BMPHeader.imageSize,sizeof(m_BMPHeader.imageSize));
111     pBMPIndex += sizeof(m_BMPHeader.imageSize);    
112     memcpy(pBMPIndex,&m_BMPHeader.blank,sizeof(m_BMPHeader.blank));
113     pBMPIndex += sizeof(m_BMPHeader.blank);    
114     memcpy(pBMPIndex,&m_BMPHeader.startPosition,sizeof(m_BMPHeader.startPosition));
115     pBMPIndex += sizeof(m_BMPHeader.startPosition);    
116     
117     memcpy(pBMPIndex,&m_BMPInfoHeader.Length,sizeof(m_BMPInfoHeader.Length));
118     pBMPIndex += sizeof(m_BMPInfoHeader.Length);
119     memcpy(pBMPIndex,&m_BMPInfoHeader.width,sizeof(m_BMPInfoHeader.width));
120     pBMPIndex += sizeof(m_BMPInfoHeader.width);
121     memcpy(pBMPIndex,&m_BMPInfoHeader.height,sizeof(m_BMPInfoHeader.height));
122     pBMPIndex += sizeof(m_BMPInfoHeader.height);
123     memcpy(pBMPIndex,&m_BMPInfoHeader.colorPlane,sizeof(m_BMPInfoHeader.colorPlane));
124     pBMPIndex += sizeof(m_BMPInfoHeader.colorPlane);
125     memcpy(pBMPIndex,&m_BMPInfoHeader.bitColor,sizeof(m_BMPInfoHeader.bitColor));
126     pBMPIndex += sizeof(m_BMPInfoHeader.bitColor);
127     memcpy(pBMPIndex,&m_BMPInfoHeader.zipFormat,sizeof(m_BMPInfoHeader.zipFormat));
128     pBMPIndex += sizeof(m_BMPInfoHeader.zipFormat);
129     memcpy(pBMPIndex,&m_BMPInfoHeader.realSize,sizeof(m_BMPInfoHeader.realSize));
130     pBMPIndex += sizeof(m_BMPInfoHeader.realSize);
131     memcpy(pBMPIndex,&m_BMPInfoHeader.xPels,sizeof(m_BMPInfoHeader.xPels));
132     pBMPIndex += sizeof(m_BMPInfoHeader.xPels);
133     memcpy(pBMPIndex,&m_BMPInfoHeader.yPels,sizeof(m_BMPInfoHeader.yPels));
134     pBMPIndex += sizeof(m_BMPInfoHeader.yPels);
135     memcpy(pBMPIndex,&m_BMPInfoHeader.colorUse,sizeof(m_BMPInfoHeader.colorUse));
136     pBMPIndex += sizeof(m_BMPInfoHeader.colorUse);
137     memcpy(pBMPIndex,&m_BMPInfoHeader.colorImportant,sizeof(m_BMPInfoHeader.colorImportant));
138     pBMPIndex += sizeof(m_BMPInfoHeader.colorImportant);
139 
140     memcpy(pBMPIndex,pRealRGB,RealRGBSize);
141     pBMPIndex =0;
142 
143     free(pRealRGB);
144     return 0;
145 }
146 
147 int RAW2RGB(unsigned short *pRAW, unsigned long RAWWidth, unsigned long RAWHeight, unsigned char *pRGB)
148 {
149     #define WIDTH RAWWidth
150 
151     #define RAW_IDX(i,j) (i*WIDTH+j)
152 
153     #define M_R_IDX(i,j) ((i*WIDTH+j)*3+0)
154     #define M_G_IDX(i,j) ((i*WIDTH+j)*3+1)
155     #define M_B_IDX(i,j) ((i*WIDTH+j)*3+2)
156 
157     #define L_R_IDX(i,j) ((i*WIDTH+j-1)*3+0)
158     #define L_G_IDX(i,j) ((i*WIDTH+j-1)*3+1)
159     #define L_B_IDX(i,j) ((i*WIDTH+j-1)*3+2)
160 
161     #define U_R_IDX(i,j) (((i-1)*WIDTH+j)*3+0)
162     #define U_G_IDX(i,j) (((i-1)*WIDTH+j)*3+1)
163     #define U_B_IDX(i,j) (((i-1)*WIDTH+j)*3+2)
164 
165     #define R_R_IDX(i,j) ((i*WIDTH+j+1)*3+0)
166     #define R_G_IDX(i,j) ((i*WIDTH+j+1)*3+1)
167     #define R_B_IDX(i,j) ((i*WIDTH+j+1)*3+2)
168 
169     #define D_R_IDX(i,j) (((i+1)*WIDTH+j)*3+0)
170     #define D_G_IDX(i,j) (((i+1)*WIDTH+j)*3+1)
171     #define D_B_IDX(i,j) (((i+1)*WIDTH+j)*3+2)
172 
173     #define W_R_IDX(i,j) (((i-1)*WIDTH+j-1)*3+0)
174     #define W_G_IDX(i,j) (((i-1)*WIDTH+j-1)*3+1)
175     #define W_B_IDX(i,j) (((i-1)*WIDTH+j-1)*3+2)
176 
177     #define X_R_IDX(i,j) (((i-1)*WIDTH+j+1)*3+0)
178     #define X_G_IDX(i,j) (((i-1)*WIDTH+j+1)*3+1)
179     #define X_B_IDX(i,j) (((i-1)*WIDTH+j+1)*3+2)
180 
181     #define Y_R_IDX(i,j) (((i+1)*WIDTH+j-1)*3+0)
182     #define Y_G_IDX(i,j) (((i+1)*WIDTH+j-1)*3+1)
183     #define Y_B_IDX(i,j) (((i+1)*WIDTH+j-1)*3+2)
184 
185     #define Z_R_IDX(i,j) (((i+1)*WIDTH+j+1)*3+0)
186     #define Z_G_IDX(i,j) (((i+1)*WIDTH+j+1)*3+1)
187     #define Z_B_IDX(i,j) (((i+1)*WIDTH+j+1)*3+2)
188 
189 
190 #if 1//把RAW转成带空穴的RGB
191 
192     for(unsigned long i=0;i<RAWHeight;i++)
193     {
194         for(unsigned long j=0;j<RAWWidth;j++)
195         {
196             //使用前对内存数据清零
197             pRGB[M_R_IDX(i,j)] = 0x00;
198             pRGB[M_G_IDX(i,j)] = 0x00;
199             pRGB[M_B_IDX(i,j)] = 0x00;
200 
201             if(i%2==0)//偶数行
202             {
203                 if(j%2==0)//偶数列
204                 {
205                     pRGB[M_R_IDX(i,j)] = pRAW[RAW_IDX(i,j)]>>2;//R
206                 }
207                 else//奇数列
208                 {
209                     pRGB[M_G_IDX(i,j)] = pRAW[RAW_IDX(i,j)]>>2;//G
210                 }
211             }
212             else//奇数行
213             {
214                 if( j%2==0)//偶数列
215                 {
216                     pRGB[M_G_IDX(i,j)] = pRAW[RAW_IDX(i,j)]>>2;//G
217                 }
218                 else//奇数列
219                 {
220                     pRGB[M_B_IDX(i,j)] = pRAW[RAW_IDX(i,j)]>>2;//B
221                 }    
222             }
223             
224         }
225     }
226 #endif
227 
228 
229 #if 1//使用双次线性差值法解马赛克
230 
231 #if 1//对G通道做双线性差值
232     for(unsigned long i=0;i<RAWHeight;i++)
233     {
234         for(unsigned long j=0;j<RAWWidth;j++)
235         {
236             if(i%2==0)//偶数行
237             {
238                 if(j%2==0)//偶数列
239                 {
240                     if(i==0 && j==0)
241                     {
242                         pRGB[M_G_IDX(i,j)] = (pRGB[R_G_IDX(i,j)]+pRGB[D_G_IDX(i,j)])/2;
243                     }
244                     else if(i==0)
245                     {
246                         pRGB[M_G_IDX(i,j)] = (pRGB[L_G_IDX(i,j)]+pRGB[R_G_IDX(i,j)]+pRGB[D_G_IDX(i,j)])/3;
247                     }
248                     else if(j==0)
249                     {
250                         pRGB[M_G_IDX(i,j)] = (pRGB[U_G_IDX(i,j)]+pRGB[R_G_IDX(i,j)]+pRGB[D_G_IDX(i,j)])/3;
251                     }
252                     else
253                     {
254                         pRGB[M_G_IDX(i,j)] = (pRGB[L_G_IDX(i,j)]+pRGB[U_G_IDX(i,j)]+pRGB[R_G_IDX(i,j)]+pRGB[D_G_IDX(i,j)])/4;
255                     }
256                 }
257             }
258             else//奇数行
259             {
260                 if(j%2!=0)//奇数列
261                 {
262                     if(i==RAWHeight-1 && j==RAWWidth-1)
263                     {
264                         pRGB[M_G_IDX(i,j)] = (pRGB[L_G_IDX(i,j)]+pRGB[U_G_IDX(i,j)])/2;
265                     }
266                     else if(i==RAWHeight-1)
267                     {
268                         pRGB[M_G_IDX(i,j)] = (pRGB[L_G_IDX(i,j)]+pRGB[U_G_IDX(i,j)]+pRGB[R_G_IDX(i,j)])/3;
269                     }
270                     else if(j==RAWWidth-1)
271                     {
272                         pRGB[M_G_IDX(i,j)] = (pRGB[L_G_IDX(i,j)]+pRGB[U_G_IDX(i,j)]+pRGB[D_G_IDX(i,j)])/3;
273                     }
274                     else
275                     {
276                         pRGB[M_G_IDX(i,j)] = (pRGB[L_G_IDX(i,j)]+ pRGB[U_G_IDX(i,j)]+ pRGB[R_G_IDX(i,j)]+ pRGB[D_G_IDX(i,j)])/4;
277                     }                    
278                 }
279             }
280         }
281     }
282 #endif
283 
284 #if 1//对R通道做双线性差值
285     for(unsigned long i=0;i<RAWHeight;i++)
286     {
287         for(unsigned long j=0;j<RAWWidth;j++)
288         {
289             if(i%2!=0)
290             {
291                 if(j%2!=0)
292                 {
293                     if(i==RAWHeight-1 && j==RAWWidth-1)
294                     {
295                         pRGB[M_R_IDX(i,j)] = pRGB[W_R_IDX(i,j)];
296                     }
297                     else if(i==RAWHeight-1)
298                     {
299                         pRGB[M_R_IDX(i,j)] = (pRGB[W_R_IDX(i,j)]+ pRGB[X_R_IDX(i,j)])/2;
300                     }
301                     else if(j==RAWWidth-1)
302                     {
303                         pRGB[M_R_IDX(i,j)] = (pRGB[W_R_IDX(i,j)]+ pRGB[Y_R_IDX(i,j)])/2;        
304                     }
305                     else
306                     {
307                         pRGB[M_R_IDX(i,j)] = (pRGB[W_R_IDX(i,j)]+ pRGB[X_R_IDX(i,j)]+ pRGB[Y_R_IDX(i,j)]+ pRGB[Z_R_IDX(i,j)])/4;                    
308                     }
309                 }
310             }
311         }
312     }
313     for(unsigned long i=0;i<RAWHeight;i++)
314     {
315         for(unsigned long j=0;j<RAWWidth;j++)
316         {
317             if(i%2==0)
318             {
319                 if(j%2!=0)
320                 {
321                     if(i==0 && j==RAWWidth-1)
322                     {
323                         pRGB[M_R_IDX(i,j)] = (pRGB[L_R_IDX(i,j)]+pRGB[D_R_IDX(i,j)])/2;
324                     }
325                     else if(i==0)
326                     {
327                         pRGB[M_R_IDX(i,j)] = (pRGB[L_R_IDX(i,j)]+pRGB[R_R_IDX(i,j)]+pRGB[D_R_IDX(i,j)])/3;
328                     }
329                     else if(j==RAWWidth-1)
330                     {
331                         pRGB[M_R_IDX(i,j)] = (pRGB[L_R_IDX(i,j)]+pRGB[U_R_IDX(i,j)]+pRGB[D_R_IDX(i,j)])/3;
332                     }
333                     else
334                     {
335                         pRGB[M_R_IDX(i,j)] = (pRGB[L_R_IDX(i,j)]+ pRGB[U_R_IDX(i,j)]+ pRGB[R_R_IDX(i,j)]+ pRGB[D_R_IDX(i,j)])/4;
336                     }
337                 }
338             }
339             else
340             {
341                 if(j%2==0)
342                 {
343                     if(i==RAWHeight-1 && j==0)
344                     {
345                         pRGB[M_R_IDX(i,j)] = (pRGB[U_R_IDX(i,j)]+pRGB[R_R_IDX(i,j)])/2;
346                     }
347                     else if(i==RAWHeight-1)
348                     {
349                         pRGB[M_R_IDX(i,j)] = (pRGB[L_R_IDX(i,j)]+pRGB[U_R_IDX(i,j)]+pRGB[R_R_IDX(i,j)])/3;
350                     }
351                     else if(j==0)
352                     {
353                         pRGB[M_R_IDX(i,j)] = (pRGB[U_R_IDX(i,j)]+pRGB[U_R_IDX(i,j)]+pRGB[D_R_IDX(i,j)])/3;
354                     }
355                     else
356                     {
357                         pRGB[M_R_IDX(i,j)] = (pRGB[L_R_IDX(i,j)]+ pRGB[U_R_IDX(i,j)]+ pRGB[R_R_IDX(i,j)]+ pRGB[D_R_IDX(i,j)])/4;
358                     }
359                 }
360             }
361         }
362     }
363 #endif
364 
365 
366 
367 #if 1//对B通道做双线性差值
368     for(unsigned long i=0;i<RAWHeight;i++)
369     {
370         for(unsigned long j=0;j<RAWWidth;j++)
371         {
372             if(i%2==0)
373             {
374                 if(j%2==0)
375                 {
376                     if(i==0 && j==0)
377                     {
378                         pRGB[M_B_IDX(i,j)] = pRGB[Z_B_IDX(i,j)];
379                     }
380                     else if(i==0)
381                     {
382                         pRGB[M_B_IDX(i,j)] = (pRGB[Y_B_IDX(i,j)]+ pRGB[Z_B_IDX(i,j)])/2;
383                     }
384                     else if(j==0)
385                     {
386                         pRGB[M_B_IDX(i,j)] = (pRGB[X_B_IDX(i,j)]+ pRGB[Z_B_IDX(i,j)])/2;        
387                     }
388                     else
389                     {
390                         pRGB[M_B_IDX(i,j)] = (pRGB[W_B_IDX(i,j)]+ pRGB[X_B_IDX(i,j)]+ pRGB[Y_B_IDX(i,j)]+ pRGB[Z_B_IDX(i,j)])/4;                    
391                     }
392                 }
393             }
394         }
395     }
396     for(unsigned long i=0;i<RAWHeight;i++)
397     {
398         for(unsigned long j=0;j<RAWWidth;j++)
399         {
400             if(i%2==0)
401             {
402                 if(j%2!=0)
403                 {
404                     if(i==0 && j==RAWWidth-1)
405                     {
406                         pRGB[M_B_IDX(i,j)] = (pRGB[L_B_IDX(i,j)]+pRGB[D_B_IDX(i,j)])/2;
407                     }
408                     else if(i==0)
409                     {
410                         pRGB[M_B_IDX(i,j)] = (pRGB[L_B_IDX(i,j)]+pRGB[R_B_IDX(i,j)]+pRGB[D_B_IDX(i,j)])/3;
411                     }
412                     else if(j==RAWWidth-1)
413                     {
414                         pRGB[M_B_IDX(i,j)] = (pRGB[L_B_IDX(i,j)]+pRGB[U_B_IDX(i,j)]+pRGB[D_B_IDX(i,j)])/3;
415                     }
416                     else
417                     {
418                         pRGB[M_B_IDX(i,j)] = (pRGB[L_B_IDX(i,j)]+pRGB[U_B_IDX(i,j)]+pRGB[R_B_IDX(i,j)]+pRGB[D_B_IDX(i,j)])/4;
419                     }
420                 }
421             }
422             else
423             {
424                 if(j%2==0)
425                 {
426                     if(i==RAWHeight-1 && j==0)
427                     {
428                         pRGB[M_B_IDX(i,j)] = (pRGB[U_B_IDX(i,j)]+pRGB[R_B_IDX(i,j)])/2;
429                     }
430                     else if(i==RAWHeight-1)
431                     {
432                         pRGB[M_B_IDX(i,j)] = (pRGB[L_B_IDX(i,j)]+pRGB[U_B_IDX(i,j)]+pRGB[R_B_IDX(i,j)])/3;
433                     }
434                     else if(j==0)
435                     {
436                         pRGB[M_B_IDX(i,j)] = (pRGB[U_B_IDX(i,j)]+pRGB[U_B_IDX(i,j)]+pRGB[D_B_IDX(i,j)])/3;
437                     }
438                     else
439                     {
440                         pRGB[M_B_IDX(i,j)] = (pRGB[L_B_IDX(i,j)]+pRGB[U_B_IDX(i,j)]+pRGB[R_B_IDX(i,j)]+pRGB[D_B_IDX(i,j)])/4;
441                     }
442                 }
443             }
444         }
445     }
446 
447 #endif
448 
449 
450 #endif
451 
452 
453 
454 
455     return 0;
456 }
457 
458 
459 int main()
460 {
461     unsigned long RAWWidth = IMAGE_WIDTH;
462     unsigned long RAWHeight = IMAGE_HEIGHT;
463     unsigned long RAWSize = RAWWidth*RAWHeight*2;
464     unsigned short *pRAW = (unsigned short *)malloc(RAWSize);
465     memset(pRAW, 0x00, RAWSize);
466 
467     FILE *fp_read_raw = fopen("RAW.raw", "rb");
468     if (fp_read_raw == NULL)
469     {
470         return -1;
471     }
472     fread (pRAW, sizeof(unsigned char), RAWSize, fp_read_raw) ;
473     fclose(fp_read_raw);
474 
475     unsigned long RGBWidth = IMAGE_WIDTH;
476     unsigned long RGBHeight = IMAGE_HEIGHT;
477     unsigned long RGBSize = RGBWidth*RGBHeight*3;
478     unsigned char *pRGB = (unsigned char *)malloc(RGBSize);
479     memset(pRGB, 0x00, RGBSize);
480 
481     RAW2RGB(pRAW, RAWWidth, RAWHeight, pRGB);
482 
483     unsigned long BMPSize = (RGBWidth*3+RGBWidth%4)*RGBHeight+0x36;
484     unsigned char *pBMP = (unsigned char *)malloc(BMPSize);
485     memset(pBMP, 0x00, BMPSize);
486 
487     RGB2BMP(pRGB, RGBWidth, RGBHeight, pBMP);
488 
489     FILE *fp_write_bmp = fopen("save.bmp", "wb");
490     if (fp_write_bmp == NULL)
491     {
492         return -1;
493     }
494     fwrite(pBMP,1,BMPSize,fp_write_bmp);
495     fclose(fp_write_bmp);
496 
497     free(pRAW);
498     free(pRGB);
499     free(pBMP);
500     //getchar();
501     return 0;
502 }

猜你喜欢

转载自www.cnblogs.com/cwy6688/p/12053088.html