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

📄 jpegtools.c

📁 linux下开源图片codec
💻 C
📖 第 1 页 / 共 2 页
字号:
    jpeg_destroy_compress(&th.dst);    /* replace thumbnail */    free(ed->data);    ed->data = th.out;    ed->size = th.osize;}static void do_exif(struct jpeg_decompress_struct *src,		    JXFORM_CODE *transform, unsigned int flags){    jpeg_saved_marker_ptr mark;    ExifData *ed = NULL;    unsigned char *data;    unsigned int  size;        for (mark = src->marker_list; NULL != mark; mark = mark->next) {	if (mark->marker != JPEG_APP0 +1)	    continue;	ed = exif_data_new_from_data(mark->data,mark->data_length);	break;    }    if (!ed)	return;    if (-1 == *transform) {	/* automagic image transformation */	int orientation = get_orientation(ed);	*transform = JXFORM_NONE;	if (orientation >= 1 && orientation <= 8)	    *transform = transmagic[orientation];#if 0	if (debug)	    fprintf(stderr,"autotrans: %s\n",transname[*transform]);#endif    }    /* update exif data */    if (flags & JFLAG_UPDATE_ORIENTATION) {	update_orientation(ed,EXIF_IFD_0,1);	update_orientation(ed,EXIF_IFD_1,1);    }    if (ed->data && ed->data[0] == 0xff && ed->data[1] == 0xd8 &&	(flags & JFLAG_TRANSFORM_THUMBNAIL))	do_thumbnail(ed,*transform);    update_dimension(ed, (flags & JFLAG_TRANSFORM_IMAGE) ? *transform : JXFORM_NONE,		     src->image_width, src->image_height);    /* build new exif data block */    exif_data_save_data(ed,&data,&size);    exif_data_unref(ed);    /* update jpeg APP1 (EXIF) marker */    mark->data = src->mem->alloc_large((j_common_ptr)src,JPOOL_IMAGE,size);    mark->original_length = size;    mark->data_length = size;    memcpy(mark->data,data,size);    free(data);}#endif/* ---------------------------------------------------------------------- */static void do_comment(struct jpeg_decompress_struct *src,		       unsigned char *comment){    jpeg_saved_marker_ptr mark;    int size;    /* find or create comment marker */    for (mark = src->marker_list;; mark = mark->next) {	if (mark->marker == JPEG_COM)	    break;	if (NULL == mark->next) {	    mark->next = src->mem->alloc_large((j_common_ptr)src,JPOOL_IMAGE,					       sizeof(*mark));	    mark = mark->next;	    memset(mark,0,sizeof(*mark));	    mark->marker = JPEG_COM;	    break;	}    }    /* update comment marker */    size = strlen(comment) +1;    mark->data = src->mem->alloc_large((j_common_ptr)src,JPOOL_IMAGE,size);    mark->original_length = size;    mark->data_length = size;    memcpy(mark->data,comment,size);}static int do_transform(struct jpeg_decompress_struct *src,			struct jpeg_compress_struct   *dst,			JXFORM_CODE transform,			unsigned char *comment,			unsigned int flags){    jvirt_barray_ptr * src_coef_arrays;    jvirt_barray_ptr * dst_coef_arrays;    jpeg_transform_info transformoption;    jcopy_markers_setup(src, JCOPYOPT_ALL);    if (JPEG_HEADER_OK != jpeg_read_header(src, TRUE))	return -1;#ifdef HAVE_LIBEXIF    do_exif(src,&transform,flags);#endif    if (-1 == transform)	transform = JXFORM_NONE;    if (!(flags & JFLAG_TRANSFORM_IMAGE))	transform = JXFORM_NONE;    if ((flags & JFLAG_UPDATE_COMMENT) && NULL != comment)	do_comment(src,comment);    memset(&transformoption,0,sizeof(transformoption));    transformoption.transform = transform;    transformoption.trim      = FALSE;    transformoption.force_grayscale = FALSE;    /* Any space needed by a transform option must be requested before     * jpeg_read_coefficients so that memory allocation will be done right.     */    jtransform_request_workspace(src, &transformoption);    src_coef_arrays = jpeg_read_coefficients(src);    jpeg_copy_critical_parameters(src, dst);    dst_coef_arrays = jtransform_adjust_parameters	(src, dst, src_coef_arrays, &transformoption);        /* Start compressor (note no image data is actually written here) */    jpeg_write_coefficients(dst, dst_coef_arrays);        /* Copy to the output file any extra markers that we want to preserve */    jcopy_markers_execute(src, dst, JCOPYOPT_ALL);        /* Execute image transformation, if any */    jtransform_execute_transformation(src, dst,				      src_coef_arrays,				      &transformoption);        /* Finish compression and release memory */    jpeg_finish_compress(dst);    jpeg_finish_decompress(src);    return 0;}/* ---------------------------------------------------------------------- */int jpeg_transform_fp(FILE *in, FILE *out,		      JXFORM_CODE transform,		      unsigned char *comment,		      unsigned int flags){    struct jpeg_decompress_struct src;    struct jpeg_compress_struct   dst;    struct jpeg_error_mgr jdsterr;    struct longjmp_error_mgr jsrcerr;        /* setup src */    src.err = jpeg_std_error(&jsrcerr.jpeg);    jsrcerr.jpeg.error_exit = longjmp_error_exit;    if (setjmp(jsrcerr.setjmp_buffer))	/* something went wrong within the jpeg library ... */	goto oops;    jpeg_create_decompress(&src);    jpeg_stdio_src(&src, in);        /* setup dst */    dst.err = jpeg_std_error(&jdsterr);    jpeg_create_compress(&dst);    jpeg_stdio_dest(&dst, out);    /* transform image */    do_transform(&src,&dst,transform,comment,flags);    /* cleanup */    jpeg_destroy_decompress(&src);    jpeg_destroy_compress(&dst);    return 0; oops:    jpeg_destroy_decompress(&src);    jpeg_destroy_compress(&dst);    return -1;}int jpeg_transform_files(char *infile, char *outfile,			 JXFORM_CODE transform,			 unsigned char *comment,			 unsigned int flags){    int rc;    FILE *in;    FILE *out;        /* open infile */    in = fopen(infile,"r");    if (NULL == in) {	fprintf(stderr,"open %s: %s\n",infile,strerror(errno));	return -1;    }        /* open outfile */    out = fopen(outfile,"w");    if (NULL == out) {	fprintf(stderr,"open %s: %s\n",outfile,strerror(errno));	fclose(in);	return -1;    }    /* go! */    rc = jpeg_transform_fp(in,out,transform,comment,flags);    fclose(in);    fclose(out);    return rc;}int jpeg_transform_inplace(char *file,			   JXFORM_CODE transform,			   unsigned char *comment,			   unsigned int flags){    char *tmpfile;    char *bakfile;    struct stat st;    int fd;    FILE *in  = NULL;    FILE *out = NULL;    /* are we allowed to write to the file? */    if (0 != access(file,W_OK)) {	fprintf(stderr,"access %s: %s\n",file,strerror(errno));	return -1;    }    /* open infile */    in = fopen(file,"r");    if (NULL == in) {	fprintf(stderr,"open %s: %s\n",file,strerror(errno));	return -1;    }        /* open tmpfile */    tmpfile = malloc(strlen(file)+10);    sprintf(tmpfile,"%s.XXXXXX",file);    fd = mkstemp(tmpfile);    if (-1 == fd) {	fprintf(stderr,"mkstemp(%s): %s\n",tmpfile,strerror(errno));	goto oops;    }    out = fdopen(fd,"w");    /* copy owner and permissions */    if (-1 == fstat(fileno(in),&st)) {	fprintf(stderr,"fstat(%s): %s\n",file,strerror(errno));	goto oops;    }    if (-1 == fchown(fileno(out),st.st_uid,st.st_gid)) {	fprintf(stderr,"fchown(%s): %s\n",tmpfile,strerror(errno));	goto oops;    }    if (-1 == fchmod(fileno(out),st.st_mode)) {	fprintf(stderr,"fchmod(%s): %s\n",tmpfile,strerror(errno));	goto oops;    }    /* transform */    if (0 != jpeg_transform_fp(in,out,transform,comment,flags))	goto oops;    /* worked ok -- commit */    fclose(in);    fclose(out);    if (flags & JFLAG_FILE_BACKUP) {	bakfile = malloc(strlen(file)+2);	sprintf(bakfile,"%s~",file);	rename(file,bakfile);	free(bakfile);    }    rename(tmpfile,file);    if (flags & JFLAG_FILE_KEEP_TIME) {	struct utimbuf u;	u.actime = st.st_atime;	u.modtime = st.st_mtime;	utime(file,&u);    }            /* cleanup & return */    free(tmpfile);    return 0; oops:    /* something went wrong -- rollback */    if (in)	fclose(in);    if (out) {	fclose(out);	unlink(tmpfile);    }    return -1;}

⌨️ 快捷键说明

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