How to resize image in Cuba

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