I want to resize image when i am uploading it. How can i do that?
I have read the doc but i want to resize the physical file instead of dynamically resize it
1 Like
Hello, Muhammad!
To resize physical file, you need to add a resize logic before the file will be stored in a file storage. To achieve this you can rewrite FileUploadSucceedListener as follows:
uploadField.addFileUploadSucceedListener(event -> {
FileDescriptor fd = uploadField.getFileDescriptor();
File imageFile = fileUploadingAPI.getFile(uploadField.getFileId());
if (imageFile != null) {
BufferedImage image;
try {
byte[] bytes = Files.readAllBytes(imageFile.toPath());
image = ImageIO.read(new ByteArrayInputStream(bytes));
int width = image.getWidth();
int height = image.getHeight();
if (((double) height / (double) width) > ((double) IMG_HEIGHT / (double) IMG_WIDTH)) {
image = resize(image, width * IMG_HEIGHT / height, IMG_HEIGHT);
} else {
image = resize(image, IMG_WIDTH, height * IMG_WIDTH / width);
}
ImageIO.write(image, fd.getExtension(), imageFile);
} catch (IOException e) {
log.error("Unable to resize image", e);
}
}
try {
fileUploadingAPI.putFileIntoStorage(uploadField.getFileId(), fd);
} catch (FileStorageException e) {
throw new RuntimeException("Error saving file to FileStorage", e);
}
imageDescriptor = dataSupplier.commit(fd);
displayImage();
});
private BufferedImage resize(BufferedImage origin, int newWidth, int newHeight) {
Image scaledInstance = origin.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
g2d.drawImage(scaledInstance, 0, 0, null);
g2d.dispose();
return image;
}
And displayImage() method doesn’t require resize logic anymore. So it can be rewritten as follows:
private void displayImage() {
byte[] bytes = null;
if (imageDescriptor != null) {
try {
bytes = fileStorageService.loadFile(imageDescriptor);
} catch (FileStorageException e) {
log.error("Unable to load image file", e);
showNotification("Unable to load image file", NotificationType.HUMANIZED);
}
}
if (bytes != null) {
embeddedImage.setSource(imageDescriptor.getName(), new ByteArrayInputStream(bytes));
embeddedImage.setType(Embedded.Type.IMAGE);
BufferedImage image;
try {
image = ImageIO.read(new ByteArrayInputStream(bytes));
int width = image.getWidth();
int height = image.getHeight();
embeddedImage.setWidth(String.valueOf(width));
embeddedImage.setHeight(String.valueOf(height));
} catch (IOException e) {
log.error("Unable to resize image", e);
}
// refresh image
embeddedImage.setVisible(false);
embeddedImage.setVisible(true);
} else {
embeddedImage.setVisible(false);
}
}
The full demo project available at GitHub.
Regards,
Gleb
2 Likes
Hi Gorelov,
Thanks it solved my problem