mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-18 07:23:08 +00:00
refactor to reuse resizing
This commit is contained in:
@@ -22,6 +22,8 @@ import javax.imageio.ImageIO;
|
|||||||
import org.dspace.content.Item;
|
import org.dspace.content.Item;
|
||||||
import org.dspace.core.ConfigurationManager;
|
import org.dspace.core.ConfigurationManager;
|
||||||
|
|
||||||
|
import org.dspace.app.mediafilter.JPEGFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter image bitstreams, scaling the image to be within the bounds of
|
* Filter image bitstreams, scaling the image to be within the bounds of
|
||||||
* thumbnail.maxwidth, thumbnail.maxheight, the size we want our thumbnail to be
|
* 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");
|
String brandFont = ConfigurationManager.getProperty("webui.preview.brand.font");
|
||||||
int brandFontPoint = ConfigurationManager.getIntProperty("webui.preview.brand.fontpoint");
|
int brandFontPoint = ConfigurationManager.getIntProperty("webui.preview.brand.fontpoint");
|
||||||
|
|
||||||
// now get the image dimensions
|
JPEGFilter jpegFilter = new JPEGFilter();
|
||||||
float xsize = (float) buf.getWidth(null);
|
return jpegFilter.getThumbDim(currentItem, buf, verbose, xmax, ymax, blurring, hqscaling, brandHeight, brandFontPoint, brandFont);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,7 @@ import java.awt.Color;
|
|||||||
import java.awt.image.*;
|
import java.awt.image.*;
|
||||||
import java.awt.RenderingHints;
|
import java.awt.RenderingHints;
|
||||||
import java.awt.Transparency;
|
import java.awt.Transparency;
|
||||||
|
import java.awt.Font;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -77,6 +78,12 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats
|
|||||||
// read in bitstream's image
|
// read in bitstream's image
|
||||||
BufferedImage buf = ImageIO.read(source);
|
BufferedImage buf = ImageIO.read(source);
|
||||||
|
|
||||||
|
return getThumb(currentItem, buf, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream getThumb(Item currentItem, BufferedImage buf, boolean verbose)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
// get config params
|
// get config params
|
||||||
float xmax = (float) ConfigurationManager
|
float xmax = (float) ConfigurationManager
|
||||||
.getIntProperty("thumbnail.maxwidth");
|
.getIntProperty("thumbnail.maxwidth");
|
||||||
@@ -87,6 +94,12 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats
|
|||||||
boolean hqscaling = (boolean) ConfigurationManager
|
boolean hqscaling = (boolean) ConfigurationManager
|
||||||
.getBooleanProperty("thumbnail.hqscaling");
|
.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
|
// now get the image dimensions
|
||||||
float xsize = (float) buf.getWidth(null);
|
float xsize = (float) buf.getWidth(null);
|
||||||
float ysize = (float) buf.getHeight(null);
|
float ysize = (float) buf.getHeight(null);
|
||||||
@@ -167,6 +180,15 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats
|
|||||||
Graphics2D g2d = thumbnail.createGraphics();
|
Graphics2D g2d = thumbnail.createGraphics();
|
||||||
g2d.drawImage(buf, 0, 0, (int) xsize, (int) ysize, null);
|
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
|
// now create an input stream for the thumbnail buffer and return it
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
|
||||||
@@ -213,14 +235,13 @@ public class JPEGFilter extends MediaFilter implements SelfRegisterInputFormats
|
|||||||
return normal;
|
return normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BufferedImage getBlurredInstance(BufferedImage buf)
|
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Convenience method that returns a blurred instance of the
|
* Convenience method that returns a blurred instance of the
|
||||||
* provided {@code BufferedImage}.
|
* provided {@code BufferedImage}.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
public BufferedImage getBlurredInstance(BufferedImage buf)
|
||||||
|
{
|
||||||
buf = getNormalizedInstance(buf);
|
buf = getNormalizedInstance(buf);
|
||||||
|
|
||||||
// kernel for blur op
|
// kernel for blur op
|
||||||
|
@@ -24,6 +24,8 @@ import org.apache.pdfbox.rendering.PDFRenderer;
|
|||||||
import org.dspace.content.Item;
|
import org.dspace.content.Item;
|
||||||
import org.dspace.core.ConfigurationManager;
|
import org.dspace.core.ConfigurationManager;
|
||||||
|
|
||||||
|
import org.dspace.app.mediafilter.JPEGFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create JPEG thumbnails from PDF cover page using PDFBox.
|
* Create JPEG thumbnails from PDF cover page using PDFBox.
|
||||||
* Based on JPEGFilter:
|
* Based on JPEGFilter:
|
||||||
@@ -86,111 +88,10 @@ public class PDFBoxThumbnail extends MediaFilter implements SelfRegisterInputFor
|
|||||||
// ImageIO.write(buf, "PNG", new File("custom-render.png"));
|
// ImageIO.write(buf, "PNG", new File("custom-render.png"));
|
||||||
doc.close();
|
doc.close();
|
||||||
|
|
||||||
// read in bitstream's image
|
JPEGFilter jpegFilter = new JPEGFilter();
|
||||||
// BufferedImage buf = ImageIO.read(source);
|
return jpegFilter.getThumb(currentItem, buf, verbose);
|
||||||
|
|
||||||
// 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!
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getInputMIMETypes()
|
public String[] getInputMIMETypes()
|
||||||
{
|
{
|
||||||
@@ -210,113 +111,4 @@ public class PDFBoxThumbnail extends MediaFilter implements SelfRegisterInputFor
|
|||||||
// return ImageIO.getReaderFileSuffixes();
|
// return ImageIO.getReaderFileSuffixes();
|
||||||
return null;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -353,6 +353,7 @@ http.proxy.port =
|
|||||||
filter.plugins = PDF Text Extractor, HTML Text Extractor, \
|
filter.plugins = PDF Text Extractor, HTML Text Extractor, \
|
||||||
PowerPoint Text Extractor, \
|
PowerPoint Text Extractor, \
|
||||||
Word Text Extractor, JPEG Thumbnail, \
|
Word Text Extractor, JPEG Thumbnail, \
|
||||||
|
PDFBox JPEG Thumbnail, \
|
||||||
Excel Text Extractor
|
Excel Text Extractor
|
||||||
|
|
||||||
# [To enable Branded Preview]: uncomment and insert the following into the plugin list
|
# [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.PowerPointFilter = PowerPoint Text Extractor, \
|
||||||
org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail, \
|
org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail, \
|
||||||
org.dspace.app.mediafilter.BrandedPreviewJPEGFilter = Branded Preview JPEG, \
|
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.ImageMagickImageThumbnailFilter = ImageMagick Image Thumbnail, \
|
||||||
org.dspace.app.mediafilter.ImageMagickPdfThumbnailFilter = ImageMagick PDF Thumbnail, \
|
org.dspace.app.mediafilter.ImageMagickPdfThumbnailFilter = ImageMagick PDF Thumbnail, \
|
||||||
org.dspace.app.mediafilter.ExcelFilter = Excel Text Extractor
|
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.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.ImageMagickPdfThumbnailFilter.inputFormats = Adobe PDF
|
||||||
filter.org.dspace.app.mediafilter.ExcelFilter.inputFormats = Microsoft Excel, Microsoft Excel XML
|
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.
|
#Publicly accessible thumbnails of restricted content.
|
||||||
#List the MediaFilter name's that would get publicly accessible permissions
|
#List the MediaFilter name's that would get publicly accessible permissions
|
||||||
|
Reference in New Issue
Block a user