⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcraw.c

📁 相片处理程序,纯C语言,从数码相机RAW格式图像转换到任何系统的计算机图像
💻 C
📖 第 1 页 / 共 5 页
字号:
  int row, col;  if (raw_width * 2 < width * 3)    raw_width = raw_width * 3 / 2;	/* Convert raw_width to bytes */  getbits(-1);  for (row=0; row < height; row++) {    for (col=0; col < left_margin; col++)      getbits(12);    for (col=0; col < width; col++)      BAYER(row,col) = getbits(12);    for (col = (width+left_margin)*3/2; col < raw_width; col++)      if (getbits(8) && raw_width-col < 35 && width != 3896) derror();  }}void CLASS unpacked_load_raw(){  ushort *pixel;  int row, col, bits=0;  while (1 << ++bits < maximum);  fseek (ifp, (top_margin*raw_width + left_margin) * 2, SEEK_CUR);  pixel = (ushort *) calloc (width, sizeof *pixel);  merror (pixel, "unpacked_load_raw()");  for (row=0; row < height; row++) {    read_shorts (pixel, width);    fseek (ifp, 2*(raw_width - width), SEEK_CUR);    for (col=0; col < width; col++)      if ((BAYER2(row,col) = pixel[col]) >> bits) derror();  }  free (pixel);}void CLASS nokia_load_raw(){  uchar  *data,  *dp;  ushort *pixel, *pix;  int dwide, row, c;  dwide = raw_width * 5 / 4;  data = (uchar *) malloc (dwide + raw_width*2);  merror (data, "nokia_load_raw()");  pixel = (ushort *) (data + dwide);  for (row=0; row < raw_height; row++) {    if (fread (data, 1, dwide, ifp) < dwide) derror();    for (dp=data, pix=pixel; pix < pixel+raw_width; dp+=5, pix+=4)      FORC4 pix[c] = (dp[c] << 2) | (dp[4] >> (c << 1) & 3);    if (row < top_margin)      FORC(width) black += pixel[c];    else      FORC(width) BAYER(row-top_margin,c) = pixel[c];  }  free (data);  if (top_margin) black /= top_margin * width;  maximum = 0x3ff;}unsigned CLASS pana_bits (int nbits){  static uchar buf[16], vbits=0;  if (!vbits && fread (buf, 1, 16, ifp) < 16) derror();  vbits = (vbits - nbits) & 127;  return (buf[(vbits >> 3)+1] << 8 | buf[vbits >> 3])	>> (vbits & 7) & ~(-1 << nbits);}void CLASS panasonic_load_raw(){  int row, col, i, j, sh=0, pred[2], nonz[2];  raw_width = (raw_width+13)/14*14;  for (row=0; row < height; row++)    for (col=0; col < raw_width; col++) {      if ((i = col % 14) < 2)	nonz[i] = pred[i] = pana_bits(12);      else {	if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2));	if ((j = pana_bits(8))) {	  if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4)	       pred[i & 1] &= ~(-1 << sh);	  pred[i & 1] += nonz[i & 1] ? j << sh : j;	  nonz[i & 1] = 1;	}      }      if (col < width)	if ((BAYER(row,col) = pred[col & 1]) >> 12) derror();    }}void CLASS olympus_e300_load_raw(){  uchar  *data,  *dp;  ushort *pixel, *pix;  int dwide, row, col;  dwide = raw_width * 16 / 10;  fseek (ifp, dwide*top_margin, SEEK_CUR);  data = (uchar *) malloc (dwide + raw_width*2);  merror (data, "olympus_e300_load_raw()");  pixel = (ushort *) (data + dwide);  for (row=0; row < height; row++) {    if (fread (data, 1, dwide, ifp) < dwide) derror();    for (dp=data, pix=pixel; pix < pixel+raw_width; dp+=3, pix+=2) {      if (((dp-data) & 15) == 15)	if (*dp++ && pix < pixel+width+left_margin) derror();      pix[0] = dp[1] << 8 | dp[0];      pix[1] = dp[2] << 4 | dp[1] >> 4;    }    for (col=0; col < width; col++)      BAYER(row,col) = (pixel[col+left_margin] & 0xfff);  }  free (data);  maximum >>= 4;  black >>= 4;}void CLASS olympus_e410_load_raw(){  int row, col, nbits, sign, low, high, i, w, n, nw;  int acarry[2][3], *carry, pred, diff;  fseek (ifp, 7, SEEK_CUR);  getbits(-1);  for (row=0; row < height; row++) {    memset (acarry, 0, sizeof acarry);    for (col=0; col < width; col++) {      carry = acarry[col & 1];      i = 2 * (carry[2] < 3);      for (nbits=2+i; (ushort) carry[0] >> (nbits+i); nbits++);      sign = getbits(1) * -1;      low  = getbits(2);      for (high=0; high < 12; high++)	if (getbits(1)) break;      if (high == 12)	high = getbits(16-nbits) >> 1;      carry[0] = (high << nbits) | getbits(nbits);      diff = (carry[0] ^ sign) + carry[1];      carry[1] = (diff*3 + carry[1]) >> 5;      carry[2] = carry[0] > 16 ? 0 : carry[2]+1;      if (row < 2 && col < 2) pred = 0;      else if (row < 2) pred = BAYER(row,col-2);      else if (col < 2) pred = BAYER(row-2,col);      else {	w  = BAYER(row,col-2);	n  = BAYER(row-2,col);	nw = BAYER(row-2,col-2);	if ((w < nw && nw < n) || (n < nw && nw < w)) {	  if (ABS(w-nw) > 32 || ABS(n-nw) > 32)	    pred = w + n - nw;	  else pred = (w + n) >> 1;	} else pred = ABS(w-nw) > ABS(n-nw) ? w : n;      }      if ((BAYER(row,col) = pred + ((diff << 2) | low)) >> 12) derror();    }  }}void CLASS olympus_cseries_load_raw(){  int irow, row, col;  for (irow=0; irow < height; irow++) {    row = irow * 2 % height + irow / (height/2);    if (row < 2) {      fseek (ifp, data_offset - row*(-width*height*3/4 & -2048), SEEK_SET);      getbits(-1);    }    for (col=0; col < width; col++)      BAYER(row,col) = getbits(12);  }  black >>= 4;}void CLASS minolta_rd175_load_raw(){  uchar pixel[768];  unsigned irow, box, row, col;  for (irow=0; irow < 1481; irow++) {    if (fread (pixel, 1, 768, ifp) < 768) derror();    box = irow / 82;    row = irow % 82 * 12 + ((box < 12) ? box | 1 : (box-12)*2);    switch (irow) {      case 1477: case 1479: continue;      case 1476: row = 984; break;      case 1480: row = 985; break;      case 1478: row = 985; box = 1;    }    if ((box < 12) && (box & 1)) {      for (col=0; col < 1533; col++, row ^= 1)	if (col != 1) BAYER(row,col) = (col+1) & 2 ?		   pixel[col/2-1] + pixel[col/2+1] : pixel[col/2] << 1;      BAYER(row,1)    = pixel[1]   << 1;      BAYER(row,1533) = pixel[765] << 1;    } else      for (col=row & 1; col < 1534; col+=2)	BAYER(row,col) = pixel[col/2] << 1;  }  maximum = 0xff << 1;}void CLASS casio_qv5700_load_raw(){  uchar  data[3232],  *dp;  ushort pixel[2576], *pix;  int row, col;  for (row=0; row < height; row++) {    fread (data, 1, 3232, ifp);    for (dp=data, pix=pixel; dp < data+3220; dp+=5, pix+=4) {      pix[0] = (dp[0] << 2) + (dp[1] >> 6);      pix[1] = (dp[1] << 4) + (dp[2] >> 4);      pix[2] = (dp[2] << 6) + (dp[3] >> 2);      pix[3] = (dp[3] << 8) + (dp[4]     );    }    for (col=0; col < width; col++)      BAYER(row,col) = (pixel[col] & 0x3ff);  }  maximum = 0x3fc;}void CLASS quicktake_100_load_raw(){  uchar pixel[484][644];  static const short gstep[16] =  { -89,-60,-44,-32,-22,-15,-8,-2,2,8,15,22,32,44,60,89 };  static const short rstep[6][4] =  { {  -3,-1,1,3  }, {  -5,-1,1,5  }, {  -8,-2,2,8  },    { -13,-3,3,13 }, { -19,-4,4,19 }, { -28,-6,6,28 } };  static const short curve[256] =  { 0,1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,    28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53,    54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,    79,80,81,82,83,84,86,88,90,92,94,97,99,101,103,105,107,110,112,114,116,    118,120,123,125,127,129,131,134,136,138,140,142,144,147,149,151,153,155,    158,160,162,164,166,168,171,173,175,177,179,181,184,186,188,190,192,195,    197,199,201,203,205,208,210,212,214,216,218,221,223,226,230,235,239,244,    248,252,257,261,265,270,274,278,283,287,291,296,300,305,309,313,318,322,    326,331,335,339,344,348,352,357,361,365,370,374,379,383,387,392,396,400,    405,409,413,418,422,426,431,435,440,444,448,453,457,461,466,470,474,479,    483,487,492,496,500,508,519,531,542,553,564,575,587,598,609,620,631,643,    654,665,676,687,698,710,721,732,743,754,766,777,788,799,810,822,833,844,    855,866,878,889,900,911,922,933,945,956,967,978,989,1001,1012,1023 };  int rb, row, col, sharp, val=0;  getbits(-1);  memset (pixel, 0x80, sizeof pixel);  for (row=2; row < height+2; row++) {    for (col=2+(row & 1); col < width+2; col+=2) {      val = ((pixel[row-1][col-1] + 2*pixel[row-1][col+1] +		pixel[row][col-2]) >> 2) + gstep[getbits(4)];      pixel[row][col] = val = LIM(val,0,255);      if (col < 4)	pixel[row][col-2] = pixel[row+1][~row & 1] = val;      if (row == 2)	pixel[row-1][col+1] = pixel[row-1][col+3] = val;    }    pixel[row][col] = val;  }  for (rb=0; rb < 2; rb++)    for (row=2+rb; row < height+2; row+=2)      for (col=3-(row & 1); col < width+2; col+=2) {	if (row < 4 || col < 4) sharp = 2;	else {	  val = ABS(pixel[row-2][col] - pixel[row][col-2])	      + ABS(pixel[row-2][col] - pixel[row-2][col-2])	      + ABS(pixel[row][col-2] - pixel[row-2][col-2]);	  sharp = val <  4 ? 0 : val <  8 ? 1 : val < 16 ? 2 :		  val < 32 ? 3 : val < 48 ? 4 : 5;	}	val = ((pixel[row-2][col] + pixel[row][col-2]) >> 1)	      + rstep[sharp][getbits(2)];	pixel[row][col] = val = LIM(val,0,255);	if (row < 4) pixel[row-2][col+2] = val;	if (col < 4) pixel[row+2][col-2] = val;      }  for (row=2; row < height+2; row++)    for (col=3-(row & 1); col < width+2; col+=2) {      val = ((pixel[row][col-1] + (pixel[row][col] << 2) +	      pixel[row][col+1]) >> 1) - 0x100;      pixel[row][col] = LIM(val,0,255);    }  for (row=0; row < height; row++)    for (col=0; col < width; col++)      BAYER(row,col) = curve[pixel[row+2][col+2]];  maximum = 0x3ff;}const int * CLASS make_decoder_int (const int *source, int level){  struct decode *cur;  cur = free_decode++;  if (level < source[0]) {    cur->branch[0] = free_decode;    source = make_decoder_int (source, level+1);    cur->branch[1] = free_decode;    source = make_decoder_int (source, level+1);  } else {    cur->leaf = source[1];    source += 2;  }  return source;}int CLASS radc_token (int tree){  int t;  static struct decode *dstart[18], *dindex;  static const int *s, source[] = {    1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8,    1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8,    2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8,    2,0, 2,1, 2,3, 3,2, 4,4, 5,6, 6,7, 7,5, 7,8,    2,1, 2,4, 3,0, 3,2, 3,3, 4,7, 5,5, 6,6, 6,8,    2,3, 3,1, 3,2, 3,4, 3,5, 3,6, 4,7, 5,0, 5,8,    2,3, 2,6, 3,0, 3,1, 4,4, 4,5, 4,7, 5,2, 5,8,    2,4, 2,7, 3,3, 3,6, 4,1, 4,2, 4,5, 5,0, 5,8,    2,6, 3,1, 3,3, 3,5, 3,7, 3,8, 4,0, 5,2, 5,4,    2,0, 2,1, 3,2, 3,3, 4,4, 4,5, 5,6, 5,7, 4,8,    1,0, 2,2, 2,-2,    1,-3, 1,3,    2,-17, 2,-5, 2,5, 2,17,    2,-7, 2,2, 2,9, 2,18,    2,-18, 2,-9, 2,-2, 2,7,    2,-28, 2,28, 3,-49, 3,-9, 3,9, 4,49, 5,-79, 5,79,    2,-1, 2,13, 2,26, 3,39, 4,-16, 5,55, 6,-37, 6,76,    2,-26, 2,-13, 2,1, 3,-39, 4,16, 5,-55, 6,-76, 6,37  };  if (free_decode == first_decode)    for (s=source, t=0; t < 18; t++) {      dstart[t] = free_decode;      s = make_decoder_int (s, 0);    }  if (tree == 18) {    if (kodak_cbpp == 243)      return (getbits(6) << 2) + 2;	/* most DC50 photos */    else      return (getbits(5) << 3) + 4;	/* DC40, Fotoman Pixtura */  }  for (dindex = dstart[tree]; dindex->branch[0]; )    dindex = dindex->branch[getbits(1)];  return dindex->leaf;}#define FORYX for (y=1; y < 3; y++) for (x=col+1; x >= col; x--)#define PREDICTOR (c ? (buf[c][y-1][x] + buf[c][y][x+1]) / 2 \: (buf[c][y-1][x+1] + 2*buf[c][y-1][x] + buf[c][y][x+1]) / 4)void CLASS kodak_radc_load_raw(){  int row, col, tree, nreps, rep, step, i, c, s, r, x, y, val;  short last[3] = { 16,16,16 }, mul[3], buf[3][3][386];  init_decoder();  getbits(-1);  for (i=0; i < sizeof(buf)/sizeof(short); i++)    buf[0][0][i] = 2048;  for (row=0; row < height; row+=4) {    FORC3 mul[c] = getbits(6);    FORC3 {      val = ((0x1000000/last[c] + 0x7ff) >> 12) * mul[c];      s = val > 65564 ? 10:12;      x = ~(-1 << (s-1));      val <<= 12-s;      for (i=0; i < sizeof(buf[0])/sizeof(short); i++)	buf[c][0][i] = (buf[c][0][i] * val + x) >> s;      last[c] = mul[c];      for (r=0; r <= !c; r++) {	buf[c][1][width/2] = buf[c][2][width/2] = mul[c] << 7;	for (tree=1, col=width/2; col > 0; ) {	  if ((tree = radc_token(tree))) {	    col -= 2;	    if (tree == 8)	      FORYX buf[c][y][x] = radc_token(tree+10) * mul[c];	    else	      FORYX buf[c][y][x] = radc_token(tree+10) * 16 + PREDICTOR;	  } else	    do {	      nreps = (col > 2) ? radc_token(9) + 1 : 1;	      for (rep=0; rep < 8 && rep < nreps && col > 0; rep++) {		col -= 2;		FORYX buf[c][y][x] = PREDICTOR;		if (rep & 1) {		  step = radc_token(10) << 4;		  FORYX buf[c][y][x] += step;		}	      }	    } while (nreps == 9);	}	for (y=0; y < 2; y++)	  for (x=0; x < width/2; x++) {	    val = (buf[c][y+1][x] << 4) / mul[c];	    if (val < 0) val = 0;	    if (c) BAYER(row+y*2+c-1,x*2+2-c) = val;	    else   BAYER(row+r*2+y,x*2+y) = val;	  }	memcpy (buf[c][0]+!c, buf[c][2], sizeof buf[c][0]-2*!c);      }    }    for (y=row; y < row+4; y++)      for (x=0; x < width; x++)	if ((x+y) & 1) {	  r = x ? x-1 : x+1;	  s = x+1 < width ? x+1 : x-1;	  val = (BAYER(y,x)-2048)*2 + (BAYER(y,r)+BAYER(y,s))/2;	  if (val < 0) val = 0;	  BAYER(y,x) = val;	}  }  maximum = 0xfff;  use_gamma = 0;}#undef FORYX#undef PREDICTOR#ifdef NO_JPEGvoid CLASS kodak_jpeg_load_raw() {}#elseMETHODDEF(boolean)fill_input_buffer (j_decompress_ptr cinfo){  static uchar jpeg_buffer[4096];  size_t nbytes;  nbytes = fread (jpeg_buffer, 1, 4096, ifp);  swab (jpeg_buffer, jpeg_buffer, nbytes);  cinfo->src->next_input_byte = jpeg_buffer;  cinfo->src->bytes_in_buffer = nbytes;  return TRUE;}void CLASS kodak_jpeg_load_raw(){  struct jpeg_decompress_struct cinfo;  struct jpeg_error_mgr jerr;  JSAMPARRAY buf;  JSAMPLE (*pixel)[3];  int row, col;  cinfo.err = jpeg_std_error (&jerr);  jpeg_create_decompress (&cinfo);  jpeg_st

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -