From 20286c5a434580d38dc0a85981503d6310b9e55a Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sat, 28 Oct 2006 00:36:32 +0200 Subject: move Jpeg header writing to JpgcomImageMetaData class update NEWS --- NEWS | 7 ++++ src/ExifImageMetaData.H | 2 +- src/ExifImageMetaData.cxx | 3 +- src/GipfelWidget.cxx | 82 +++++++++------------------------------------ src/ImageMetaData.H | 2 +- src/ImageMetaData.cxx | 2 +- src/JpgcomImageMetaData.H | 2 +- src/JpgcomImageMetaData.cxx | 69 +++++++++++++++++++++++++++++++++++++- 8 files changed, 96 insertions(+), 73 deletions(-) diff --git a/NEWS b/NEWS index 7a4cfa5..e672b42 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,12 @@ gipfel ChangeLog ================= +gipfel-0.2.0 + - Change orientation format in jpeg header to make it independent + of the image size. One can now scale an already oriented image + without invalidating the orientation information. + - gipfel now tries to find a reasonable default for the scale value + when opening new images based on the "Focal Length In 35mm" Exif + tag, if it exists. gipfel-0.1.3 - Add stitching mode (gipfel -s). See README for details. diff --git a/src/ExifImageMetaData.H b/src/ExifImageMetaData.H index dd17871..f864b0f 100644 --- a/src/ExifImageMetaData.H +++ b/src/ExifImageMetaData.H @@ -24,6 +24,6 @@ class ExifImageMetaData : public ImageMetaData { virtual int load_image(char *name); - virtual int save_image(char *name); + virtual int save_image(char *in_img, char *out_img); }; #endif diff --git a/src/ExifImageMetaData.cxx b/src/ExifImageMetaData.cxx index 1ba215e..0de7478 100644 --- a/src/ExifImageMetaData.cxx +++ b/src/ExifImageMetaData.cxx @@ -70,6 +70,7 @@ ExifImageMetaData::load_image(char *name) { int -ExifImageMetaData::save_image(char *name) { +ExifImageMetaData::save_image(char *in_img, char *out_img) { + return 1; } diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 8314222..33a3987 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -39,7 +39,6 @@ #include "JpgcomImageMetaData.H" #include "Fl_Search_Chooser.H" #include "choose_hill.H" -#include "util.h" #include "GipfelWidget.H" #define CROSS_SIZE 2 @@ -74,8 +73,6 @@ GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { fl_register_images(); } -#define GIPFEL_FORMAT "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, scale %lf, projection type %d" - int GipfelWidget::load_image(char *file) { Fl_Image *new_img; @@ -108,8 +105,7 @@ GipfelWidget::load_image(char *file) { mb->box(FL_NO_BOX); mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); -// try to retrieve gipfel data from JPEG comment section - + // try to retrieve gipfel data from JPEG comment section md = new JpgcomImageMetaData(); ret = md->load_image(file); if (ret != 1) { @@ -148,79 +144,31 @@ GipfelWidget::get_image_filename() { int GipfelWidget::save_image(char *file) { - char * args[32]; - FILE *p, *out; - pid_t pid; - char buf[1024]; - int status; - size_t n; - struct stat in_stat, out_stat; + ImageMetaData *md; + int ret; if (img_file == NULL) { fprintf(stderr, "Nothing to save\n"); return 1; } - if (stat(img_file, &in_stat) != 0) { - perror("stat"); - return 1; - } - - if (stat(file, &out_stat) == 0) { - if (in_stat.st_ino == out_stat.st_ino) { - fprintf(stderr, "Input image %s and output image %s are the same file\n", - img_file, file); - return 1; - } - } + md = new JpgcomImageMetaData(); - out = fopen(file, "w"); - if (out == NULL) { - perror("fopen"); - return 1; - } + md->set_longitude(get_view_long()); + md->set_latitude(get_view_lat()); + md->set_height(get_view_height()); + md->set_direction(get_center_angle()); + md->set_nick(get_nick_angle()); + md->set_tilt(get_tilt_angle()); + md->set_focallength_sensor_ratio(get_scale() / (double) img->w()); + md->set_projection_type((int) get_projection()); - snprintf(buf, sizeof(buf), GIPFEL_FORMAT, - get_view_long(), - get_view_lat(), - get_view_height(), - get_center_angle(), - get_nick_angle(), - get_tilt_angle(), - get_scale(), - (int) get_projection()); - -// try to save gipfel data in JPEG comment section - args[0] = "wrjpgcom"; - args[1] = "-replace"; - args[2] = "-comment"; - args[3] = buf; - args[4] = img_file; - args[5] = NULL; - - p = pexecvp(args[0], args, &pid, "r"); - - if (p) { - while ((n = fread(buf, 1, sizeof(buf), p)) != 0) { - if (fwrite(buf, 1, n, out) != n) { - perror("fwrite"); - fclose(out); - fclose(p); - waitpid(pid, &status, 0); - } - } - fclose(p); - waitpid(pid, &status, 0); - if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { - fprintf(stderr, "%s not found\n", args[0]); - } - } + ret = md->save_image(img_file, file); + delete md; - fclose(out); - return 0; + return ret; } - int GipfelWidget::load_data(const char *file) { int r; diff --git a/src/ImageMetaData.H b/src/ImageMetaData.H index 1318e10..637b758 100644 --- a/src/ImageMetaData.H +++ b/src/ImageMetaData.H @@ -35,7 +35,7 @@ class ImageMetaData { ImageMetaData(); virtual int load_image(char *name); - virtual int save_image(char *name); + virtual int save_image(char *in_img, char *out_img); double get_longitude(); double get_latitude(); diff --git a/src/ImageMetaData.cxx b/src/ImageMetaData.cxx index 745529b..5c54a17 100644 --- a/src/ImageMetaData.cxx +++ b/src/ImageMetaData.cxx @@ -39,7 +39,7 @@ ImageMetaData::load_image(char *name) { } int -ImageMetaData::save_image(char *name) { +ImageMetaData::save_image(char *in_img, char *out_img) { return 1; } diff --git a/src/JpgcomImageMetaData.H b/src/JpgcomImageMetaData.H index 70e266e..944833a 100644 --- a/src/JpgcomImageMetaData.H +++ b/src/JpgcomImageMetaData.H @@ -24,6 +24,6 @@ class JpgcomImageMetaData : public ImageMetaData { virtual int load_image(char *name); - virtual int save_image(char *name); + virtual int save_image(char *in_img, char *out_img); }; #endif diff --git a/src/JpgcomImageMetaData.cxx b/src/JpgcomImageMetaData.cxx index 8dcd54e..407b6af 100644 --- a/src/JpgcomImageMetaData.cxx +++ b/src/JpgcomImageMetaData.cxx @@ -19,7 +19,9 @@ #include #include +#include #include +#include #include "util.h" @@ -92,5 +94,70 @@ JpgcomImageMetaData::load_image(char *name) { } int -JpgcomImageMetaData::save_image(char *name) { +JpgcomImageMetaData::save_image(char *in_img, char *out_img) { + char * args[32]; + FILE *p, *out; + pid_t pid; + char buf[1024]; + int status; + size_t n; + struct stat in_stat, out_stat; + + if (stat(in_img, &in_stat) != 0) { + perror("stat"); + return 1; + } + + if (stat(out_img, &out_stat) == 0) { + if (in_stat.st_ino == out_stat.st_ino) { + fprintf(stderr, "Input image %s and output image %s are the same file\n", + in_img, out_img); + return 1; + } + } + + out = fopen(out_img, "w"); + if (out == NULL) { + perror("fopen"); + return 1; + } + + snprintf(buf, sizeof(buf), GIPFEL_FORMAT_2, + longitude, + latitude, + height, + direction, + nick, + tilt, + focallength_sensor_ratio, + projection_type); + + // try to save gipfel data in JPEG comment section + args[0] = "wrjpgcom"; + args[1] = "-replace"; + args[2] = "-comment"; + args[3] = buf; + args[4] = in_img; + args[5] = NULL; + + p = pexecvp(args[0], args, &pid, "r"); + + if (p) { + while ((n = fread(buf, 1, sizeof(buf), p)) != 0) { + if (fwrite(buf, 1, n, out) != n) { + perror("fwrite"); + fclose(out); + fclose(p); + waitpid(pid, &status, 0); + } + } + fclose(p); + waitpid(pid, &status, 0); + if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { + fprintf(stderr, "%s not found\n", args[0]); + } + } + + fclose(out); + return 0; } -- cgit v1.2.3