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 }
把RAW转成RGB后保存为BMP的示例
猜你喜欢
转载自www.cnblogs.com/cwy6688/p/12053088.html
今日推荐
周排行