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

📄 pnm_enc.c

📁 DIGITAL IMAGERY is pervasive in our world today. Consequently, standards for the efficient represen
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* Initialize the header. */	if (enc->numcmpts == 1) {		hdr.magic = encopts.bin ? PNM_MAGIC_BINPGM : PNM_MAGIC_TXTPGM;	} else if (enc->numcmpts == 3) {		hdr.magic = encopts.bin ? PNM_MAGIC_BINPPM : PNM_MAGIC_TXTPPM;	} else {		return -1;	}	hdr.width = width;	hdr.height = height;	hdr.maxval = (1 << prec) - 1;	hdr.sgnd = sgnd;	/* Write the header. */	if (pnm_puthdr(out, &hdr)) {		return -1;	}	/* Write the image data. */	if (pnm_putdata(out, &hdr, image, enc->numcmpts, enc->cmpts)) {		return -1;	}	/* Flush the output stream. */	if (jas_stream_flush(out)) {		return -1;	}	return 0;}/******************************************************************************\* Code for parsing options.\******************************************************************************//* Parse the encoder options string. */static int pnm_parseencopts(char *optstr, pnm_encopts_t *encopts){	jas_tvparser_t *tvp;	int ret;	tvp = 0;	/* Initialize default values for encoder options. */	encopts->bin = true;	/* Create the tag-value parser. */	if (!(tvp = jas_tvparser_create(optstr ? optstr : ""))) {		goto error;	}	/* Get tag-value pairs, and process as necessary. */	while (!(ret = jas_tvparser_next(tvp))) {		switch (jas_taginfo_nonull(jas_taginfos_lookup(pnm_opttab,		  jas_tvparser_gettag(tvp)))->id) {		case OPT_TEXT:			encopts->bin = false;			break;		default:			fprintf(stderr, "warning: ignoring invalid option %s\n",			  jas_tvparser_gettag(tvp));			break;		}		}	if (ret < 0) {		goto error;	}	/* Destroy the tag-value parser. */	jas_tvparser_destroy(tvp);	return 0;error:	if (tvp) {		jas_tvparser_destroy(tvp);	}	return -1;}/******************************************************************************\* Function for writing header.\******************************************************************************//* Write the header. */static int pnm_puthdr(jas_stream_t *out, pnm_hdr_t *hdr){	int_fast32_t maxval;	if (pnm_putuint16(out, hdr->magic)) {		return -1;	}	if (hdr->sgnd) {		maxval = -hdr->maxval;	} else {		maxval = hdr->maxval;	}	jas_stream_printf(out, "\n%lu %lu\n%ld\n", (unsigned long) hdr->width,	  (unsigned long) hdr->height, (long) maxval);	if (jas_stream_error(out)) {		return -1;	}	return 0;}/******************************************************************************\* Functions for processing the sample data.\******************************************************************************//* Write the image sample data. */static int pnm_putdata(jas_stream_t *out, pnm_hdr_t *hdr, jas_image_t *image, int numcmpts, int *cmpts){	int ret;	int cmptno;	int x;	int y;	jas_matrix_t *data[3];	int fmt;	jas_seqent_t *d[3];	jas_seqent_t v;	int minval;	int linelen;	int n;	char buf[256];	int depth;	ret = -1;	fmt = pnm_fmt(hdr->magic);	minval = -((int) hdr->maxval + 1);	depth = pnm_maxvaltodepth(hdr->maxval);	data[0] = 0;	data[1] = 0;	data[2] = 0;	for (cmptno = 0; cmptno < numcmpts; ++cmptno) {		if (!(data[cmptno] = jas_matrix_create(1, hdr->width))) {			goto done;		}	}	for (y = 0; y < hdr->height; ++y) {		for (cmptno = 0; cmptno < numcmpts; ++cmptno) {			if (jas_image_readcmpt(image, cmpts[cmptno], 0, y, hdr->width, 1,			  data[cmptno])) {				goto done;			}			d[cmptno] = jas_matrix_getref(data[cmptno], 0, 0);		}		linelen = 0;		for (x = 0; x < hdr->width; ++x) {			for (cmptno = 0; cmptno < numcmpts; ++cmptno) {				v = *d[cmptno];				if (v < minval) {					v = minval;				}				if (v > ((int) hdr->maxval)) {					v = hdr->maxval;				}				if (fmt == PNM_FMT_BIN) {					if (hdr->sgnd) {						int_fast32_t sv;						sv = v;						if (pnm_putsint(out, depth, &sv)) {							goto done;						}					} else {						uint_fast32_t uv;						uv = v;						if (pnm_putuint(out, depth, &uv)) {							goto done;						}					}				} else {					n = sprintf(buf, "%s%ld", ((!(!x && !cmptno)) ? " " : ""),					  (long) v);					if (linelen > 0 && linelen + n > PNM_MAXLINELEN) {						jas_stream_printf(out, "\n");						linelen = 0;					}					jas_stream_printf(out, "%s", buf);					linelen += n;				}				++d[cmptno];			}		}		if (fmt != PNM_FMT_BIN) {			jas_stream_printf(out, "\n");			linelen = 0;		}		if (jas_stream_error(out)) {			goto done;		}	}	ret = 0;done:	for (cmptno = 0; cmptno < numcmpts; ++cmptno) {		if (data[cmptno]) {			jas_matrix_destroy(data[cmptno]);		}	}	return ret;}/******************************************************************************\* Miscellaneous functions.\******************************************************************************/static int pnm_putsint(jas_stream_t *out, int wordsize, int_fast32_t *val){	uint_fast32_t tmpval;	tmpval = (*val < 0) ?	  ((~(JAS_CAST(uint_fast32_t, -(*val)) + 1)) & PNM_ONES(wordsize)) :	  JAS_CAST(uint_fast32_t, (*val));	return pnm_putuint(out, wordsize, &tmpval);}static int pnm_putuint(jas_stream_t *out, int wordsize, uint_fast32_t *val){	int n;	uint_fast32_t tmpval;	int c;	n = (wordsize + 7) / 8;	tmpval &= PNM_ONES(8 * n);	tmpval = (*val) << (8 * (4 - n));	while (--n >= 0) {		c = (tmpval >> 24) & 0xff;		if (jas_stream_putc(out, c) == EOF) {			return -1;		}		tmpval = (tmpval << 8) & 0xffffffff;	}	return 0;}/* Write a 16-bit unsigned integer to a stream. */static int pnm_putuint16(jas_stream_t *out, uint_fast16_t val){	if (jas_stream_putc(out, (unsigned char)(val >> 8)) == EOF ||	  jas_stream_putc(out, (unsigned char)(val & 0xff)) == EOF) {		return -1;	}	return 0;}

⌨️ 快捷键说明

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