[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:
parent
c3e8cc739b
commit
1461f33f9f
1 changed files with 18 additions and 8 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue