[VIVO-1674] Improve quality of thumbnails created (#112)

* Explicitly set image quality and interpolation method
* Use twelvemonkeys plugin for thumbnail creation

Resolves: https://jira.duraspace.org/browse/VIVO-1674
This commit is contained in:
Ben 2019-02-13 10:04:57 -07:00 committed by Andrew Woods
parent c3e8cc739b
commit 1461f33f9f

View file

@ -9,16 +9,20 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriter;
import javax.imageio.ImageWriteParam;
import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.MemoryCacheImageInputStream; import javax.imageio.stream.MemoryCacheImageInputStream;
import java.awt.geom.AffineTransform; import javax.imageio.stream.MemoryCacheImageOutputStream;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorConvertOp; import java.awt.image.ColorConvertOp;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import com.twelvemonkeys.image.ResampleOp;
/** /**
* Crop the main image as specified, and scale it to the correct size for a * Crop the main image as specified, and scale it to the correct size for a
@ -147,10 +151,10 @@ public class IIOImageProcessor implements ImageProcessor {
} }
private BufferedImage scaleImage(BufferedImage image, float scaleFactor) { private BufferedImage scaleImage(BufferedImage image, float scaleFactor) {
AffineTransform transform = AffineTransform.getScaleInstance( int newX = (int) (image.getWidth() * scaleFactor);
scaleFactor, scaleFactor); int newY = (int) (image.getHeight() * scaleFactor);
AffineTransformOp atoOp = new AffineTransformOp(transform, null); BufferedImageOp resampler = new ResampleOp(newX, newY, ResampleOp.FILTER_LANCZOS);
return atoOp.filter(image, null); return resampler.filter(image, null);
} }
private CropRectangle adjustCropRectangleToScaledImage(CropRectangle crop, private CropRectangle adjustCropRectangleToScaledImage(CropRectangle crop,
@ -167,8 +171,14 @@ public class IIOImageProcessor implements ImageProcessor {
} }
private byte[] encodeAsJpeg(BufferedImage image) throws IOException { private byte[] encodeAsJpeg(BufferedImage image) throws IOException {
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.8f);
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ImageIO.write(image, "JPG", bytes); writer.setOutput(new MemoryCacheImageOutputStream(bytes));
writer.write(null, new IIOImage(image,null,null),param);
writer.dispose();
return bytes.toByteArray(); return bytes.toByteArray();
} }
} }