From 2f8fc1087bfc58f335b34d2a321c60077bce8c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Mas=C3=A1r?= Date: Sat, 6 Feb 2016 01:26:30 +0100 Subject: [PATCH] refactor to reuse resizing --- .../mediafilter/BrandedPreviewJPEGFilter.java | 210 +---------------- .../dspace/app/mediafilter/JPEGFilter.java | 27 ++- .../app/mediafilter/PDFBoxThumbnail.java | 216 +----------------- dspace/config/dspace.cfg | 3 + 4 files changed, 35 insertions(+), 421 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/BrandedPreviewJPEGFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/BrandedPreviewJPEGFilter.java index a789f3faf0..1fe163fd99 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/BrandedPreviewJPEGFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/BrandedPreviewJPEGFilter.java @@ -22,6 +22,8 @@ import javax.imageio.ImageIO; import org.dspace.content.Item; import org.dspace.core.ConfigurationManager; +import org.dspace.app.mediafilter.JPEGFilter; + /** * Filter image bitstreams, scaling the image to be within the bounds of * thumbnail.maxwidth, thumbnail.maxheight, the size we want our thumbnail to be @@ -92,211 +94,7 @@ public class BrandedPreviewJPEGFilter extends MediaFilter String brandFont = ConfigurationManager.getProperty("webui.preview.brand.font"); int brandFontPoint = ConfigurationManager.getIntProperty("webui.preview.brand.fontpoint"); - // now get the image dimensions - float xsize = (float) buf.getWidth(null); - float ysize = (float) buf.getHeight(null); - - // if verbose flag is set, print out dimensions - // to STDOUT - if (verbose) - { - System.out.println("original size: " + xsize + "," + ysize); - } - - // scale by x first if needed - if (xsize > xmax) - { - // calculate scaling factor so that xsize * scale = new size (max) - float scaleFactor = xmax / xsize; - - // if verbose flag is set, print out extracted text - // to STDOUT - if (verbose) - { - System.out.println("x scale factor: " + scaleFactor); - } - - // now reduce x size - // and y size - xsize = xsize * scaleFactor; - ysize = ysize * scaleFactor; - - // if verbose flag is set, print out extracted text - // to STDOUT - if (verbose) - { - System.out.println("new size: " + xsize + "," + ysize); - } - } - - // scale by y if needed - if (ysize > ymax) - { - float scaleFactor = ymax / ysize; - - // now reduce x size - // and y size - xsize = xsize * scaleFactor; - ysize = ysize * scaleFactor; - } - - // if verbose flag is set, print details to STDOUT - if (verbose) - { - System.out.println("created thumbnail size: " + xsize + ", " - + ysize); - } - - // create an image buffer for the preview with the new xsize, ysize - // we add - BufferedImage branded = new BufferedImage((int) xsize, (int) ysize + brandHeight, - BufferedImage.TYPE_INT_RGB); - - // Use blurring if selected in config. - // a little blur before scaling does wonders for keeping moire in check. - if (blurring) - { - // send the buffered image off to get blurred. - buf = getBlurredInstance((BufferedImage) buf); - } - - // Use high quality scaling method if selected in config. - // this has a definite performance penalty. - if (hqscaling) - { - // send the buffered image off to get an HQ downscale. - buf = getScaledInstance((BufferedImage) buf, (int) xsize, (int) ysize, - (Object) RenderingHints.VALUE_INTERPOLATION_BICUBIC, (boolean) true); - } - - // now render the image into the preview buffer - Graphics2D g2d = branded.createGraphics(); - g2d.drawImage(buf, 0, 0, (int) xsize, (int) ysize, null); - - Brand brand = new Brand((int) xsize, brandHeight, new Font(brandFont, Font.PLAIN, brandFontPoint), 5); - BufferedImage brandImage = brand.create(ConfigurationManager.getProperty("webui.preview.brand"), - ConfigurationManager.getProperty("webui.preview.brand.abbrev"), - currentItem == null ? "" : "hdl:" + currentItem.getHandle()); - - g2d.drawImage(brandImage, (int)0, (int)ysize, (int) xsize, (int) 20, null); - - // now create an input stream for the thumbnail buffer and return it - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - ImageIO.write(branded, "jpeg", baos); - - // now get the array - ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - - return bais; // hope this gets written out before its garbage collected! - } - - public BufferedImage getNormalizedInstance(BufferedImage buf) - { - int type = (buf.getTransparency() == Transparency.OPAQUE) ? - BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB_PRE; - int w, h; - w = buf.getWidth(); - h = buf.getHeight(); - BufferedImage normal = new BufferedImage(w, h, type); - Graphics2D g2d = normal.createGraphics(); - g2d.drawImage(buf, 0, 0, w, h, Color.WHITE, null); - g2d.dispose(); - return normal; - } - - public BufferedImage getBlurredInstance(BufferedImage buf) - { - /** - * Convenience method that returns a blurred instance of the - * provided {@code BufferedImage}. - * - */ - - buf = getNormalizedInstance(buf); - - // kernel for blur op - float[] matrix = { - 0.111f, 0.111f, 0.111f, - 0.111f, 0.111f, 0.111f, - 0.111f, 0.111f, 0.111f, - }; - - // perform the blur and return the blurred version. - BufferedImageOp blur = new ConvolveOp( new Kernel(3, 3, matrix) ); - BufferedImage blurbuf = blur.filter(buf, null); - return blurbuf; - } - - /** - * Convenience method that returns a scaled instance of the - * provided {@code BufferedImage}. - * - * @param buf the original image to be scaled - * @param targetWidth the desired width of the scaled instance, - * in pixels - * @param targetHeight the desired height of the scaled instance, - * in pixels - * @param hint one of the rendering hints that corresponds to - * {@code RenderingHints.KEY_INTERPOLATION} (e.g. - * {@code RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR}, - * {@code RenderingHints.VALUE_INTERPOLATION_BILINEAR}, - * {@code RenderingHints.VALUE_INTERPOLATION_BICUBIC}) - * @param higherQuality if true, this method will use a multi-step - * scaling technique that provides higher quality than the usual - * one-step technique (only useful in downscaling cases, where - * {@code targetWidth} or {@code targetHeight} is - * smaller than the original dimensions, and generally only when - * the {@code BILINEAR} hint is specified) - * @return a scaled version of the original {@code BufferedImage} - */ - public BufferedImage getScaledInstance(BufferedImage buf, - int targetWidth, - int targetHeight, - Object hint, - boolean higherQuality) - { - int type = (buf.getTransparency() == Transparency.OPAQUE) ? - BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; - BufferedImage scalebuf = (BufferedImage)buf; - int w, h; - if (higherQuality) { - // Use multi-step technique: start with original size, then - // scale down in multiple passes with drawImage() - // until the target size is reached - w = buf.getWidth(); - h = buf.getHeight(); - } else { - // Use one-step technique: scale directly from original - // size to target size with a single drawImage() call - w = targetWidth; - h = targetHeight; - } - - do { - if (higherQuality && w > targetWidth) { - w /= 2; - if (w < targetWidth) { - w = targetWidth; - } - } - - if (higherQuality && h > targetHeight) { - h /= 2; - if (h < targetHeight) { - h = targetHeight; - } - } - - BufferedImage tmp = new BufferedImage(w, h, type); - Graphics2D g2d = tmp.createGraphics(); - g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); - g2d.drawImage(scalebuf, 0, 0, w, h, Color.WHITE, null); - g2d.dispose(); - - scalebuf = tmp; - } while (w != targetWidth || h != targetHeight); - - return scalebuf; + JPEGFilter jpegFilter = new JPEGFilter(); + return jpegFilter.getThumbDim(currentItem, buf, verbose, xmax, ymax, blurring, hqscaling, brandHeight, brandFontPoint, brandFont); } } diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/JPEGFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/JPEGFilter.java index b4d945c697..8fdfa315f4 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/JPEGFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/JPEGFilter.java @@ -12,6 +12,7 @@ import java.awt.Color; import java.awt.image.*; import java.awt.RenderingHints; import java.awt.Transparency; +import java.awt.Font; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; @@ -77,6 +78,12 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats // read in bitstream's image BufferedImage buf = ImageIO.read(source); + return getThumb(currentItem, buf, verbose); + } + + public InputStream getThumb(Item currentItem, BufferedImage buf, boolean verbose) + throws Exception + { // get config params float xmax = (float) ConfigurationManager .getIntProperty("thumbnail.maxwidth"); @@ -87,6 +94,12 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats boolean hqscaling = (boolean) ConfigurationManager .getBooleanProperty("thumbnail.hqscaling"); + return getThumbDim(currentItem, buf, verbose, xmax, ymax, blurring, hqscaling, 0, 0, null); + } + + public InputStream getThumbDim(Item currentItem, BufferedImage buf, boolean verbose, float xmax, float ymax, boolean blurring, boolean hqscaling, int brandHeight, int brandFontPoint, String brandFont) + throws Exception + { // now get the image dimensions float xsize = (float) buf.getWidth(null); float ysize = (float) buf.getHeight(null); @@ -167,6 +180,15 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats Graphics2D g2d = thumbnail.createGraphics(); g2d.drawImage(buf, 0, 0, (int) xsize, (int) ysize, null); + if (brandHeight != 0) { + Brand brand = new Brand((int) xsize, brandHeight, new Font(brandFont, Font.PLAIN, brandFontPoint), 5); + BufferedImage brandImage = brand.create(ConfigurationManager.getProperty("webui.preview.brand"), + ConfigurationManager.getProperty("webui.preview.brand.abbrev"), + currentItem == null ? "" : "hdl:" + currentItem.getHandle()); + + g2d.drawImage(brandImage, (int)0, (int)ysize, (int) xsize, (int) 20, null); + } + // now create an input stream for the thumbnail buffer and return it ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -213,14 +235,13 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats return normal; } - public BufferedImage getBlurredInstance(BufferedImage buf) - { /** * Convenience method that returns a blurred instance of the * provided {@code BufferedImage}. * */ - + public BufferedImage getBlurredInstance(BufferedImage buf) + { buf = getNormalizedInstance(buf); // kernel for blur op diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFBoxThumbnail.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFBoxThumbnail.java index 9944ac1a40..50ca4e69e6 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFBoxThumbnail.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFBoxThumbnail.java @@ -24,6 +24,8 @@ import org.apache.pdfbox.rendering.PDFRenderer; import org.dspace.content.Item; import org.dspace.core.ConfigurationManager; +import org.dspace.app.mediafilter.JPEGFilter; + /** * Create JPEG thumbnails from PDF cover page using PDFBox. * Based on JPEGFilter: @@ -86,111 +88,10 @@ public class PDFBoxThumbnail extends MediaFilter implements SelfRegisterInputFor // ImageIO.write(buf, "PNG", new File("custom-render.png")); doc.close(); - // read in bitstream's image -// BufferedImage buf = ImageIO.read(source); - - // get config params - float xmax = (float) ConfigurationManager - .getIntProperty("thumbnail.maxwidth"); - float ymax = (float) ConfigurationManager - .getIntProperty("thumbnail.maxheight"); - boolean blurring = (boolean) ConfigurationManager - .getBooleanProperty("thumbnail.blurring"); - boolean hqscaling = (boolean) ConfigurationManager - .getBooleanProperty("thumbnail.hqscaling"); - - // now get the image dimensions - float xsize = (float) buf.getWidth(null); - float ysize = (float) buf.getHeight(null); - - // if verbose flag is set, print out dimensions - // to STDOUT - if (verbose) - { - System.out.println("original size: " + xsize + "," + ysize); - } - - // scale by x first if needed - if (xsize > xmax) - { - // calculate scaling factor so that xsize * scale = new size (max) - float scale_factor = xmax / xsize; - - // if verbose flag is set, print out extracted text - // to STDOUT - if (verbose) - { - System.out.println("x scale factor: " + scale_factor); - } - - // now reduce x size - // and y size - xsize = xsize * scale_factor; - ysize = ysize * scale_factor; - - // if verbose flag is set, print out extracted text - // to STDOUT - if (verbose) - { - System.out.println("new size: " + xsize + "," + ysize); - } - } - - // scale by y if needed - if (ysize > ymax) - { - float scale_factor = ymax / ysize; - - // now reduce x size - // and y size - xsize = xsize * scale_factor; - ysize = ysize * scale_factor; - } - - // if verbose flag is set, print details to STDOUT - if (verbose) - { - System.out.println("created thumbnail size: " + xsize + ", " - + ysize); - } - - // create an image buffer for the thumbnail with the new xsize, ysize - BufferedImage thumbnail = new BufferedImage((int) xsize, (int) ysize, - BufferedImage.TYPE_INT_RGB); - - // Use blurring if selected in config. - // a little blur before scaling does wonders for keeping moire in check. - if (blurring) - { - // send the buffered image off to get blurred. - buf = getBlurredInstance((BufferedImage) buf); - } - - // Use high quality scaling method if selected in config. - // this has a definite performance penalty. - if (hqscaling) - { - // send the buffered image off to get an HQ downscale. - buf = getScaledInstance((BufferedImage) buf, (int) xsize, (int) ysize, - (Object) RenderingHints.VALUE_INTERPOLATION_BICUBIC, (boolean) true); - } - - // now render the image into the thumbnail buffer - Graphics2D g2d = thumbnail.createGraphics(); - g2d.drawImage(buf, 0, 0, (int) xsize, (int) ysize, null); - - // now create an input stream for the thumbnail buffer and return it - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - ImageIO.write(thumbnail, "jpeg", baos); - - // now get the array - ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - - return bais; // hope this gets written out before its garbage collected! + JPEGFilter jpegFilter = new JPEGFilter(); + return jpegFilter.getThumb(currentItem, buf, verbose); } - @Override public String[] getInputMIMETypes() { @@ -210,113 +111,4 @@ public class PDFBoxThumbnail extends MediaFilter implements SelfRegisterInputFor // return ImageIO.getReaderFileSuffixes(); return null; } - - public BufferedImage getNormalizedInstance(BufferedImage buf) - { - int type = (buf.getTransparency() == Transparency.OPAQUE) ? - BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB_PRE; - int w, h; - w = buf.getWidth(); - h = buf.getHeight(); - BufferedImage normal = new BufferedImage(w, h, type); - Graphics2D g2d = normal.createGraphics(); - g2d.drawImage(buf, 0, 0, w, h, Color.WHITE, null); - g2d.dispose(); - return normal; - } - - public BufferedImage getBlurredInstance(BufferedImage buf) - { - /** - * Convenience method that returns a blurred instance of the - * provided {@code BufferedImage}. - * - */ - - buf = getNormalizedInstance(buf); - - // kernel for blur op - float[] matrix = { - 0.111f, 0.111f, 0.111f, - 0.111f, 0.111f, 0.111f, - 0.111f, 0.111f, 0.111f, - }; - - // perform the blur and return the blurred version. - BufferedImageOp blur = new ConvolveOp( new Kernel(3, 3, matrix) ); - BufferedImage blurbuf = blur.filter(buf, null); - return blurbuf; - } - - /** - * Convenience method that returns a scaled instance of the - * provided {@code BufferedImage}. - * - * @param buf the original image to be scaled - * @param targetWidth the desired width of the scaled instance, - * in pixels - * @param targetHeight the desired height of the scaled instance, - * in pixels - * @param hint one of the rendering hints that corresponds to - * {@code RenderingHints.KEY_INTERPOLATION} (e.g. - * {@code RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR}, - * {@code RenderingHints.VALUE_INTERPOLATION_BILINEAR}, - * {@code RenderingHints.VALUE_INTERPOLATION_BICUBIC}) - * @param higherQuality if true, this method will use a multi-step - * scaling technique that provides higher quality than the usual - * one-step technique (only useful in downscaling cases, where - * {@code targetWidth} or {@code targetHeight} is - * smaller than the original dimensions, and generally only when - * the {@code BILINEAR} hint is specified) - * @return a scaled version of the original {@code BufferedImage} - */ - public BufferedImage getScaledInstance(BufferedImage buf, - int targetWidth, - int targetHeight, - Object hint, - boolean higherQuality) - { - int type = (buf.getTransparency() == Transparency.OPAQUE) ? - BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; - BufferedImage scalebuf = (BufferedImage)buf; - int w, h; - if (higherQuality) { - // Use multi-step technique: start with original size, then - // scale down in multiple passes with drawImage() - // until the target size is reached - w = buf.getWidth(); - h = buf.getHeight(); - } else { - // Use one-step technique: scale directly from original - // size to target size with a single drawImage() call - w = targetWidth; - h = targetHeight; - } - - do { - if (higherQuality && w > targetWidth) { - w /= 2; - if (w < targetWidth) { - w = targetWidth; - } - } - - if (higherQuality && h > targetHeight) { - h /= 2; - if (h < targetHeight) { - h = targetHeight; - } - } - - BufferedImage tmp = new BufferedImage(w, h, type); - Graphics2D g2d = tmp.createGraphics(); - g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); - g2d.drawImage(scalebuf, 0, 0, w, h, Color.WHITE, null); - g2d.dispose(); - - scalebuf = tmp; - } while (w != targetWidth || h != targetHeight); - - return scalebuf; - } } diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index af69b17fd6..6592474523 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -353,6 +353,7 @@ http.proxy.port = filter.plugins = PDF Text Extractor, HTML Text Extractor, \ PowerPoint Text Extractor, \ Word Text Extractor, JPEG Thumbnail, \ + PDFBox JPEG Thumbnail, \ Excel Text Extractor # [To enable Branded Preview]: uncomment and insert the following into the plugin list @@ -371,6 +372,7 @@ plugin.named.org.dspace.app.mediafilter.FormatFilter = \ org.dspace.app.mediafilter.PowerPointFilter = PowerPoint Text Extractor, \ org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail, \ org.dspace.app.mediafilter.BrandedPreviewJPEGFilter = Branded Preview JPEG, \ + org.dspace.app.mediafilter.PDFBoxThumbnail = PDFBox JPEG Thumbnail, \ org.dspace.app.mediafilter.ImageMagickImageThumbnailFilter = ImageMagick Image Thumbnail, \ org.dspace.app.mediafilter.ImageMagickPdfThumbnailFilter = ImageMagick PDF Thumbnail, \ org.dspace.app.mediafilter.ExcelFilter = Excel Text Extractor @@ -385,6 +387,7 @@ filter.org.dspace.app.mediafilter.BrandedPreviewJPEGFilter.inputFormats = BMP, G filter.org.dspace.app.mediafilter.ImageMagickImageThumbnailFilter.inputFormats = BMP, GIF, image/png, JPG, TIFF, JPEG, JPEG 2000 filter.org.dspace.app.mediafilter.ImageMagickPdfThumbnailFilter.inputFormats = Adobe PDF filter.org.dspace.app.mediafilter.ExcelFilter.inputFormats = Microsoft Excel, Microsoft Excel XML +filter.org.dspace.app.mediafilter.PDFBoxThumbnail.inputFormats = Adobe PDF #Publicly accessible thumbnails of restricted content. #List the MediaFilter name's that would get publicly accessible permissions