summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS7
-rw-r--r--src/ExifImageMetaData.H2
-rw-r--r--src/ExifImageMetaData.cxx3
-rw-r--r--src/GipfelWidget.cxx82
-rw-r--r--src/ImageMetaData.H2
-rw-r--r--src/ImageMetaData.cxx2
-rw-r--r--src/JpgcomImageMetaData.H2
-rw-r--r--src/JpgcomImageMetaData.cxx69
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 <stdlib.h>
#include <stdio.h>
+#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/stat.h>
#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;
}