diff --git a/pom.xml b/pom.xml
index 9306cb4..bf53127 100644
--- a/pom.xml
+++ b/pom.xml
@@ -119,7 +119,7 @@
com.drewnoakes
metadata-extractor
- 2.6.2
+ 2.18.0
javax.servlet
@@ -220,6 +220,23 @@
tika-core
2.9.0
+
+
+ com.twelvemonkeys.imageio
+ imageio-jpeg
+ 3.9.4
+
+
+ com.twelvemonkeys.imageio
+ imageio-tiff
+ 3.9.4
+
+
+ com.twelvemonkeys.servlet
+ servlet
+ 3.9.4
+
+
org.eclipse.jetty
jetty-server
diff --git a/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java b/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java
index 30edcf2..262fffd 100644
--- a/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java
+++ b/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java
@@ -17,6 +17,8 @@ import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
+import com.drew.imaging.ImageMetadataReader;
+import com.drew.imaging.ImageProcessingException;
import com.drew.imaging.jpeg.JpegProcessingException;
import org.forkalsrud.album.db.DirectoryProps;
import org.forkalsrud.album.video.MovieCoder;
@@ -83,7 +85,7 @@ public class DirectoryMetadataGenerator {
// cache.properties and album.properties
continue;
}
- if (name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".JPG")) {
+ if (name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".JPG") || name.endsWith(".tif") || name.endsWith(".tiff") || name.endsWith(".TIF")) {
Map p = generateThumbnailProperties(f);
if (p != null) {
addPropsForFile(props, f, p);
@@ -132,22 +134,27 @@ public class DirectoryMetadataGenerator {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
NumberFormat nf = new DecimalFormat("0");
+
Metadata metadata;
try {
- metadata = JpegMetadataReader.readMetadata(f);
- } catch (JpegProcessingException e) {
+ metadata = ImageMetadataReader.readMetadata(f);
+ } catch (ImageProcessingException e) {
// not a JPEG file
return null;
}
try {
- Directory exifDirectory = metadata.getDirectory(ExifIFD0Directory.class);
- if (exifDirectory != null && exifDirectory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
- int orientation = exifDirectory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
- props.put("orientation", nf.format(orientation));
- hasOrientation = true;
+ Directory exifDirectory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+ if (exifDirectory != null
+ && exifDirectory.containsTag(ExifSubIFDDirectory.TAG_IMAGE_WIDTH)
+ && exifDirectory.containsTag(ExifSubIFDDirectory.TAG_IMAGE_HEIGHT)) {
+ int width = exifDirectory.getInt(ExifSubIFDDirectory.TAG_IMAGE_WIDTH);
+ int height = exifDirectory.getInt(ExifSubIFDDirectory.TAG_IMAGE_HEIGHT);
+ props.put("dimensions", new Dimension(width, height).toString());
+ hasDim = true;
}
- Directory exifSubDirectory = metadata.getDirectory(ExifSubIFDDirectory.class);
- if (exifSubDirectory != null && exifSubDirectory.containsTag(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH) &&
+
+ Directory exifSubDirectory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
+ if (exifSubDirectory != null && exifSubDirectory.containsTag(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH) &&
exifSubDirectory.containsTag(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT)) {
int width = exifSubDirectory.getInt(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH);
int height = exifSubDirectory.getInt(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT);
@@ -165,11 +172,13 @@ public class DirectoryMetadataGenerator {
String comment = exifSubDirectory.getString(ExifSubIFDDirectory.TAG_USER_COMMENT);
props.put("comment", comment);
}
- Directory jpegDirectory = metadata.getDirectory(JpegDirectory.class);
- if (jpegDirectory.containsTag(JpegDirectory.TAG_JPEG_IMAGE_WIDTH) &&
- jpegDirectory.containsTag(JpegDirectory.TAG_JPEG_IMAGE_HEIGHT)) {
- int width = jpegDirectory.getInt(JpegDirectory.TAG_JPEG_IMAGE_WIDTH);
- int height = jpegDirectory.getInt(JpegDirectory.TAG_JPEG_IMAGE_HEIGHT);
+
+ JpegDirectory jpegDirectory = metadata.getFirstDirectoryOfType(JpegDirectory.class);
+ if (jpegDirectory != null
+ && jpegDirectory.containsTag(JpegDirectory.TAG_IMAGE_WIDTH)
+ && jpegDirectory.containsTag(JpegDirectory.TAG_IMAGE_HEIGHT)) {
+ int width = jpegDirectory.getImageWidth();
+ int height = jpegDirectory.getImageHeight();
props.put("dimensions", new Dimension(width, height).toString());
hasDim = true;
}
@@ -196,7 +205,7 @@ public class DirectoryMetadataGenerator {
private Date getExifDate(Directory exifDirectory, int tagName) throws MetadataException {
- String dateStr = (String)exifDirectory.getObject(tagName);
+ String dateStr = exifDirectory.getString(tagName);
if (" : : : : ".equals(dateStr)) {
return null;
}
diff --git a/src/main/java/org/forkalsrud/album/web/AlbumServlet.java b/src/main/java/org/forkalsrud/album/web/AlbumServlet.java
index b559f3d..dcc0f8f 100644
--- a/src/main/java/org/forkalsrud/album/web/AlbumServlet.java
+++ b/src/main/java/org/forkalsrud/album/web/AlbumServlet.java
@@ -274,7 +274,12 @@ public class AlbumServlet
if (pathInfo.endsWith(".json")) {
pathInfo = pathInfo.substring(0, pathInfo.length() - ".json".length());
- handleJson(req, res, (DirectoryEntry)resolveEntry(pathInfo));
+ DirectoryEntry directoryEntry = (DirectoryEntry)resolveEntry(pathInfo);
+ if (directoryEntry == null) {
+ res.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ handleJson(req, res, directoryEntry);
return;
}
@@ -298,7 +303,6 @@ public class AlbumServlet
return;
}
} catch (Exception e) {
- e.fillInStackTrace();
throw new ServletException("sadness", e);
}
res.setStatus(HttpServletResponse.SC_NOT_FOUND);
diff --git a/src/main/java/org/forkalsrud/album/web/PictureScaler.java b/src/main/java/org/forkalsrud/album/web/PictureScaler.java
index d63e673..09e4dbe 100644
--- a/src/main/java/org/forkalsrud/album/web/PictureScaler.java
+++ b/src/main/java/org/forkalsrud/album/web/PictureScaler.java
@@ -170,14 +170,8 @@ public class PictureScaler {
while (intermediate.getWidth() < targetWidth) {
intermediate = intermediate.doubled();
}
-
- Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
- ImageReader reader = readers.next();
- ImageInputStream iis = ImageIO.createImageInputStream(file);
- reader.setInput(iis, true);
- ImageReadParam param = reader.getDefaultReadParam();
- BufferedImage img = reader.read(0, param);
- iis.close();
+
+ BufferedImage img = ImageIO.read(file);
// The orientation is about flipping and rotating. Here is what an 'F' looks like
// on pictures with each orientation.