📄 jpegtools.c
字号:
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 + -