From cb2a20ed2c85c5c88f520a552fd2b2c63ee5bc4b Mon Sep 17 00:00:00 2001 From: Knut Forkalsrud Date: Mon, 16 Oct 2023 18:50:44 -0700 Subject: [PATCH] Add TIF decoder update metadata parser That's Twelvemonkeys for TIF Drewnoakes for metadata --- pom.xml | 19 ++++++++- .../exif/DirectoryMetadataGenerator.java | 41 +++++++++++-------- .../forkalsrud/album/web/AlbumServlet.java | 8 +++- .../forkalsrud/album/web/PictureScaler.java | 10 +---- 4 files changed, 51 insertions(+), 27 deletions(-) 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.