generate better quality webp thumbnails
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / metadata / fileTypes / Picture.java
index 184bac6..9604211 100755 (executable)
@@ -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;
@@ -135,7 +136,6 @@ public class Picture extends AbstractFile {
         final java.awt.Dimension targetDimensions = getTargetThumbnailDimension(
                 sourceImageDimension, preferredTargetDimensions);
 
-        final OutputStream out = new FileOutputStream(outputFile);
 
         final Image scaledImage = scaleImage(inputImage,
                 targetDimensions.width, targetDimensions.height);
@@ -148,8 +148,19 @@ public class Picture extends AbstractFile {
         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,12 +184,12 @@ 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);
@@ -236,7 +245,7 @@ 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" : "jpeg";
+        String thumbnailExtension = "gif".equalsIgnoreCase(getFileExtension()) ? "gif" : "webp";
 
         return FilePathParser.getFileNameWithoutExtension(fileName) + " ("
                 + computeThumbnailHash(targetDimension) + ")." + thumbnailExtension;