Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.94-incubator
-
Android on Linux,
Windows 7
Description
Hi,
Currently, I'm using Sanselan for Android. ( http://code.google.com/p/sanselanandroid/ ) because Android exif reading and writing is a bit buggy. I've implemented the ExifInterface class in Sanselan based on this ( http://developer.android.com/reference/android/media/ExifInterface.html ), and tested it with several jpeg images and various exif and gps tags. It seems to work on Android, but when I tried to integrate it with the main Sanselan project, I got some exceptions.
1. String type writing and reading
- In TiffOutputField.create(), when a String value is passed, sometimes the ASCII field type is not identified correctly, whereas in the Android project, it is. I've merged the two projects and now ASCII fields are always identified.
1.a Exif string reading and writing
- For instance, the IMAGE_DESCRIPTION field is written correctly in the Android project, but in the main Sanselan it writes empty spaces.
1.b GPS string reading and writing
- For GPS tags, it reads them fine first, then writes them fine. But on second try, it cannot read them properly. With a program called ExifTool, however, the tags are parsable from the file
2. Tag Constant Values
- I've corrected some of the TagInfo constants in ExifTagConstants and GpsTagConstants based on this reference ( http://www.awaresystems.be/imaging/tiff/tifftags.html ). For example, GPSImgDirection, GPSAltitude, GPSAltitudeRef ... etc, length was -1 in Sanselan, but in the reference, it is 1.
3. ShortFieldType
- In addition, when a short is passed to a ShortFieldType, it throws an exception, saying it expects an integer? I'm not really sure what that means.
Anyways, I'm not very familiar with the EXIF specification, so I did not change the way values are written on the byte level. Nevertheless, I've tested ExifInterface with some other common tags and it does work with those. For the problematic cases, you can find the tests in ExifInterfaceTest.java, which also shows example usage of ExifInterface. For example:
ExifInterface exifInterface = new ExifInterface(filePath);
double oldAltitude = exifInterface.getAttributeDouble(GPSTagConstants.GPS_TAG_GPS_ALTITUDE, 0);
double newAltitude = 132.4;
exifInterface.setAttribute(GPSTagConstants.GPS_TAG_GPS_ALTITUDE, newAltitude);
exifInterface.saveAttributes();
double newestAltitude = exifInterface.getAttributeDouble(GPSTagConstants.GPS_TAG_GPS_ALTITUDE, 0);
Cheers