diff options
| -rw-r--r-- | src/ImageMetaData.H | 7 | ||||
| -rw-r--r-- | src/ImageMetaData.cxx | 65 | 
2 files changed, 59 insertions, 13 deletions
diff --git a/src/ImageMetaData.H b/src/ImageMetaData.H index aa85c15..f9baf75 100644 --- a/src/ImageMetaData.H +++ b/src/ImageMetaData.H @@ -9,6 +9,8 @@  class ImageMetaData {  	private: +		char *manufacturer; +		char *model;  		double longitude;  		double latitude;  		double height; @@ -17,6 +19,7 @@ class ImageMetaData {  		double tilt;  		double k0;  		double k1; +		double focal_length;  		double focal_length_35mm;  		double scale;  		int    projection_type; @@ -27,16 +30,20 @@ class ImageMetaData {  	public:  		ImageMetaData(); +		~ImageMetaData();  		int load_image(char *name, int img_width);  		int save_image(char *in_img, char *out_img); +		const char *get_manufacturer(); +		const char *get_model();   		double get_longitude();  		double get_latitude();  		double get_height();  		double get_direction();  		double get_nick();  		double get_tilt(); +		double get_focal_length();  		double get_focal_length_35mm();  		int    get_projection_type();  		void get_distortion_params(double *_k0, double *_k1); diff --git a/src/ImageMetaData.cxx b/src/ImageMetaData.cxx index 007d7b9..0e2c03b 100644 --- a/src/ImageMetaData.cxx +++ b/src/ImageMetaData.cxx @@ -18,19 +18,26 @@  #include "ImageMetaData.H"  ImageMetaData::ImageMetaData() { +	manufacturer = NULL; +	model = NULL;  	longitude = NAN;  	latitude = NAN; -	height = 0.0; -	direction = 0.0; -	nick = 0.0; -	tilt = 0.0; -	k0 = 0.0; -	k1 = 0.0; -	focal_length_35mm = 35.0; +	height = NAN; +	direction = NAN; +	nick = NAN; +	tilt = NAN; +	k0 = NAN; +	k1 = NAN; +	focal_length = NAN; +	focal_length_35mm = NAN;  	scale = NAN;  	projection_type = 0;  } +ImageMetaData::~ImageMetaData() { +	if (manufacturer) free(manufacturer); +	if (model) free(model); +}  int  ImageMetaData::load_image(char *name, int img_width) { @@ -39,10 +46,16 @@ ImageMetaData::load_image(char *name, int img_width) {  	ret = load_image_jpgcom(name);  	if (ret == 2) { // old format  		focal_length_35mm = scale * 35.0 / (double) img_width; -	} else if (ret == 1) { // get reasonable defaults from exif data -		ret = load_image_exif(name);  	} +	load_image_exif(name); // fill missing values from exif data + +	if (isnan(direction)) direction = 0.0; +	if (isnan(nick)) nick = 0.0; +	if (isnan(tilt)) tilt = 0.0; +	if (isnan(k0)) k0 = 0.0; +	if (isnan(k1)) k1 = 0.0; +  	return ret;  } @@ -69,6 +82,9 @@ degminsecstr2double(char *val) {      return ret;  } +#define EXIF_MANUFACTURER              0x010f +#define EXIF_MODEL                     0x0110 +#define EXIF_FOCAL_LENGTH              0x920a  #define EXIF_FOCAL_LENGTH_IN_35MM_FILM 0xa405  #define EXIF_GPS_LATIITUDE             0x0002  #define EXIF_GPS_LONGITUDE             0x0004 @@ -99,17 +115,26 @@ ImageMetaData::load_image_exif(char *name) {              }              switch(id) { +                case EXIF_MANUFACTURER: +                    if (!manufacturer) manufacturer = strdup(val); +                    break; +                case EXIF_MODEL: +                    if (!model) model = strdup(val); +                    break; +                case EXIF_FOCAL_LENGTH: +                    if (isnan(focal_length)) focal_length = atof(val); +                    break;                  case EXIF_FOCAL_LENGTH_IN_35MM_FILM: -                    focal_length_35mm = atof(val); +                    if (isnan(focal_length_35mm)) focal_length_35mm = atof(val);                      break;                  case EXIF_GPS_LONGITUDE: -                    longitude = degminsecstr2double(val); +                    if (isnan(longitude)) longitude = degminsecstr2double(val);                      break;                  case EXIF_GPS_LATIITUDE: -                    latitude = degminsecstr2double(val); +                    if (isnan(latitude)) latitude = degminsecstr2double(val);                      break;                  case EXIF_GPS_ALTITUDE: -                    height = atof(val); +                    if (isnan(height)) height = atof(val);                      break;              }          } @@ -266,6 +291,15 @@ ImageMetaData::save_image_jpgcom(char *in_img, char *out_img) {      return 0;  } +const char* +ImageMetaData::get_manufacturer() { +	return manufacturer; +} + +const char* +ImageMetaData::get_model() { +	return model; +}  double  ImageMetaData::get_longitude() { @@ -298,6 +332,11 @@ ImageMetaData::get_tilt() {  }  double +ImageMetaData::get_focal_length() { +	return focal_length; +} + +double  ImageMetaData::get_focal_length_35mm() {  	return focal_length_35mm;  }  | 
