--- /dev/null
+package tim.prune.data;
+
+import java.awt.Dimension;
+import java.io.File;
+
+import javax.swing.ImageIcon;
+
+/**
+ * Class to represent a photo and link to DataPoint
+ */
+public class Photo extends MediaObject
+{
+ /** Size of original image */
+ private Dimension _size = null;
+ /** rotation flag (clockwise from 0 to 3) */
+ private int _rotation = 0;
+ // TODO: Need to store caption for image?
+ /** Bearing, if any */
+ private double _bearing = -1.0;
+ /** thumbnail for image (from exif) */
+ private byte[] _exifThumbnail = null;
+
+ /**
+ * Constructor
+ * @param inFile File object for photo
+ */
+ public Photo(File inFile)
+ {
+ super(inFile, null);
+ }
+
+ /**
+ * Constructor using data, eg from zip file or URL
+ * @param inData data as byte array
+ * @param inName name of file from which it came
+ * @param inUrl url from which it came (or null)
+ */
+ public Photo(byte[] inData, String inName, String inUrl)
+ {
+ super(inData, inName, inUrl);
+ }
+
+ /**
+ * Calculate the size of the image (slow)
+ */
+ private void calculateSize()
+ {
+ ImageIcon icon = null;
+ if (_file != null)
+ icon = new ImageIcon(_file.getAbsolutePath());
+ else
+ icon = new ImageIcon(_data);
+ int width = icon.getIconWidth();
+ int height = icon.getIconHeight();
+ if (width > 0 && height > 0)
+ {
+ _size = new Dimension(width, height);
+ }
+ }
+
+ /**
+ * @return size of image as Dimension object
+ */
+ public Dimension getSize()
+ {
+ if (_size == null) {
+ calculateSize();
+ }
+ return _size;
+ }
+
+ /**
+ * @return width of the image, if known
+ */
+ public int getWidth()
+ {
+ if (getSize() == null) {return -1;}
+ return _size.width;
+ }
+
+ /**
+ * @return height of the image, if known
+ */
+ public int getHeight()
+ {
+ if (getSize() == null) {return -1;}
+ return _size.height;
+ }
+
+ /**
+ * @return byte array of thumbnail data
+ */
+ public byte[] getExifThumbnail()
+ {
+ return _exifThumbnail;
+ }
+
+ /**
+ * @param inBytes byte array from exif
+ */
+ public void setExifThumbnail(byte[] inBytes)
+ {
+ _exifThumbnail = inBytes;
+ }
+
+ /**
+ * Delete the cached data when the Photo is no longer needed
+ */
+ public void resetCachedData()
+ {
+ _size = null;
+ // remove thumbnail too
+ }
+
+ /**
+ * @param inRotation initial rotation value (from exif)
+ */
+ public void setRotation(int inRotation)
+ {
+ if (inRotation >= 0 && inRotation <= 3) {
+ _rotation = inRotation;
+ }
+ }
+
+ /**
+ * Rotate the image by 90 degrees
+ * @param inRight true to rotate right, false for left
+ */
+ public void rotate(boolean inRight)
+ {
+ int dir = inRight?1:3;
+ _rotation = (_rotation + dir) % 4;
+ }
+
+ /**
+ * @return rotation status
+ */
+ public int getRotationDegrees()
+ {
+ return _rotation * 90;
+ }
+
+ /**
+ * @return a new image icon for the whole image
+ */
+ public ImageIcon createImageIcon()
+ {
+ if (_file != null) {
+ return new ImageIcon(_file.getAbsolutePath());
+ }
+ if (_data != null) {
+ return new ImageIcon(_data);
+ }
+ return null;
+ }
+
+ /**
+ * @param inValue bearing in degrees, 0 to 360
+ */
+ public void setBearing(double inValue) {
+ _bearing = inValue;
+ }
+
+ /** @return bearing in degrees */
+ public double getBearing() {
+ return _bearing;
+ }
+}