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 }