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

📄 cctiff.c

📁   这是一个高速多维插值算法。当我们建模以后
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Multi-dim table function */void md_table(void *cntx,double *out_vals,double *in_vals) {	sucntx *rx = (sucntx *)cntx;	double pcsv[3];	int i;		if (rx->link) {		double vals[MAX_CHAN];		switch(rx->in.alg) {		    case icmMonoFwdType: {				icmLuMono *lu = (icmLuMono *)rx->in.luo;	/* Safe to coerce */				if (rx->icombine) {					lu->fwd_curve(lu, vals, in_vals);					lu->fwd_map(lu, pcsv, vals);				} else {					lu->fwd_map(lu, pcsv, in_vals);				}				lu->fwd_abs(lu, pcsv, pcsv);				break;			}		    case icmMatrixFwdType: {				icmLuMatrix *lu = (icmLuMatrix *)rx->in.luo;	/* Safe to coerce */				if (rx->icombine) {					lu->fwd_curve(lu, vals, in_vals);					lu->fwd_matrix(lu, pcsv, vals);				} else {					lu->fwd_matrix(lu, pcsv, in_vals);				}				lu->fwd_abs(lu, pcsv, pcsv);				break;			}		    case icmLutType: {				icmLuLut *lu = (icmLuLut *)rx->in.luo;	/* Safe to coerce */				if (rx->icombine) {					/* Since not PCS, in_abs and matrix cannot be valid, */					/* so input curve on own is ok to use. */					lu->input(lu, vals, in_vals);					lu->clut(lu, pcsv, vals);				} else {					lu->clut(lu, pcsv, in_vals);				}				lu->output(lu, pcsv, pcsv);				lu->out_abs(lu, pcsv, pcsv);				break;			}			default:				error("Unexpected algorithm type in clut lookup");		}		switch(rx->out.alg) {		    case icmMonoBwdType: {				icmLuMono *lu = (icmLuMono *)rx->out.luo;	/* Safe to coerce */				lu->bwd_abs(lu, pcsv, pcsv);				lu->bwd_map(lu, out_vals, pcsv);				if (rx->ocombine) {					lu->bwd_curve(lu, out_vals, out_vals);				}				break;			}		    case icmMatrixBwdType: {				icmLuMatrix *lu = (icmLuMatrix *)rx->out.luo;	/* Safe to coerce */				lu->bwd_abs(lu, pcsv, pcsv);				lu->bwd_matrix(lu, out_vals, pcsv);				if (rx->ocombine) {					lu->bwd_curve(lu, out_vals, out_vals);				}				break;			}		    case icmLutType: {				icmLuLut *lu = (icmLuLut *)rx->out.luo;	/* Safe to coerce */				lu->in_abs(lu, pcsv, pcsv);				lu->matrix(lu, pcsv, pcsv);				lu->input(lu, pcsv, pcsv);				lu->clut(lu, out_vals, pcsv);				if (rx->ocombine) {					lu->output(lu, out_vals, out_vals);					/* Since not PCS, out_abs is never used */				}				break;			}			default:				error("Unexpected algorithm type in clut lookup");		}	} else {		icmLuLut *lu = (icmLuLut *)rx->dev.luo;		/* Safe to coerce */		if (rx->icombine && rx->ocombine) {			lu->lookup((icmLuBase *)lu, out_vals, in_vals);		/* Do everything here */		} else {			lu->clut(lu, out_vals, in_vals);		}	}}/* Output curve function */double output_curve(void *cntx,int ch,double in_val) {	sucntx *rx = (sucntx *)cntx;	int i;	double vals[MAX_CHAN];		if (rx->ocombine)		return in_val;	if (rx->link) {		for (i = 0; i < rx->od; i++)			vals[i] = 0.0;		vals[ch] = in_val;			switch(rx->out.alg) {		    case icmMonoBwdType: {				icmLuMono *lu = (icmLuMono *)rx->out.luo;	/* Safe to coerce */				lu->bwd_curve(lu, vals, vals);				break;			}		    case icmMatrixBwdType: {				icmLuMatrix *lu = (icmLuMatrix *)rx->out.luo;	/* Safe to coerce */				lu->bwd_curve(lu, vals, vals);				break;			}		    case icmLutType: {				icmLuLut *lu = (icmLuLut *)rx->out.luo;	/* Safe to coerce */				lu->output(lu, vals, vals);				/* Since not PCS, out_abs is never used */				break;			}			default:				error("Unexpected algorithm type in devop_devo()");		}	} else {		icmLuLut *lu = (icmLuLut *)rx->dev.luo;		/* Safe to coerce */			for (i = 0; i < rx->od; i++)			vals[i] = 0.0;		vals[ch] = in_val;			/* Since output not PCS, out_abs cannot be valid, */		lu->output(lu, vals, vals);		}	return vals[ch];}intmain(int argc, char *argv[]) {	int fa,nfa;				/* argument we're looking at */	char in_name[100];		/* Raster file name */	char out_name[100];		/* Raster file name */	int slow = 0;	int check = 0;	int i, rv = 0;	TIFF *rh = NULL, *wh = NULL;	int x, y, width, height;					/* Size of image */	uint16 samplesperpixel, bitspersample;	int no_pmtc;								/* Number of input photometrics */	uint16 photometric, pmtc[10];				/* Photometrics of input file, and input profile */	uint16 pconfig;								/* Planar configuration */	uint16 resunits;	float resx, resy;	tdata_t *inbuf, *outbuf, *checkbuf;	/* IMDI */	imdi *s = NULL;	sucntx su;		/* Setup context */	unsigned char *inp[MAX_CHAN];	unsigned char *outp[MAX_CHAN];	int clutres = 33;	/* Error check */	int mxerr = 0;	double avgerr = 0.0;	double avgcount = 0.0;	if (argc < 2)		usage();	su.verb = 0;	su.icombine = 0;	su.ocombine = 0;	su.link = 0;	su.in.intent = icmDefaultIntent;	su.out.intent = icmDefaultIntent;	/* Process the arguments */	for(fa = 1;fa < argc;fa++) {		nfa = fa;					/* skip to nfa if next argument is used */		if (argv[fa][0] == '-')	{	/* Look for any flags */			char *na = NULL;		/* next argument after flag, null if none */			if (argv[fa][2] != '\000')				na = &argv[fa][2];		/* next is directly after flag */			else {				if ((fa+1) < argc) {					if (argv[fa+1][0] != '-') {						nfa = fa + 1;						na = argv[nfa];		/* next is seperate non-flag argument */					}				}			}			if (argv[fa][1] == '?')				usage();			/* Slow, Precise */			else if (argv[fa][1] == 'p' || argv[fa][1] == 'P') {				slow = 1;			}			/* Combine per channel curves */			else if (argv[fa][1] == 'c' || argv[fa][1] == 'C') {				su.icombine = 1;				su.ocombine = 1;			}			/* Check curves */			else if (argv[fa][1] == 'k' || argv[fa][1] == 'K') {				check = 1;			}			/* Link profiles */			else if (argv[fa][1] == 'l' || argv[fa][1] == 'L') {				su.link = 1;			}			/* Input profile Intent */			else if (argv[fa][1] == 'i' || argv[fa][1] == 'I') {				fa = nfa;				if (na == NULL) usage();    			switch (na[0]) {					case 'p':					case 'P':						su.in.intent = icPerceptual;						break;					case 'r':					case 'R':						su.in.intent = icRelativeColorimetric;						break;					case 's':					case 'S':						su.in.intent = icSaturation;						break;					case 'a':					case 'A':						su.in.intent = icAbsoluteColorimetric;						break;					default:						usage();				}			}			/* Output profile Intent */			else if (argv[fa][1] == 'o' || argv[fa][1] == 'O') {				fa = nfa;				if (na == NULL) usage();    			switch (na[0]) {					case 'p':					case 'P':						su.out.intent = icPerceptual;						break;					case 'r':					case 'R':						su.out.intent = icRelativeColorimetric;						break;					case 's':					case 'S':						su.out.intent = icSaturation;						break;					case 'a':					case 'A':						su.out.intent = icAbsoluteColorimetric;						break;					default:						usage();				}			}			/* Verbosity */			else if (argv[fa][1] == 'v' || argv[fa][1] == 'V') {				su.verb = 1;			}			else 				usage();		} else			break;	}	if (su.link) {		if (fa >= argc || argv[fa][0] == '-') usage();		strcpy(su.in.name,argv[fa++]);		if (fa >= argc || argv[fa][0] == '-') usage();		strcpy(su.out.name,argv[fa++]);	} else {		if (fa >= argc || argv[fa][0] == '-') usage();		strcpy(su.dev.name,argv[fa++]);	}	if (fa >= argc || argv[fa][0] == '-') usage();	strcpy(in_name,argv[fa++]);	if (fa >= argc || argv[fa][0] == '-') usage();	strcpy(out_name,argv[fa++]);	/* - - - - - - - - - - - - - - - - */	if (su.link) {		icColorSpaceSignature natpcs;		/* Open up the input device profile for reading */		if ((su.in.fp = new_icmFileStd_name(su.in.name,"r")) == NULL)			error ("Can't open file '%s'",su.in.name);				if ((su.in.c = new_icc()) == NULL)			error ("Creation of Input profile ICC object failed");			/* Read header etc. */		if ((rv = su.in.c->read(su.in.c,su.in.fp,0)) != 0)			error ("%d, %s on file '%s'",rv,su.in.c->err,su.in.name);		su.in.h = su.in.c->header;			/* Check that it is a suitable device input icc */		if (su.in.h->deviceClass != icSigInputClass		 && su.in.h->deviceClass != icSigDisplayClass		 && su.in.h->deviceClass != icSigOutputClass		 && su.in.h->deviceClass != icSigColorSpaceClass)	/* For sRGB etc. */			error("Input profile isn't a device profile");			/* Get a conversion object */		if ((su.in.luo = su.in.c->get_luobj(su.in.c, icmFwd, su.in.intent,		                                             icSigLabData, icmLuOrdNorm)) == NULL)			error ("%d, %s for profile '%s'",su.in.c->errc, su.in.c->err, su.in.name);			/* Get details of conversion (Arguments may be NULL if info not needed) */		su.in.luo->spaces(su.in.luo, &su.ins, &su.id, NULL, NULL, &su.in.alg, NULL, NULL, NULL);		/* Get native PCS space */		su.in.luo->lutspaces(su.in.luo, NULL, NULL, NULL, NULL, &natpcs);			if (natpcs == icSigXYZData) {			su.icombine = 1;			/* XYZ is to non-linear to be a benefit */		}		/* Open up the output device profile for reading */		if ((su.out.fp = new_icmFileStd_name(su.out.name,"r")) == NULL)			error ("Can't open file '%s'",su.out.name);				if ((su.out.c = new_icc()) == NULL)			error ("Creation of Output profile ICC object failed");			/* Read header etc. */		if ((rv = su.out.c->read(su.out.c,su.out.fp,0)) != 0)			error ("%d, %s on file '%s'",rv,su.out.c->err,su.out.name);		su.out.h = su.out.c->header;			/* Check that it is a suitable device output icc */		if (su.out.h->deviceClass != icSigInputClass		 && su.out.h->deviceClass != icSigDisplayClass		 && su.out.h->deviceClass != icSigOutputClass		 && su.out.h->deviceClass != icSigColorSpaceClass)	/* For sRGB etc. */			error("Output profile isn't a device profile");			/* Get a conversion object */		if ((su.out.luo = su.out.c->get_luobj(su.out.c, icmBwd, su.out.intent,		                                             icSigLabData, icmLuOrdNorm)) == NULL)			error ("%d, %s for profile '%s'",su.out.c->errc, su.out.c->err, su.out.name);			/* Get details of conversion (Arguments may be NULL if info not needed) */		su.out.luo->spaces(su.out.luo, NULL, NULL, &su.outs, &su.od, &su.out.alg, NULL, NULL, NULL);		/* Get native PCS space */		su.out.luo->lutspaces(su.out.luo, NULL, NULL, NULL, NULL, &natpcs);			if (natpcs == icSigXYZData) {			su.ocombine = 1;			/* XYZ is to non-linear to be a benefit */		}		/* See discussion in imdi/imdi_gen.c for ideal numbers */		/* Use "high quality" resolution numbers */		switch (su.id) {			case 0:				error ("Illegal number of input chanels");			case 1:	  		  	clutres = 256;				break;

⌨️ 快捷键说明

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