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;
}
}