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

📄 dcraw.c

📁 相片处理程序,纯C语言,从数码相机RAW格式图像转换到任何系统的计算机图像
💻 C
📖 第 1 页 / 共 5 页
字号:
  mc = pre_mul[1] / pre_mul[2];  yc = pre_mul[3] / pre_mul[2];  if (mc > 1 && mc <= 1.28 && yc < 0.8789) t=1;  if (mc > 1.28 && mc <= 2) {    if  (yc < 0.8789) t=3;    else if (yc <= 2) t=4;  }  if (flash_used) t=5;  for (raw_color = i=0; i < 3; i++)    FORCC rgb_cam[i][c] = table[t][i*4 + c] / 1024.0;}void CLASS canon_600_load_raw(){  uchar  data[1120], *dp;  ushort pixel[896], *pix;  int irow, row, col, val;  static const short mul[4][2] =  { { 1141,1145 }, { 1128,1109 }, { 1178,1149 }, { 1128,1109 } };  for (irow=row=0; irow < height; irow++) {    if (fread (data, 1, raw_width*5/4, ifp) < raw_width*5/4) derror();    for (dp=data, pix=pixel; dp < data+1120; dp+=10, pix+=8) {      pix[0] = (dp[0] << 2) + (dp[1] >> 6    );      pix[1] = (dp[2] << 2) + (dp[1] >> 4 & 3);      pix[2] = (dp[3] << 2) + (dp[1] >> 2 & 3);      pix[3] = (dp[4] << 2) + (dp[1]      & 3);      pix[4] = (dp[5] << 2) + (dp[9]      & 3);      pix[5] = (dp[6] << 2) + (dp[9] >> 2 & 3);      pix[6] = (dp[7] << 2) + (dp[9] >> 4 & 3);      pix[7] = (dp[8] << 2) + (dp[9] >> 6    );    }    for (col=0; col < width; col++)      BAYER(row,col) = pixel[col];    for (col=width; col < raw_width; col++)      black += pixel[col];    if ((row+=2) > height) row = 1;  }  if (raw_width > width)    black = black / ((raw_width - width) * height) - 4;  for (row=0; row < height; row++)    for (col=0; col < width; col++) {      if ((val = BAYER(row,col) - black) < 0) val = 0;      val = val * mul[row & 3][col & 1] >> 9;      BAYER(row,col) = val;    }  canon_600_fixed_wb(1311);  canon_600_auto_wb();  canon_600_coeff();  maximum = (0x3ff - black) * 1109 >> 9;  black = 0;}void CLASS remove_zeroes(){  unsigned row, col, tot, n, r, c;  for (row=0; row < height; row++)    for (col=0; col < width; col++)      if (BAYER(row,col) == 0) {	tot = n = 0;	for (r = row-2; r <= row+2; r++)	  for (c = col-2; c <= col+2; c++)	    if (r < height && c < width &&		FC(r,c) == FC(row,col) && BAYER(r,c))	      tot += (n++,BAYER(r,c));	if (n) BAYER(row,col) = tot/n;      }}int CLASS canon_s2is(){  unsigned row;  for (row=0; row < 100; row++) {    fseek (ifp, row*3340 + 3284, SEEK_SET);    if (getc(ifp) > 15) return 1;  }  return 0;}void CLASS canon_a5_load_raw(){  ushort data[2565], *dp, pixel;  int vbits=0, buf=0, row, col, bc=0;  order = 0x4949;  for (row=-top_margin; row < raw_height-top_margin; row++) {    read_shorts (dp=data, raw_width * 10 / 16);    for (col=-left_margin; col < raw_width-left_margin; col++) {      if (vbits < 10)	buf = (vbits += 16, (buf << 16) + *dp++);      pixel = buf >> (vbits -= 10) & 0x3ff;      if ((unsigned) row < height && (unsigned) col < width)	BAYER(row,col) = pixel;      else if (col > 1-left_margin && col != width)	black += (bc++,pixel);    }  }  if (bc) black /= bc;  maximum = 0x3ff;  if (raw_width > 1600) remove_zeroes();}/*   getbits(-1) initializes the buffer   getbits(n) where 0 <= n <= 25 returns an n-bit integer */unsigned CLASS getbits (int nbits){  static unsigned bitbuf=0;  static int vbits=0, reset=0;  unsigned c;  if (nbits == -1)    return bitbuf = vbits = reset = 0;  if (nbits == 0 || reset) return 0;  while (vbits < nbits) {    if ((c = fgetc(ifp)) == EOF) derror();    if ((reset = zero_after_ff && c == 0xff && fgetc(ifp))) return 0;    bitbuf = (bitbuf << 8) + (uchar) c;    vbits += 8;  }  vbits -= nbits;  return bitbuf << (32-nbits-vbits) >> (32-nbits);}void CLASS init_decoder(){  memset (first_decode, 0, sizeof first_decode);  free_decode = first_decode;}/*   Construct a decode tree according the specification in *source.   The first 16 bytes specify how many codes should be 1-bit, 2-bit   3-bit, etc.  Bytes after that are the leaf values.   For example, if the source is    { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,      0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff  },   then the code is	00		0x04	010		0x03	011		0x05	100		0x06	101		0x02	1100		0x07	1101		0x01	11100		0x08	11101		0x09	11110		0x00	111110		0x0a	1111110		0x0b	1111111		0xff */uchar * CLASS make_decoder (const uchar *source, int level){  struct decode *cur;  static int leaf;  int i, next;  if (level==0) leaf=0;  cur = free_decode++;  if (free_decode > first_decode+2048) {    fprintf (stderr,_("%s: decoder table overflow\n"), ifname);    longjmp (failure, 2);  }  for (i=next=0; i <= leaf && next < 16; )    i += source[next++];  if (i > leaf) {    if (level < next) {      cur->branch[0] = free_decode;      make_decoder (source, level+1);      cur->branch[1] = free_decode;      make_decoder (source, level+1);    } else      cur->leaf = source[16 + leaf++];  }  return (uchar *) source + 16 + leaf;}void CLASS crw_init_tables (unsigned table){  static const uchar first_tree[3][29] = {    { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,      0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff  },    { 0,2,2,3,1,1,1,1,2,0,0,0,0,0,0,0,      0x03,0x02,0x04,0x01,0x05,0x00,0x06,0x07,0x09,0x08,0x0a,0x0b,0xff  },    { 0,0,6,3,1,1,2,0,0,0,0,0,0,0,0,0,      0x06,0x05,0x07,0x04,0x08,0x03,0x09,0x02,0x00,0x0a,0x01,0x0b,0xff  },  };  static const uchar second_tree[3][180] = {    { 0,2,2,2,1,4,2,1,2,5,1,1,0,0,0,139,      0x03,0x04,0x02,0x05,0x01,0x06,0x07,0x08,      0x12,0x13,0x11,0x14,0x09,0x15,0x22,0x00,0x21,0x16,0x0a,0xf0,      0x23,0x17,0x24,0x31,0x32,0x18,0x19,0x33,0x25,0x41,0x34,0x42,      0x35,0x51,0x36,0x37,0x38,0x29,0x79,0x26,0x1a,0x39,0x56,0x57,      0x28,0x27,0x52,0x55,0x58,0x43,0x76,0x59,0x77,0x54,0x61,0xf9,      0x71,0x78,0x75,0x96,0x97,0x49,0xb7,0x53,0xd7,0x74,0xb6,0x98,      0x47,0x48,0x95,0x69,0x99,0x91,0xfa,0xb8,0x68,0xb5,0xb9,0xd6,      0xf7,0xd8,0x67,0x46,0x45,0x94,0x89,0xf8,0x81,0xd5,0xf6,0xb4,      0x88,0xb1,0x2a,0x44,0x72,0xd9,0x87,0x66,0xd4,0xf5,0x3a,0xa7,      0x73,0xa9,0xa8,0x86,0x62,0xc7,0x65,0xc8,0xc9,0xa1,0xf4,0xd1,      0xe9,0x5a,0x92,0x85,0xa6,0xe7,0x93,0xe8,0xc1,0xc6,0x7a,0x64,      0xe1,0x4a,0x6a,0xe6,0xb3,0xf1,0xd3,0xa5,0x8a,0xb2,0x9a,0xba,      0x84,0xa4,0x63,0xe5,0xc5,0xf3,0xd2,0xc4,0x82,0xaa,0xda,0xe4,      0xf2,0xca,0x83,0xa3,0xa2,0xc3,0xea,0xc2,0xe2,0xe3,0xff,0xff  },    { 0,2,2,1,4,1,4,1,3,3,1,0,0,0,0,140,      0x02,0x03,0x01,0x04,0x05,0x12,0x11,0x06,      0x13,0x07,0x08,0x14,0x22,0x09,0x21,0x00,0x23,0x15,0x31,0x32,      0x0a,0x16,0xf0,0x24,0x33,0x41,0x42,0x19,0x17,0x25,0x18,0x51,      0x34,0x43,0x52,0x29,0x35,0x61,0x39,0x71,0x62,0x36,0x53,0x26,      0x38,0x1a,0x37,0x81,0x27,0x91,0x79,0x55,0x45,0x28,0x72,0x59,      0xa1,0xb1,0x44,0x69,0x54,0x58,0xd1,0xfa,0x57,0xe1,0xf1,0xb9,      0x49,0x47,0x63,0x6a,0xf9,0x56,0x46,0xa8,0x2a,0x4a,0x78,0x99,      0x3a,0x75,0x74,0x86,0x65,0xc1,0x76,0xb6,0x96,0xd6,0x89,0x85,      0xc9,0xf5,0x95,0xb4,0xc7,0xf7,0x8a,0x97,0xb8,0x73,0xb7,0xd8,      0xd9,0x87,0xa7,0x7a,0x48,0x82,0x84,0xea,0xf4,0xa6,0xc5,0x5a,      0x94,0xa4,0xc6,0x92,0xc3,0x68,0xb5,0xc8,0xe4,0xe5,0xe6,0xe9,      0xa2,0xa3,0xe3,0xc2,0x66,0x67,0x93,0xaa,0xd4,0xd5,0xe7,0xf8,      0x88,0x9a,0xd7,0x77,0xc4,0x64,0xe2,0x98,0xa5,0xca,0xda,0xe8,      0xf3,0xf6,0xa9,0xb2,0xb3,0xf2,0xd2,0x83,0xba,0xd3,0xff,0xff  },    { 0,0,6,2,1,3,3,2,5,1,2,2,8,10,0,117,      0x04,0x05,0x03,0x06,0x02,0x07,0x01,0x08,      0x09,0x12,0x13,0x14,0x11,0x15,0x0a,0x16,0x17,0xf0,0x00,0x22,      0x21,0x18,0x23,0x19,0x24,0x32,0x31,0x25,0x33,0x38,0x37,0x34,      0x35,0x36,0x39,0x79,0x57,0x58,0x59,0x28,0x56,0x78,0x27,0x41,      0x29,0x77,0x26,0x42,0x76,0x99,0x1a,0x55,0x98,0x97,0xf9,0x48,      0x54,0x96,0x89,0x47,0xb7,0x49,0xfa,0x75,0x68,0xb6,0x67,0x69,      0xb9,0xb8,0xd8,0x52,0xd7,0x88,0xb5,0x74,0x51,0x46,0xd9,0xf8,      0x3a,0xd6,0x87,0x45,0x7a,0x95,0xd5,0xf6,0x86,0xb4,0xa9,0x94,      0x53,0x2a,0xa8,0x43,0xf5,0xf7,0xd4,0x66,0xa7,0x5a,0x44,0x8a,      0xc9,0xe8,0xc8,0xe7,0x9a,0x6a,0x73,0x4a,0x61,0xc7,0xf4,0xc6,      0x65,0xe9,0x72,0xe6,0x71,0x91,0x93,0xa6,0xda,0x92,0x85,0x62,      0xf3,0xc5,0xb2,0xa4,0x84,0xba,0x64,0xa5,0xb3,0xd2,0x81,0xe5,      0xd3,0xaa,0xc4,0xca,0xf2,0xb1,0xe4,0xd1,0x83,0x63,0xea,0xc3,      0xe2,0x82,0xf1,0xa3,0xc2,0xa1,0xc1,0xe3,0xa2,0xe1,0xff,0xff  }  };  if (table > 2) table = 2;  init_decoder();  make_decoder ( first_tree[table], 0);  second_decode = free_decode;  make_decoder (second_tree[table], 0);}/*   Return 0 if the image starts with compressed data,   1 if it starts with uncompressed low-order bits.   In Canon compressed data, 0xff is always followed by 0x00. */int CLASS canon_has_lowbits(){  uchar test[0x4000];  int ret=1, i;  fseek (ifp, 0, SEEK_SET);  fread (test, 1, sizeof test, ifp);  for (i=540; i < sizeof test - 1; i++)    if (test[i] == 0xff) {      if (test[i+1]) return 1;      ret=0;    }  return ret;}void CLASS canon_compressed_load_raw(){  ushort *pixel, *prow;  int nblocks, lowbits, i, row, r, col, save, val;  unsigned irow, icol;  struct decode *decode, *dindex;  int block, diffbuf[64], leaf, len, diff, carry=0, pnum=0, base[2];  uchar c;  crw_init_tables (tiff_compress);  pixel = (ushort *) calloc (raw_width*8, sizeof *pixel);  merror (pixel, "canon_compressed_load_raw()");  lowbits = canon_has_lowbits();  if (!lowbits) maximum = 0x3ff;  fseek (ifp, 540 + lowbits*raw_height*raw_width/4, SEEK_SET);  zero_after_ff = 1;  getbits(-1);  for (row=0; row < raw_height; row+=8) {    nblocks = MIN (8, raw_height-row) * raw_width >> 6;    for (block=0; block < nblocks; block++) {      memset (diffbuf, 0, sizeof diffbuf);      decode = first_decode;      for (i=0; i < 64; i++ ) {	for (dindex=decode; dindex->branch[0]; )	  dindex = dindex->branch[getbits(1)];	leaf = dindex->leaf;	decode = second_decode;	if (leaf == 0 && i) break;	if (leaf == 0xff) continue;	i  += leaf >> 4;	len = leaf & 15;	if (len == 0) continue;	diff = getbits(len);	if ((diff & (1 << (len-1))) == 0)	  diff -= (1 << len) - 1;	if (i < 64) diffbuf[i] = diff;      }      diffbuf[0] += carry;      carry = diffbuf[0];      for (i=0; i < 64; i++ ) {	if (pnum++ % raw_width == 0)	  base[0] = base[1] = 512;	if ((pixel[(block << 6) + i] = base[i & 1] += diffbuf[i]) >> 10)	  derror();      }    }    if (lowbits) {      save = ftell(ifp);      fseek (ifp, 26 + row*raw_width/4, SEEK_SET);      for (prow=pixel, i=0; i < raw_width*2; i++) {	c = fgetc(ifp);	for (r=0; r < 8; r+=2, prow++) {	  val = (*prow << 2) + ((c >> r) & 3);	  if (raw_width == 2672 && val < 512) val += 2;	  *prow = val;	}      }      fseek (ifp, save, SEEK_SET);    }    for (r=0; r < 8; r++) {      irow = row - top_margin + r;      if (irow >= height) continue;      for (col=0; col < raw_width; col++) {	icol = col - left_margin;	if (icol < width)	  BAYER(irow,icol) = pixel[r*raw_width+col];	else	  black += pixel[r*raw_width+col];      }    }  }  free (pixel);  if (raw_width > width)    black /= (raw_width - width) * height;}/*   Not a full implementation of Lossless JPEG, just   enough to decode Canon, Kodak and Adobe DNG images. */struct jhead {  int bits, high, wide, clrs, sraw, psv, restart, vpred[4];  struct CLASS decode *huff[4];  ushort *row;};int CLASS ljpeg_start (struct jhead *jh, int info_only){  int i, tag, len;  uchar data[0x10000], *dp;  init_decoder();  memset (jh, 0, sizeof *jh);  for (i=0; i < 4; i++)    jh->huff[i] = free_decode;  jh->restart = INT_MAX;  fread (data, 2, 1, ifp);  if (data[1] != 0xd8) return 0;  do {    fread (data, 2, 2, ifp);    tag =  data[0] << 8 | data[1];    len = (data[2] << 8 | data[3]) - 2;    if (tag <= 0xff00) return 0;    fread (data, 1, len, ifp);    switch (tag) {      case 0xffc3:	jh->sraw = data[7] == 0x21;      case 0xffc0:	jh->bits = data[0];	jh->high = data[1] << 8 | data[2];	jh->wide = data[3] << 8 | data[4];	jh->clrs = data[5] + jh->sraw;	if (len == 9 && !dng_version) getc(ifp);	break;      case 0xffc4:	if (info_only) break;	for (dp = data; dp < data+len && *dp < 4; ) {	  jh->huff[*dp] = free_decode;	  dp = make_decoder (++dp, 0);	}	break;      case 0xffda:	jh->psv = data[1+data[0]*2];	break;      case 0xffdd:	jh->restart = data[0] << 8 | data[1];    }  } while (tag != 0xffda);  if (info_only) return 1;  if (jh->sraw) {    jh->huff[3] = jh->huff[2] = jh->huff[1];    jh->huff[1] = jh->huff[0];  }  jh->row = (ushort *) calloc (jh->wide*jh->clrs, 4);  merror (jh->row, "ljpeg_start()");  return zero_after_ff = 1;}int CLASS ljpeg_diff (struct decode *dindex){  int len, diff;  while (dindex->branch[0])    dindex = dindex->branch[getbits(1)];  len = dindex->leaf;  if (len == 16 && (!dng_version || dng_version >= 0x1010000))    return -32768;  diff = getbits(len);  if ((diff & (1 << (len-1))) == 0)    diff -= (1 << len) - 1;  return diff;}ushort * CLASS ljpeg_row (int jrow, struct jhead *jh){  int col, c, diff, pred;  ushort mark=0, *row[3];  if (jrow * jh->wide % jh->restart == 0) {    FORC4 jh->vpred[c] = 1 << (jh->bits-1);    if (jrow)      do mark = (mark << 8) + (c = fgetc(ifp));      while (c != EOF && mark >> 4 != 0xffd);    getbits(-1);  }  FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1);  for (col=0; col < jh->wide; col++)    FORC(jh->clrs) {      diff = ljpeg_diff (jh->huff[c]);      if (jh->sraw && c < 2 && (col | c))		    pred = row[0][(c << 1)-3];      else if (col) pred = row[0][-jh->clrs];      else	    pred = (jh->vpred[c] += diff) - diff;      if (jrow && col) switch (jh->psv) {	case 1:	break;	case 2: pred = row[1][0];					break;	case 3: pred = row[1][-jh->clrs];				break;	case 4: pred = pred +   row[1][0] - row[1][-jh->clrs];		break;

⌨️ 快捷键说明

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