From 51434752f5a29dece6185e043a5fc71eb1553ad2 Mon Sep 17 00:00:00 2001 From: jendib Date: Sun, 28 Jul 2013 18:29:38 +0200 Subject: [PATCH] Default thumbnail for PDF --- .../main/java/com/sismics/util/FileUtil.java | 42 +++++++++++ .../main/java/com/sismics/util/ImageUtil.java | 65 ++++++++++++++++++ docs-core/src/main/resources/image/file.png | Bin 0 -> 3457 bytes 3 files changed, 107 insertions(+) create mode 100644 docs-core/src/main/java/com/sismics/util/FileUtil.java create mode 100644 docs-core/src/main/java/com/sismics/util/ImageUtil.java create mode 100644 docs-core/src/main/resources/image/file.png diff --git a/docs-core/src/main/java/com/sismics/util/FileUtil.java b/docs-core/src/main/java/com/sismics/util/FileUtil.java new file mode 100644 index 00000000..58e0a7b3 --- /dev/null +++ b/docs-core/src/main/java/com/sismics/util/FileUtil.java @@ -0,0 +1,42 @@ +package com.sismics.util; + +import java.awt.image.BufferedImage; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import javax.imageio.ImageIO; + +import org.imgscalr.Scalr; + +import com.sismics.docs.core.model.jpa.File; +import com.sismics.docs.core.util.DirectoryUtil; + +/** + * File utilities. + * + * @author bgamard + */ +public class FileUtil { + + /** + * Save a file on the storage filesystem. + * + * @param is InputStream + * @param file File to save + * @throws Exception + */ + public static void save(InputStream is, File file) throws Exception { + Path path = Paths.get(DirectoryUtil.getStorageDirectory().getPath(), file.getId()); + Files.copy(is, path); + + // In case of image, save a thumbnail + if (ImageUtil.isImage(file.getMimeType())) { + BufferedImage image = ImageIO.read(path.toFile()); + BufferedImage resizedImage = Scalr.resize(image, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, 256, Scalr.OP_ANTIALIAS); + image.flush(); + ImageUtil.writeJpeg(resizedImage, Paths.get(DirectoryUtil.getStorageDirectory().getPath(), file.getId() + "_thumb").toFile()); + } + } +} diff --git a/docs-core/src/main/java/com/sismics/util/ImageUtil.java b/docs-core/src/main/java/com/sismics/util/ImageUtil.java new file mode 100644 index 00000000..91827f7a --- /dev/null +++ b/docs-core/src/main/java/com/sismics/util/ImageUtil.java @@ -0,0 +1,65 @@ +package com.sismics.util; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Iterator; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.FileImageOutputStream; + +import com.sismics.util.mime.MimeType; + +/** + * Image processing utilities. + * + * @author jtremeaux + */ +public class ImageUtil { + + /** + * Write a high quality JPEG. + * + * @param image + * @param file + * @throws IOException + */ + public static void writeJpeg(BufferedImage image, File file) throws IOException { + Iterator iter = ImageIO.getImageWritersByFormatName("jpeg"); + ImageWriter writer = null; + FileImageOutputStream output = null; + try { + writer = (ImageWriter) iter.next(); + ImageWriteParam iwp = writer.getDefaultWriteParam(); + iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + iwp.setCompressionQuality(1.f); + output = new FileImageOutputStream(file); + writer.setOutput(output); + IIOImage iioImage = new IIOImage(image, null, null); + writer.write(null, iioImage, iwp); + } finally { + if (output != null) { + try { + output.close(); + } catch (Exception inner) { + // NOP + } + } + if (writer != null) { + writer.dispose(); + } + } + } + + /** + * Returns true if this MIME type is an image. + * @param mimeType MIME type + * @return True if image + */ + public static boolean isImage(String mimeType) { + return mimeType.equals(MimeType.IMAGE_GIF) || mimeType.equals(MimeType.IMAGE_PNG) || mimeType.equals(MimeType.IMAGE_JPEG); + } +} diff --git a/docs-core/src/main/resources/image/file.png b/docs-core/src/main/resources/image/file.png new file mode 100644 index 0000000000000000000000000000000000000000..09912855153e102f97f6fb9680aeeb07de2920bb GIT binary patch literal 3457 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 literal 0 HcmV?d00001