From da5192170bb7ed19a8eadbc8ac393b0fa222c7df Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 18:18:57 +0100 Subject: consolidate ExifImageMetaData and src/JpgcomImageMetaData into ImageMetaData --- src/ExifImageMetaData.H | 29 ------ src/ExifImageMetaData.cxx | 109 -------------------- src/GipfelWidget.cxx | 19 +--- src/ImageMetaData.H | 10 +- src/ImageMetaData.cxx | 242 ++++++++++++++++++++++++++++++++++++++++++-- src/JpgcomImageMetaData.H | 29 ------ src/JpgcomImageMetaData.cxx | 163 ----------------------------- src/Makefile.am | 6 +- src/gipfel.cxx | 3 +- 9 files changed, 247 insertions(+), 363 deletions(-) delete mode 100644 src/ExifImageMetaData.H delete mode 100644 src/ExifImageMetaData.cxx delete mode 100644 src/JpgcomImageMetaData.H delete mode 100644 src/JpgcomImageMetaData.cxx (limited to 'src') diff --git a/src/ExifImageMetaData.H b/src/ExifImageMetaData.H deleted file mode 100644 index f864b0f..0000000 --- a/src/ExifImageMetaData.H +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright 2006 by Johannes Hofmann -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation; either -// version 2 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Library General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -// USA. -// - -#ifndef EXIF_IMAGE_META_DATA_H -#define EXIF_IMAGE_META_DATA_H - -#include "ImageMetaData.H" - -class ExifImageMetaData : public ImageMetaData { - virtual int load_image(char *name); - virtual int save_image(char *in_img, char *out_img); -}; -#endif diff --git a/src/ExifImageMetaData.cxx b/src/ExifImageMetaData.cxx deleted file mode 100644 index 4002e97..0000000 --- a/src/ExifImageMetaData.cxx +++ /dev/null @@ -1,109 +0,0 @@ -// -// Copyright 2006 by Johannes Hofmann -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Library General Public -// License as published by the Free Software Foundation; either -// version 2 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Library General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -// USA. -// - -#include -#include -#include -#include - -#include "util.h" - -#include "ExifImageMetaData.H" - -#define FOCAL_LENGTH_IN_35MM_FILM 0xa405 -#define GPS_LATIITUDE 0x0002 -#define GPS_LONGITUDE 0x0004 -#define GPS_ALTITUDE 0x0006 - - -static double -degminsecstr2double(char *val) { - double ret, dv; - - ret = 0.0; - for (dv=1.0; dv <= 3600.0; dv = dv * 60.0) { - ret = ret + atof(val) / dv; - val = strchr(val, ','); - if (!val || val[1] == '\0') { - break; - } else { - val++; - } - } - - return ret; -} - - -int -ExifImageMetaData::load_image(char *name) { - char * args[32]; - FILE *p; - pid_t pid; - int status; - char buf[1024]; - char val[1024]; - int id; - - args[0] = "exif"; - args[1] = "-i"; - args[2] = "-m"; - args[3] = name; - args[4] = NULL; - - p = pexecvp(args[0], args, &pid, "r"); - - if (p) { - while (fgets(buf, sizeof(buf), p) != NULL) { - if (sscanf(buf, "%x\t%[^\n]\n", &id, val) != 2) { - continue; - } - - switch(id) { - case FOCAL_LENGTH_IN_35MM_FILM: - focallength_sensor_ratio = atof(val) / 35.0; - break; - case GPS_LONGITUDE: - longitude = degminsecstr2double(val); - break; - case GPS_LATIITUDE: - latitude = degminsecstr2double(val); - break; - case GPS_ALTITUDE: - height = atof(val); - break; - } - } - } - - fclose(p); - waitpid(pid, &status, 0); - if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { - fprintf(stderr, "%s not found\n", args[0]); - } - - return 0; -} - - -int -ExifImageMetaData::save_image(char *in_img, char *out_img) { - return 1; -} - diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index b8ebc79..2efd231 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -35,8 +35,7 @@ #include #include -#include "ExifImageMetaData.H" -#include "JpgcomImageMetaData.H" +#include "ImageMetaData.H" #include "Fl_Search_Chooser.H" #include "choose_hill.H" #include "GipfelWidget.H" @@ -106,7 +105,7 @@ GipfelWidget::load_image(char *file) { mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); // try to retrieve gipfel data from JPEG comment section - md = new JpgcomImageMetaData(); + md = new ImageMetaData(); ret = md->load_image(file); if (ret != 1) { set_view_long(md->get_longitude()); @@ -125,18 +124,6 @@ GipfelWidget::load_image(char *file) { delete md; - if (ret == 1) { - md = new ExifImageMetaData(); - ret = md->load_image(file); - if (ret == 0) { - set_scale(md->get_focallength_sensor_ratio() * img->w()); - set_view_long(md->get_longitude()); - set_view_lat(md->get_latitude()); - set_view_height(md->get_height()); - } - delete md; - } - return 0; } @@ -155,7 +142,7 @@ GipfelWidget::save_image(char *file) { return 1; } - md = new JpgcomImageMetaData(); + md = new ImageMetaData(); md->set_longitude(get_view_long()); md->set_latitude(get_view_lat()); diff --git a/src/ImageMetaData.H b/src/ImageMetaData.H index 637b758..442aaef 100644 --- a/src/ImageMetaData.H +++ b/src/ImageMetaData.H @@ -21,7 +21,7 @@ #define IMAGE_META_DATA_H class ImageMetaData { - protected: + private: double longitude; double latitude; double height; @@ -31,11 +31,15 @@ class ImageMetaData { double focallength_sensor_ratio; int projection_type; + int load_image_jpgcom(char *name); + int save_image_jpgcom(char *in_img, char *out_img); + int load_image_exif(char *name); + public: ImageMetaData(); - virtual int load_image(char *name); - virtual int save_image(char *in_img, char *out_img); + int load_image(char *name); + 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 5c54a17..424a792 100644 --- a/src/ImageMetaData.cxx +++ b/src/ImageMetaData.cxx @@ -17,32 +17,258 @@ // USA. // +#include #include #include +#include +#include +#include +#include + + +#include "util.h" #include "ImageMetaData.H" ImageMetaData::ImageMetaData() { longitude = NAN; latitude = NAN; - height = NAN; - direction = NAN; - nick = NAN; - tilt = NAN; - focallength_sensor_ratio = NAN; - projection_type = -1; + height = 0.0; + direction = 0.0; + nick = 0.0; + tilt = 0.0; + focallength_sensor_ratio = 1.0; + projection_type = 1; } + int ImageMetaData::load_image(char *name) { - return 1; + int ret; + + ret = load_image_jpgcom(name); + if (ret != 0) { + ret = load_image_exif(name); + } + + return ret; } int ImageMetaData::save_image(char *in_img, char *out_img) { - return 1; + return save_image_jpgcom(in_img, out_img); +} + +static double +degminsecstr2double(char *val) { + double ret, dv; + + ret = 0.0; + for (dv=1.0; dv <= 3600.0; dv = dv * 60.0) { + ret = ret + atof(val) / dv; + val = strchr(val, ','); + if (!val || val[1] == '\0') { + break; + } else { + val++; + } + } + + return ret; +} + +#define EXIF_FOCAL_LENGTH_IN_35MM_FILM 0xa405 +#define EXIF_GPS_LATIITUDE 0x0002 +#define EXIF_GPS_LONGITUDE 0x0004 +#define EXIF_GPS_ALTITUDE 0x0006 + +int +ImageMetaData::load_image_exif(char *name) { + char * args[32]; + FILE *p; + pid_t pid; + int status; + char buf[1024]; + char val[1024]; + int id; + + args[0] = "exif"; + args[1] = "-i"; + args[2] = "-m"; + args[3] = name; + args[4] = NULL; + + p = pexecvp(args[0], args, &pid, "r"); + + if (p) { + while (fgets(buf, sizeof(buf), p) != NULL) { + if (sscanf(buf, "%x\t%[^\n]\n", &id, val) != 2) { + continue; + } + + switch(id) { + case EXIF_FOCAL_LENGTH_IN_35MM_FILM: + focallength_sensor_ratio = atof(val) / 35.0; + break; + case EXIF_GPS_LONGITUDE: + longitude = degminsecstr2double(val); + break; + case EXIF_GPS_LATIITUDE: + latitude = degminsecstr2double(val); + break; + case EXIF_GPS_ALTITUDE: + height = atof(val); + break; + } + } + } + + fclose(p); + waitpid(pid, &status, 0); + if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { + fprintf(stderr, "%s not found\n", args[0]); + } + + return 0; +} + + +#define GIPFEL_FORMAT_1 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, scale %lf, projection type %d" +#define GIPFEL_FORMAT_2 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, focallength_sensor_ratio %lf, projection type %d" + +int +ImageMetaData::load_image_jpgcom(char *name) { + char * args[32]; + FILE *p; + pid_t pid; + int status; + char buf[1024]; + double lo, la, he, dir, ni, ti, fr; + int pt; + int ret = 1; + + args[0] = "rdjpgcom"; + args[1] = name; + args[2] = NULL; + + p = pexecvp(args[0], args, &pid, "r"); + + if (p) { + while (fgets(buf, sizeof(buf), p) != NULL) { + if (sscanf(buf, GIPFEL_FORMAT_2, + &lo, &la, &he, &dir, &ni, &ti, &fr, &pt) >= 7) { + + longitude = lo; + latitude = la; + height = he; + direction = dir; + nick = ni; + tilt = ti; + focallength_sensor_ratio = fr; + projection_type = pt; + + ret = 0; + + break; + } else if (sscanf(buf, GIPFEL_FORMAT_1, + &lo, &la, &he, &dir, &ni, &ti, &fr, &pt) >= 7) { + + longitude = lo; + latitude = la; + height = he; + direction = dir; + nick = ni; + tilt = ti; + focallength_sensor_ratio = fr; + projection_type = pt; + + ret = 2; // special return value for compatibility with + // old format + + break; + } + } + + fclose(p); + waitpid(pid, &status, 0); + if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { + fprintf(stderr, "%s not found\n", args[0]); + } + } + + return ret; } +int +ImageMetaData::save_image_jpgcom(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; +} + + double ImageMetaData::get_longitude() { return longitude; diff --git a/src/JpgcomImageMetaData.H b/src/JpgcomImageMetaData.H deleted file mode 100644 index 944833a..0000000 --- a/src/JpgcomImageMetaData.H +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright 2006 by Johannes Hofmann -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation; either -// version 2 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Library General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -// USA. -// - -#ifndef JPGCOM_IMAGE_META_DATA_H -#define JPGCOM_IMAGE_META_DATA_H - -#include "ImageMetaData.H" - -class JpgcomImageMetaData : public ImageMetaData { - virtual int load_image(char *name); - virtual int save_image(char *in_img, char *out_img); -}; -#endif diff --git a/src/JpgcomImageMetaData.cxx b/src/JpgcomImageMetaData.cxx deleted file mode 100644 index 407b6af..0000000 --- a/src/JpgcomImageMetaData.cxx +++ /dev/null @@ -1,163 +0,0 @@ -// -// Copyright 2006 by Johannes Hofmann -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Library General Public -// License as published by the Free Software Foundation; either -// version 2 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Library General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -// USA. -// - -#include -#include -#include -#include -#include - -#include "util.h" - -#include "JpgcomImageMetaData.H" - -#define GIPFEL_FORMAT_1 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, scale %lf, projection type %d" -#define GIPFEL_FORMAT_2 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, focallength_sensor_ratio %lf, projection type %d" - -int -JpgcomImageMetaData::load_image(char *name) { - char * args[32]; - FILE *p; - pid_t pid; - int status; - char buf[1024]; - double lo, la, he, dir, ni, ti, fr; - int pt; - int ret = 1; - - args[0] = "rdjpgcom"; - args[1] = name; - args[2] = NULL; - - p = pexecvp(args[0], args, &pid, "r"); - - if (p) { - while (fgets(buf, sizeof(buf), p) != NULL) { - if (sscanf(buf, GIPFEL_FORMAT_2, - &lo, &la, &he, &dir, &ni, &ti, &fr, &pt) >= 7) { - - longitude = lo; - latitude = la; - height = he; - direction = dir; - nick = ni; - tilt = ti; - focallength_sensor_ratio = fr; - projection_type = pt; - - ret = 0; - - break; - } else if (sscanf(buf, GIPFEL_FORMAT_1, - &lo, &la, &he, &dir, &ni, &ti, &fr, &pt) >= 7) { - - longitude = lo; - latitude = la; - height = he; - direction = dir; - nick = ni; - tilt = ti; - focallength_sensor_ratio = fr; - projection_type = pt; - - ret = 2; // special return value for compatibility with - // old format - - break; - } - } - - fclose(p); - waitpid(pid, &status, 0); - if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { - fprintf(stderr, "%s not found\n", args[0]); - } - } - - return ret; -} - -int -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; -} diff --git a/src/Makefile.am b/src/Makefile.am index a730123..8ba69c1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,9 +17,7 @@ gipfel_SOURCES = \ JPEGOutputImage.cxx \ TIFFOutputImage.cxx \ PreviewOutputImage.cxx \ - ImageMetaData.cxx \ - JpgcomImageMetaData.cxx \ - ExifImageMetaData.cxx + ImageMetaData.cxx noinst_HEADERS = \ GipfelWidget.H \ @@ -38,6 +36,4 @@ noinst_HEADERS = \ TIFFOutputImage.H \ PreviewOutputImage.H \ ImageMetaData.H \ - JpgcomImageMetaData.H \ - ExifImageMetaData.H \ util.h diff --git a/src/gipfel.cxx b/src/gipfel.cxx index 1106c48..13ef3e5 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -438,7 +439,7 @@ int main(int argc, char** argv) { if (view_point) { gipf->set_viewpoint(view_point); } else if (img_file && - gipf->get_view_lat()==0.0 && gipf->get_view_long()==0.0) { + (isnan(gipf->get_view_lat()) || isnan(gipf->get_view_long()))) { viewpoint_cb(NULL, NULL); } -- cgit v1.2.3