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

📄 jp2_enc.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 2 页
字号:
	case JAS_CLRSPC_SYCBCR:	case JAS_CLRSPC_SGRAY:		colr->method = JP2_COLR_ENUM;		colr->csid = clrspctojp2(jas_image_clrspc(image));		colr->pri = JP2_COLR_PRI;		colr->approx = 0;		break;	default:		colr->method = JP2_COLR_ICC;		colr->pri = JP2_COLR_PRI;		colr->approx = 0;		iccprof = jas_iccprof_createfromcmprof(jas_image_cmprof(image));		assert(iccprof);		iccstream = jas_stream_memopen(0, 0);		assert(iccstream);		if (jas_iccprof_save(iccprof, iccstream))			abort();		if ((pos = jas_stream_tell(iccstream)) < 0)			abort();		colr->iccplen = pos;		colr->iccp = jas_malloc(pos);		assert(colr->iccp);		jas_stream_rewind(iccstream);		if (jas_stream_read(iccstream, colr->iccp, colr->iccplen) != colr->iccplen)			abort();		jas_stream_close(iccstream);		jas_iccprof_destroy(iccprof);		break;	}	if (jp2_box_put(box, tmpstream)) {		goto error;	}	jp2_box_destroy(box);	box = 0;	needcdef = 1;	switch (jas_clrspc_fam(jas_image_clrspc(image))) {	case JAS_CLRSPC_FAM_RGB:		if (jas_image_cmpttype(image, 0) ==		  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R) &&		  jas_image_cmpttype(image, 1) ==		  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G) &&		  jas_image_cmpttype(image, 2) ==		  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B))			needcdef = 0;		break;	case JAS_CLRSPC_FAM_YCBCR:		if (jas_image_cmpttype(image, 0) ==		  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_Y) &&		  jas_image_cmpttype(image, 1) ==		  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_CB) &&		  jas_image_cmpttype(image, 2) ==		  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_CR))			needcdef = 0;		break;	case JAS_CLRSPC_FAM_GRAY:		if (jas_image_cmpttype(image, 0) ==		  JAS_IMAGE_CT_COLOR(JAS_IMAGE_CT_GRAY_Y))			needcdef = 0;		break;	default:		abort();		break;	}	if (needcdef) {		if (!(box = jp2_box_create(JP2_BOX_CDEF))) {			goto error;		}		cdef = &box->data.cdef;		cdef->numchans = jas_image_numcmpts(image);		cdef->ents = jas_malloc(cdef->numchans * sizeof(jp2_cdefchan_t));		for (i = 0; i < jas_image_numcmpts(image); ++i) {			cdefchanent = &cdef->ents[i];			cdefchanent->channo = i;			typeasoc = jp2_gettypeasoc(jas_image_clrspc(image), jas_image_cmpttype(image, i));			cdefchanent->type = typeasoc >> 16;			cdefchanent->assoc = typeasoc & 0x7fff;		}		if (jp2_box_put(box, tmpstream)) {			goto error;		}		jp2_box_destroy(box);		box = 0;	}	/* Determine the total length of the JP2 header box. */	len = jas_stream_tell(tmpstream);	jas_stream_rewind(tmpstream);	/*	 * Output the JP2 header box and all of the boxes which it contains.	 */	if (!(box = jp2_box_create(JP2_BOX_JP2H))) {		goto error;	}	box->len = len + JP2_BOX_HDRLEN;	if (jp2_box_put(box, out)) {		goto error;	}	jp2_box_destroy(box);	box = 0;	if (jas_stream_copy(out, tmpstream, len)) {		goto error;	}	jas_stream_close(tmpstream);	tmpstream = 0;	return 0;	abort();error:	if (box) {		jp2_box_destroy(box);	}	if (tmpstream) {		jas_stream_close(tmpstream);	}	return -1;}int jp2_write_codestream(jas_image_t *image, jas_stream_t *out, char *optstr){	jp2_box_t *box;	char buf[4096];	uint_fast32_t overhead;	/*	 * Output the contiguous code stream box.	 */	if (!(box = jp2_box_create(JP2_BOX_JP2C))) {		goto error;	}	box->len = 0;	if (jp2_box_put(box, out)) {		goto error;	}	jp2_box_destroy(box);	box = 0;	/* Output the JPEG-2000 code stream. */	overhead = jas_stream_getrwcount(out);	sprintf(buf, "%s\n_jp2overhead=%lu\n", (optstr ? optstr : ""),	  (unsigned long) overhead);	if (jpc_encode(image, out, buf)) {		goto error;	}	return 0;	abort();error:	if (box) {		jp2_box_destroy(box);	}	return -1;}int jp2_encode(jas_image_t *image, jas_stream_t *out, char *optstr){	if (jp2_write_header(image, out) < 0)		return -1;	if (jp2_write_codestream(image, out, optstr) < 0)		return -1;	return 0;}int jp2_encode_uuid(jas_image_t *image, jas_stream_t *out,		    char *optstr, jp2_box_t *uuid){	if (jp2_write_header(image, out) < 0)		return -1;	if (uuid) {		if (jp2_box_put(uuid, out))			return -1;	}	if (jp2_write_codestream(image, out, optstr) < 0)		return -1;	return 0;}static uint_fast32_t jp2_gettypeasoc(int colorspace, int ctype){	int type;	int asoc;	if (ctype & JAS_IMAGE_CT_OPACITY) {		type = JP2_CDEF_TYPE_OPACITY;		asoc = JP2_CDEF_ASOC_ALL;		goto done;	}	type = JP2_CDEF_TYPE_UNSPEC;	asoc = JP2_CDEF_ASOC_NONE;	switch (jas_clrspc_fam(colorspace)) {	case JAS_CLRSPC_FAM_RGB:		switch (JAS_IMAGE_CT_COLOR(ctype)) {		case JAS_IMAGE_CT_RGB_R:			type = JP2_CDEF_TYPE_COLOR;			asoc = JP2_CDEF_RGB_R;			break;		case JAS_IMAGE_CT_RGB_G:			type = JP2_CDEF_TYPE_COLOR;			asoc = JP2_CDEF_RGB_G;			break;		case JAS_IMAGE_CT_RGB_B:			type = JP2_CDEF_TYPE_COLOR;			asoc = JP2_CDEF_RGB_B;			break;		}		break;	case JAS_CLRSPC_FAM_YCBCR:		switch (JAS_IMAGE_CT_COLOR(ctype)) {		case JAS_IMAGE_CT_YCBCR_Y:			type = JP2_CDEF_TYPE_COLOR;			asoc = JP2_CDEF_YCBCR_Y;			break;		case JAS_IMAGE_CT_YCBCR_CB:			type = JP2_CDEF_TYPE_COLOR;			asoc = JP2_CDEF_YCBCR_CB;			break;		case JAS_IMAGE_CT_YCBCR_CR:			type = JP2_CDEF_TYPE_COLOR;			asoc = JP2_CDEF_YCBCR_CR;			break;		}		break;	case JAS_CLRSPC_FAM_GRAY:		type = JP2_CDEF_TYPE_COLOR;		asoc = JP2_CDEF_GRAY_Y;		break;	}done:	return (type << 16) | asoc;}static int clrspctojp2(jas_clrspc_t clrspc){	switch (clrspc) {	case JAS_CLRSPC_SRGB:		return JP2_COLR_SRGB;	case JAS_CLRSPC_SYCBCR:		return JP2_COLR_SYCC;	case JAS_CLRSPC_SGRAY:		return JP2_COLR_SGRAY;	default:		abort();		break;	}}

⌨️ 快捷键说明

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