X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fjpeg%2FJpegData.java;fp=src%2Ftim%2Fprune%2Fjpeg%2FJpegData.java;h=8a25f6d276cf0d4355439b7495ba44ef463d2a34;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/jpeg/JpegData.java b/src/tim/prune/jpeg/JpegData.java new file mode 100644 index 0000000..8a25f6d --- /dev/null +++ b/src/tim/prune/jpeg/JpegData.java @@ -0,0 +1,254 @@ +package tim.prune.jpeg; + +import java.util.ArrayList; + +/** + * Class to hold the GPS data extracted from a Jpeg including position and time + */ +public class JpegData +{ + private boolean _exifDataPresent = false; + private char _latitudeRef = '\0'; + private char _longitudeRef = '\0'; + private byte _altitudeRef = 0; + private double[] _latitude = null; + private double[] _longitude = null; + private int _altitude = -1; + private boolean _altitudePresent = false; + private int[] _gpsTimestamp = null; + private int[] _gpsDatestamp = null; + private String _originalTimestamp = null; + private String _digitizedTimestamp = null; + private int _orientationCode = -1; + private byte[] _thumbnail = null; + private double _bearing = -1.0; + private ArrayList _errors = null; + + + /** + * Set the exif data present flag + */ + public void setExifDataPresent() + { + _exifDataPresent = true; + } + /** + * @return true if exif data found + */ + public boolean getExifDataPresent() + { + return _exifDataPresent; + } + + /** + * Set the latitude reference (N/S) + * @param inString string containing reference + */ + public void setLatitudeRef(String inString) + { + if (inString != null && inString.length() == 1) + _latitudeRef = inString.charAt(0); + } + + /** + * Set the latitude + * @param inValues array of three doubles for deg-min-sec + */ + public void setLatitude(double[] inValues) + { + if (inValues != null && inValues.length == 3) + _latitude = inValues; + } + + /** + * Set the longitude reference (E/W) + * @param inString string containing reference + */ + public void setLongitudeRef(String inString) + { + if (inString != null && inString.length() == 1) + _longitudeRef = inString.charAt(0); + } + + /** + * Set the longitude + * @param inValues array of three doubles for deg-min-sec + */ + public void setLongitude(double[] inValues) + { + if (inValues != null && inValues.length == 3) + _longitude = inValues; + } + + /** + * Set the altitude reference (sea level / not) + * @param inByte byte representing reference + */ + public void setAltitudeRef(byte inByte) + { + _altitudeRef = inByte; + } + + /** + * Set the altitude + * @param inValue integer representing altitude + */ + public void setAltitude(int inValue) + { + _altitude = inValue; + _altitudePresent = true; + } + + /** + * Set the Gps timestamp + * @param inValues array of ints holding timestamp + */ + public void setGpsTimestamp(int[] inValues) + { + _gpsTimestamp = inValues; + } + + /** + * Set the Gps datestamp + * @param inValues array of ints holding datestamp + */ + public void setGpsDatestamp(int[] inValues) + { + _gpsDatestamp = inValues; + } + + /** + * Set the original timestamp + * @param inStamp original timestamp of photo + */ + public void setOriginalTimestamp(String inStamp) + { + _originalTimestamp = inStamp; + } + + /** + * Set the digitized timestamp + * @param inStamp digitized (creation) timestamp of photo + */ + public void setDigitizedTimestamp(String inStamp) + { + _digitizedTimestamp = inStamp; + } + + /** + * Set the orientation code + * @param inCode code from exif (1 to 8) + */ + public void setOrientationCode(int inCode) + { + if (inCode >= 1 && inCode <= 8) { + _orientationCode = inCode; + } + } + + /** + * Set the bearing (0 - 360) + * @param inBearing bearing in degrees + */ + public void setBearing(double inBearing) + { + _bearing = inBearing; + } + + /** @return latitude ref as char */ + public char getLatitudeRef() { return _latitudeRef; } + /** @return latitude as array of 3 Rationals */ + public double[] getLatitude() { return _latitude; } + /** @return longitude ref as char */ + public char getLongitudeRef() { return _longitudeRef; } + /** @return longitude as array of 3 doubles */ + public double[] getLongitude() { return _longitude; } + /** @return altitude ref as byte (should be 0) */ + public byte getAltitudeRef() { return _altitudeRef; } + /** @return true if altitude present */ + public boolean hasAltitude() { return _altitudePresent; } + /** @return altitude as int */ + public int getAltitude() { return _altitude; } + /** @return Gps timestamp as array of 3 ints */ + public int[] getGpsTimestamp() { return _gpsTimestamp; } + /** @return Gps datestamp as array of 3 ints */ + public int[] getGpsDatestamp() { return _gpsDatestamp; } + /** @return orientation code (1 to 8) */ + public int getOrientationCode() { return _orientationCode; } + /** @return original timestamp as string */ + public String getOriginalTimestamp() { return _originalTimestamp; } + /** @return digitized timestamp as string */ + public String getDigitizedTimestamp() { return _digitizedTimestamp; } + /** @return bearing in degrees or -1 */ + public double getBearing() { return _bearing; } + + /** + * Set the thumbnail + * @param inBytes byte array containing thumbnail + */ + public void setThumbnailImage(byte[] inBytes) { + _thumbnail = inBytes; + } + /** @return thumbnail as byte array */ + public byte[] getThumbnailImage() { + return _thumbnail; + } + + /** + * @return rotation required to display photo properly (0 to 3) + */ + public int getRequiredRotation() + { + if (_orientationCode <= 2) { return 0; } // no rotation required + if (_orientationCode <= 4) { return 2; } // 180 degrees + if (_orientationCode <= 6) { return 1; } // 270 degrees, so need to rotate by 90 + return 3; // 90 degrees, so need to rotate by 270 + } + + /** + * @return true if data looks valid, ie has at least lat and long + * (altitude and timestamp optional). + */ + public boolean isGpsValid() + { + return (_latitudeRef == 'N' || _latitudeRef == 'n' || _latitudeRef == 'S' || _latitudeRef == 's') + && _latitude != null + && (_longitudeRef == 'E' || _longitudeRef == 'e' || _longitudeRef == 'W' || _longitudeRef == 'w') + && _longitude != null; + } + + /** + * Add the given error message to the list of errors + * @param inError String containing error message + */ + public void addError(String inError) + { + if (_errors == null) _errors = new ArrayList(); + _errors.add(inError); + } + + /** + * @return the number of errors, if any + */ + public int getNumErrors() + { + if (_errors == null) return 0; + return _errors.size(); + } + + /** + * @return true if errors occurred + */ + public boolean hasErrors() + { + return getNumErrors() > 0; + } + + /** + * @return all errors as a list + */ + public ArrayList getErrors() + { + return _errors; + } +}