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

📄 jiv.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 2 页
字号:
				vh = gs.sy * gs.vp.height;				gs.vcy = min(gs.vcy + pan * vh, jas_image_bry(gs.image) -				  0.5 * vh);				if (gs.vcy != oldvcy) {					gs.dirty = 1;					glutPostRedisplay();				}			}		}		break;	case GLUT_KEY_LEFT:		{			float oldvcx;			float vw;			float pan;			if (gs.vp.width < jas_image_width(gs.image) / gs.sx) {				pan = (glutGetModifiers() & GLUT_ACTIVE_SHIFT) ?				  BIGPAN : SMALLPAN;				oldvcx = gs.vcx;				vw = gs.sx * gs.vp.width;				gs.vcx = max(gs.vcx - pan * vw, jas_image_tlx(gs.image) +				  0.5 * vw);				if (gs.vcx != oldvcx) {					gs.dirty = 1;					glutPostRedisplay();				}			}		}		break;	case GLUT_KEY_RIGHT:		{			float oldvcx;			float vw;			float pan;			if (gs.vp.width < jas_image_width(gs.image) / gs.sx) {				pan = (glutGetModifiers() & GLUT_ACTIVE_SHIFT) ?				  BIGPAN : SMALLPAN;				oldvcx = gs.vcx;				vw = gs.sx * gs.vp.width;				gs.vcx = min(gs.vcx + pan * vw, jas_image_brx(gs.image) -				  0.5 * vw);				if (gs.vcx != oldvcx) {					gs.dirty = 1;					glutPostRedisplay();				}			}		}		break;	default:		break;	}}/* Timer callback function. */static void timer(int value){	if (cmdopts.verbose) {		fprintf(stderr, "timer(%d)\n", value);	}	if (value == gs.activetmid) {		nextimage();	}}/******************************************************************************\*\******************************************************************************/static void nextcmpt(){	if (gs.monomode) {		if (gs.cmptno == jas_image_numcmpts(gs.image) - 1) {			if (gs.altimage) {				gs.monomode = 0;			} else {				gs.cmptno = 0;			}		} else {			++gs.cmptno;		}	} else {		gs.monomode = 1;		gs.cmptno = 0;	}	gs.dirty = 1;	glutPostRedisplay();}static void prevcmpt(){	if (gs.monomode) {		if (!gs.cmptno) {			gs.monomode = 0;		} else {			--gs.cmptno;		}	} else {		gs.monomode = 1;		gs.cmptno = jas_image_numcmpts(gs.image) - 1;	}	gs.dirty = 1;	glutPostRedisplay();}static void nextimage(){	int n;	unloadimage();	for (n = cmdopts.numfiles; n > 0; --n) {		++gs.filenum;		if (gs.filenum >= cmdopts.numfiles) {			if (cmdopts.loop) {				gs.filenum = 0;			} else {				cleanupandexit(EXIT_SUCCESS);			}		}		if (!loadimage()) {			return;		}		fprintf(stderr, "cannot load image\n");	}	cleanupandexit(EXIT_SUCCESS);}static void previmage(){	int n;	unloadimage();	for (n = cmdopts.numfiles; n > 0; --n) {		--gs.filenum;		if (gs.filenum < 0) {			if (cmdopts.loop) {				gs.filenum = cmdopts.numfiles - 1;			} else {				cleanupandexit(EXIT_SUCCESS);			}		}		if (!loadimage()) {			return;		}	}	cleanupandexit(EXIT_SUCCESS);}static int loadimage(){	int reshapeflag;	jas_stream_t *in;	int scrnwidth;	int scrnheight;	int vh;	int vw;	char *pathname;	jas_cmprof_t *outprof;	assert(!gs.image);	assert(!gs.altimage);	gs.image = 0;	gs.altimage = 0;	pathname = cmdopts.filenames[gs.filenum];	if (pathname && pathname[0] != '\0') {#if 1	fprintf(stderr, "opening %s\n", pathname);#endif		/* The input image is to be read from a file. */		if (!(in = jas_stream_fopen(pathname, "rb"))) {			fprintf(stderr, "error: cannot open file %s\n", pathname);			goto error;		}	} else {		/* The input image is to be read from standard input. */		in = streamin;	}	/* Get the input image data. */	if (!(gs.image = jas_image_decode(in, -1, 0))) {		fprintf(stderr, "error: cannot load image data\n");		goto error;	}	/* Close the input stream. */	if (in != streamin) {		jas_stream_close(in);	}	if (!(outprof = jas_cmprof_createfromclrspc(JAS_CLRSPC_SRGB)))		goto error;	if (!(gs.altimage = jas_image_chclrspc(gs.image, outprof, JAS_CMXFORM_INTENT_PER)))		goto error;	if ((scrnwidth = glutGet(GLUT_SCREEN_WIDTH)) < 0) {		scrnwidth = 256;	}	if ((scrnheight = glutGet(GLUT_SCREEN_HEIGHT)) < 0) {		scrnheight = 256;	}	vw = min(jas_image_width(gs.image), 0.95 * scrnwidth);	vh = min(jas_image_height(gs.image), 0.95 * scrnheight);	gs.vcx = (jas_image_tlx(gs.image) + jas_image_brx(gs.image)) / 2.0;	gs.vcy = (jas_image_tly(gs.image) + jas_image_bry(gs.image)) / 2.0;	gs.sx = 1.0;	gs.sy = 1.0;	if (gs.altimage) {		gs.monomode = 0;	} else {		gs.monomode = 1;		gs.cmptno = 0;	}#if 1	fprintf(stderr, "num of components %d\n", jas_image_numcmpts(gs.image));#endif	if (vw < jas_image_width(gs.image)) {		gs.sx = jas_image_width(gs.image) / ((float) vw);	}	if (vh < jas_image_height(gs.image)) {		gs.sy = jas_image_height(gs.image) / ((float) vh);	}	if (gs.sx > gs.sy) {		gs.sy = gs.sx;	} else if (gs.sx < gs.sy) {		gs.sx = gs.sy;	}	vw = jas_image_width(gs.image) / gs.sx;	vh = jas_image_height(gs.image) / gs.sy;	gs.dirty = 1;	reshapeflag = 0;	if (vw != glutGet(GLUT_WINDOW_WIDTH) ||	  vh != glutGet(GLUT_WINDOW_HEIGHT)) {		glutReshapeWindow(vw, vh);		reshapeflag = 1;	}	if (cmdopts.title) {		glutSetWindowTitle(cmdopts.title);	} else {		glutSetWindowTitle((pathname && pathname[0] != '\0') ? pathname :		  "stdin");	}	/* If we reshaped the window, GLUT will automatically invoke both	  the reshape and display callback (in this order).  Therefore, we	  only need to explicitly force the display callback to be invoked	  if the window was not reshaped. */	if (!reshapeflag) {		glutPostRedisplay();	}	if (cmdopts.tmout != 0) {		glutTimerFunc(cmdopts.tmout, timer, gs.nexttmid);		gs.activetmid = gs.nexttmid;		++gs.nexttmid;	}	return 0;error:	unloadimage();	return -1;}static void unloadimage(){	if (gs.image) {		jas_image_destroy(gs.image);		gs.image = 0;	}	if (gs.altimage) {		jas_image_destroy(gs.altimage);		gs.altimage = 0;	}}/******************************************************************************\*\******************************************************************************/static void adjust(){	if (gs.vp.width < jas_image_width(gs.image) / gs.sx) {		float mnx;		float mxx;		mnx = jas_image_tlx(gs.image) + 0.5 * gs.vp.width * gs.sx;		mxx = jas_image_brx(gs.image) - 0.5 * gs.vp.width * gs.sx;		if (gs.vcx < mnx) {			gs.vcx = mnx;		} else if (gs.vcx > mxx) {			gs.vcx = mxx;		}	} else {		gs.vcx = (jas_image_tlx(gs.image) + jas_image_brx(gs.image)) / 2.0;	}	if (gs.vp.height < jas_image_height(gs.image) / gs.sy) {		float mny;		float mxy;		mny = jas_image_tly(gs.image) + 0.5 * gs.vp.height * gs.sy;		mxy = jas_image_bry(gs.image) - 0.5 * gs.vp.height * gs.sy;		if (gs.vcy < mny) {			gs.vcy = mny;		} else if (gs.vcy > mxy) {			gs.vcy = mxy;		}	} else {		gs.vcy = (jas_image_tly(gs.image) + jas_image_bry(gs.image)) / 2.0;	}}static void pixmap_clear(pixmap_t *p){	memset(p->data, 0, 4 * p->width * p->height * sizeof(GLshort));}static int pixmap_resize(pixmap_t *p, int w, int h){	p->width = w;	p->height = h;	if (!(p->data = realloc(p->data, w * h * 4 * sizeof(GLshort)))) {		return -1;	}	return 0;}static void dumpstate(){	printf("vcx=%f vcy=%f sx=%f sy=%f dirty=%d\n", gs.vcx, gs.vcy, gs.sx, gs.sy, gs.dirty);}#define	vctocc(i, co, cs, vo, vs) \  (((vo) + (i) * (vs) - (co)) / (cs))static int jas_image_render(jas_image_t *image, float vtlx, float vtly,  float vsx, float vsy, int vw, int vh, GLshort *vdata){	int i;	int j;	int k;	int x;	int y;	int v[3];	GLshort *vdatap;	int cmptlut[3];	int width;	int height;	int hs;	int vs;	int tlx;	int tly;	if ((cmptlut[0] = jas_image_getcmptbytype(image,	  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R))) < 0 ||	  (cmptlut[1] = jas_image_getcmptbytype(image,	  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G))) < 0 ||	  (cmptlut[2] = jas_image_getcmptbytype(image,	  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B))) < 0)		goto error;	width = jas_image_cmptwidth(image, cmptlut[0]);	height = jas_image_cmptheight(image, cmptlut[0]);	tlx = jas_image_cmpttlx(image, cmptlut[0]);	tly = jas_image_cmpttly(image, cmptlut[0]);	vs = jas_image_cmptvstep(image, cmptlut[0]);	hs = jas_image_cmpthstep(image, cmptlut[0]);	for (i = 1; i < 3; ++i) {		if (jas_image_cmptwidth(image, cmptlut[i]) != width ||		  jas_image_cmptheight(image, cmptlut[i]) != height)			goto error;	}	for (i = 0; i < vh; ++i) {		vdatap = &vdata[(vh - 1 - i) * (4 * vw)];		for (j = 0; j < vw; ++j) {			x = vctocc(j, tlx, hs, vtlx, vsx);			y = vctocc(i, tly, vs, vtly, vsy);			if (x >= 0 && x < width && y >= 0 && y < height) {				for (k = 0; k < 3; ++k) {					v[k] = jas_image_readcmptsample(image, cmptlut[k], x, y);					v[k] <<= 16 - jas_image_cmptprec(image, cmptlut[k]);					if (v[k] < 0) {						v[k] = 0;					} else if (v[k] > 65535) {						v[k] = 65535;					}				}			} else {				v[0] = 0;				v[1] = 0;				v[2] = 0;			}				*vdatap++ = v[0];			*vdatap++ = v[1];			*vdatap++ = v[2];			*vdatap++ = 0;		}	}	return 0;error:	return -1;}int jas_image_render2(jas_image_t *image, int cmptno, float vtlx, float vtly,  float vsx, float vsy, int vw, int vh, GLshort *vdata){	int i;	int j;	int x;	int y;	int v;	GLshort *vdatap;	if (cmptno < 0 || cmptno >= image->numcmpts_) {		fprintf(stderr, "bad parameter\n");		goto error;	}	for (i = 0; i < vh; ++i) {		vdatap = &vdata[(vh - 1 - i) * (4 * vw)];		for (j = 0; j < vw; ++j) {			x = vctocc(j, jas_image_cmpttlx(image, cmptno), jas_image_cmpthstep(image, cmptno), vtlx, vsx);			y = vctocc(i, jas_image_cmpttly(image, cmptno), jas_image_cmptvstep(image, cmptno), vtly, vsy);			v = (x >= 0 && x < jas_image_cmptwidth(image, cmptno) && y >=0 && y < jas_image_cmptheight(image, cmptno)) ? jas_image_readcmptsample(image, cmptno, x, y) : 0;			v <<= 16 - jas_image_cmptprec(image, cmptno);			if (v < 0) {				v = 0;			} else if (v > 65535) {				v = 65535;			}			*vdatap++ = v;			*vdatap++ = v;			*vdatap++ = v;			*vdatap++ = 0;		}	}	return 0;error:	return -1;}#if 0#define	vctocc(i, co, cs, vo, vs) \  (((vo) + (i) * (vs) - (co)) / (cs))static void drawview(jas_image_t *image, float vtlx, float vtly,  float sx, float sy, pixmap_t *p){	int i;	int j;	int k;	int red;	int grn;	int blu;	int lum;	GLshort *datap;	int x;	int y;	int *cmptlut;	int numcmpts;	int v[4];	int u[4];	int color;	cmptlut = gs.cmptlut;	switch (jas_image_colorspace(gs.image)) {	case JAS_IMAGE_CS_RGB:	case JAS_IMAGE_CS_YCBCR:		color = 1;		numcmpts = 3;		break;	case JAS_IMAGE_CS_GRAY:	default:		numcmpts = 1;		color = 0;		break;	}	for (i = 0; i < p->height; ++i) {		datap = &p->data[(p->height - 1 - i) * (4 * p->width)];		for (j = 0; j < p->width; ++j) {			if (!gs.monomode && color) {				for (k = 0; k < numcmpts; ++k) {					x = vctocc(j, jas_image_cmpttlx(gs.image, cmptlut[k]), jas_image_cmpthstep(gs.image, cmptlut[k]), vtlx, sx);					y = vctocc(i, jas_image_cmpttly(gs.image, cmptlut[k]), jas_image_cmptvstep(gs.image, cmptlut[k]), vtly, sy);					v[k] = (x >= 0 && x < jas_image_cmptwidth(gs.image, cmptlut[k]) && y >=0 && y < jas_image_cmptheight(gs.image, cmptlut[k])) ? jas_matrix_get(gs.cmpts[cmptlut[k]], y, x) : 0;					v[k] <<= 16 - jas_image_cmptprec(gs.image, cmptlut[k]);				}				switch (jas_image_colorspace(gs.image)) {				case JAS_IMAGE_CS_RGB:					break;				case JAS_IMAGE_CS_YCBCR:					u[0] = (1/1.772) * (v[0] + 1.402 * v[2]);					u[1] = (1/1.772) * (v[0] - 0.34413 * v[1] - 0.71414 * v[2]);					u[2] = (1/1.772) * (v[0] + 1.772 * v[1]);					v[0] = u[0];					v[1] = u[1];					v[2] = u[2];					break;				}			} else {				x = vctocc(j, jas_image_cmpttlx(gs.image, gs.cmptno), jas_image_cmpthstep(gs.image, gs.cmptno), vtlx, sx);				y = vctocc(i, jas_image_cmpttly(gs.image, gs.cmptno), jas_image_cmptvstep(gs.image, gs.cmptno), vtly, sy);				v[0] = (x >= 0 && x < jas_image_cmptwidth(gs.image, gs.cmptno) && y >=0 && y < jas_image_cmptheight(gs.image, gs.cmptno)) ? jas_matrix_get(gs.cmpts[gs.cmptno], y, x) : 0;				v[0] <<= 16 - jas_image_cmptprec(gs.image, gs.cmptno);				v[1] = v[0];				v[2] = v[0];				v[3] = 0;			}for (k = 0; k < 3; ++k) {	if (v[k] < 0) {		v[k] = 0;	} else if (v[k] > 65535) {		v[k] = 65535;	}}			*datap++ = v[0];			*datap++ = v[1];			*datap++ = v[2];			*datap++ = 0;		}	}}#endifstatic void cleanupandexit(int status){	unloadimage();	exit(status);}static void init(){	gs.filenum = -1;	gs.image = 0;	gs.altimage = 0;	gs.nexttmid = 0;	gs.vp.width = 0;	gs.vp.height = 0;	gs.vp.data = 0;	gs.dirty = 1;}

⌨️ 快捷键说明

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