Je pense qu'il y a des moments où vous souhaitez redimensionner et enregistrer une image JPEG. Si vous pouvez utiliser ImageMagick, l'histoire est rapide, mais si vous voulez vraiment la compléter avec Java uniquement, vous utiliserez ImageIO.
Cependant, veuillez noter que la méthode de mise en œuvre la plus simple définira automatiquement la qualité de sauvegarde de l'image JPEG sur «75» (vérifiez avec Java 8). J'en étais accro.
La mise en œuvre elle-même est simple, mais si vous souhaitez modifier la qualité du stockage, c'est NG.
public static byte[] resize(final byte[] src, final double scale) throws IOException {
try (ByteArrayInputStream is = new ByteArrayInputStream(src);
ByteArrayOutputStream os = new ByteArrayOutputStream()) {
BufferedImage srcImage = ImageIO.read(is);
BufferedImage destImage = resizeImage(srcImage, scale);
//La qualité du stockage sera de "75"
ImageIO.write(destImage, "jpeg", os);
return os.toByteArray();
}
}
C'est la bonne réponse. Vous pouvez spécifier la qualité de stockage quality
de 0 à 1.0. 1.0 équivaut à la qualité 100.
public static byte[] resize(final byte[] src, final double scale, final float quality) throws IOException {
try (ByteArrayInputStream is = new ByteArrayInputStream(src);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(os)) {
BufferedImage srcImage = ImageIO.read(is);
BufferedImage destImage = resizeImage(srcImage, scale);
//La qualité du stockage suit les spécifications de l'utilisateur
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.setOutput(ios);
writer.write(null, new IIOImage(destImage, null, null), param);
writer.dispose();
return os.toByteArray();
}
}
La mise en œuvre de la méthode de redimensionnement resizeImage
des deux exemples précédents est la suivante. La qualité d'image n'est pas bonne par défaut lors du redimensionnement d'une image, mais vous pouvez améliorer la qualité de l'image en spécifiant TYPE_BICUBIC
lors de la conversion affine.
public static BufferedImage resizeImage(final BufferedImage image, final double scale) throws IOException {
int width = (int) (image.getWidth() * scale);
int height = (int) (image.getHeight() * scale);
BufferedImage resizedImage = new BufferedImage(width, height, image.getType());
//Redimensionner par conversion affine (la priorité est donnée à la qualité d'image)
AffineTransform transform = AffineTransform.getScaleInstance(scale, scale);
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC);
op.filter(image, resizedImage);
return resizedImage;
}
Lors du redimensionnement en Java, la charge de la mémoire et du processeur devient inacceptable à mesure que les données d'image deviennent volumineuses, donc je pense que les scènes qui peuvent être utilisées sont assez limitées.
Recommended Posts