generate better quality webp thumbnails
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / metadata / fileTypes / Picture.java
index 7a1ba39..9604211 100755 (executable)
@@ -5,7 +5,7 @@
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 3 of the GNU Lesser General Public License
  * or later as published by the Free Software Foundation.
-*/
+ */
 
 package eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes;
 
@@ -17,8 +17,7 @@ import eu.svjatoslav.meviz.htmlindexer.ImageFormatError;
 import eu.svjatoslav.meviz.htmlindexer.Utils;
 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
 
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReader;
+import javax.imageio.*;
 import javax.imageio.stream.FileImageOutputStream;
 import javax.imageio.stream.ImageInputStream;
 import javax.imageio.stream.ImageOutputStream;
@@ -28,8 +27,10 @@ import java.awt.image.BufferedImage;
 import java.awt.image.FilteredImageSource;
 import java.awt.image.ImageFilter;
 import java.awt.image.ImageProducer;
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import static eu.svjatoslav.meviz.htmlindexer.Utils.getBufferedImage;
@@ -127,29 +128,39 @@ public class Picture extends AbstractFile {
     private static void makeJpegThumbnail(File inputFile, File outputFile, java.awt.Dimension preferredTargetDimensions)
             throws IOException, ImageFormatError {
 
-            final BufferedImage inputImage = getBufferedImage(inputFile);
+        final BufferedImage inputImage = getBufferedImage(inputFile);
 
-            final java.awt.Dimension sourceImageDimension = new java.awt.Dimension(
-                    inputImage.getWidth(), inputImage.getHeight());
+        final java.awt.Dimension sourceImageDimension = new java.awt.Dimension(
+                inputImage.getWidth(), inputImage.getHeight());
+
+        final java.awt.Dimension targetDimensions = getTargetThumbnailDimension(
+                sourceImageDimension, preferredTargetDimensions);
 
-            final java.awt.Dimension targetDimensions = getTargetThumbnailDimension(
-                    sourceImageDimension, preferredTargetDimensions);
 
-            final OutputStream out = new FileOutputStream(outputFile);
+        final Image scaledImage = scaleImage(inputImage,
+                targetDimensions.width, targetDimensions.height);
 
-            final Image scaledImage = scaleImage(inputImage,
-                    targetDimensions.width, targetDimensions.height);
+        final BufferedImage bufferedImage = new BufferedImage(
+                scaledImage.getWidth(null), scaledImage.getHeight(null),
+                TYPE_INT_RGB);
 
-            final BufferedImage bufferedImage = new BufferedImage(
-                    scaledImage.getWidth(null), scaledImage.getHeight(null),
-                    TYPE_INT_RGB);
+        final Graphics2D g = bufferedImage.createGraphics();
+        g.drawImage(scaledImage, 0, 0, null);
+        g.dispose();
 
-            final Graphics2D g = bufferedImage.createGraphics();
-            g.drawImage(scaledImage, 0, 0, null);
-            g.dispose();
 
-            ImageIO.write(bufferedImage, "jpg", out);
-            out.close();
+
+        ImageOutputStream  ios =  ImageIO.createImageOutputStream(outputFile);
+        Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("webp");
+        ImageWriter writer = iter.next();
+        ImageWriteParam iwp = writer.getDefaultWriteParam();
+        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+        iwp.setCompressionType("Lossy");
+        iwp.setCompressionQuality(0.8f);
+
+        writer.setOutput(ios);
+        writer.write(null, new IIOImage(bufferedImage,null,null),iwp);
+        writer.dispose();
     }
 
     private static void makeGifThumbnail(
@@ -166,8 +177,6 @@ public class Picture extends AbstractFile {
 
         System.out.println("Desired target image dimensions:" + targetDimensions);
 
-        FileInputStream fiStream = new FileInputStream( inputFile );
-
         ImageReader reader = ImageIO.getImageReadersByFormatName("gif").next();
         ImageInputStream stream = ImageIO.createImageInputStream(inputFile);
         reader.setInput(stream);
@@ -175,23 +184,23 @@ public class Picture extends AbstractFile {
         Utils.ImageFrame[] frames = Utils.readGIF(reader);
         for (Utils.ImageFrame frame : frames) {
             Image scaleImage = scaleImage(frame.image, targetDimensions.width, targetDimensions.height);
-            BufferedImage bimage = new BufferedImage(
+            BufferedImage bImage = new BufferedImage(
                     targetDimensions.width, targetDimensions.height, BufferedImage.TYPE_INT_ARGB);
-            Graphics2D bGr = bimage.createGraphics();
+            Graphics2D bGr = bImage.createGraphics();
             bGr.drawImage(scaleImage, 0, 0, null);
             bGr.dispose();
-            frame.image = bimage;
+            frame.image = bImage;
         }
 
-        ImageOutputStream output = new FileImageOutputStream(outputFile );
+        ImageOutputStream output = new FileImageOutputStream(outputFile);
 
         GifSequenceWriter writer =
-                new GifSequenceWriter( output, frames[0].image.getType(), frames[0].getDelay(), true );
+                new GifSequenceWriter(output, frames[0].image.getType(), frames[0].getDelay(), true);
 
-        writer.writeToSequence( frames[0].image );
-        for ( int i = 1; i < frames.length; i++ ) {
+        writer.writeToSequence(frames[0].image);
+        for (int i = 1; i < frames.length; i++) {
             BufferedImage nextImage = frames[i].image;
-            writer.writeToSequence( nextImage );
+            writer.writeToSequence(nextImage);
         }
 
         writer.close();
@@ -224,7 +233,6 @@ public class Picture extends AbstractFile {
                 + getFileLength() + " "
                 + Constants.THUMBNAIL_VERSION;
 
-        // System.out.println("Computing hash from: " + forMagicHash);
         return Utils.getStringCrcAsHex(forMagicHash);
     }
 
@@ -237,8 +245,10 @@ public class Picture extends AbstractFile {
      * relative to designated thumbnails directory within parent directory.
      */
     public String getRelativeThumbnailFileName(final Dimension targetDimension) {
+        String thumbnailExtension = "gif".equalsIgnoreCase(getFileExtension()) ? "gif" : "webp";
+
         return FilePathParser.getFileNameWithoutExtension(fileName) + " ("
-                + computeThumbnailHash(targetDimension) + ")." + getFileExtension();
+                + computeThumbnailHash(targetDimension) + ")." + thumbnailExtension;
     }
 
     @Override