9 Replies Latest reply on Aug 21, 2007 7:19 AM by Tony Herstell

    Images Uploaded in Seam

    Tony Herstell Master

      Apart from not being able to make the accept on file upload work...


      (accept ? a comma-separated list of content types to accept, may not be supported
      by the browser. E.g. "images/png,images/jpg", "images/*".)


      I use this to create a thumbnail for uploded images... (yo can only set one restriction per project for upload file size and elsewhere I want to upload video!)

      Anyhow... using this:

       /* (non-Javadoc)
       * @see nz.co.selwynequestriancentre.action.user.UserDetailsController#processAvatarUpload()
       */
       @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
       public String processAvatarUpload() {
       // Seam does all the work for us...
       if (user.getPicture().getName() != null && !user.getPicture().getName().equals("")) {
       log.info("Avatar was supplied so adding the Thumbnail for it");
       ImageIcon icon = new ImageIcon(user.getPicture().getImage());
       user.getPicture().setThumbnail(getRescaledImageAsBytes(user.getPicture().getType(), 70, icon));
       }
       return "null";
       }
      
       @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
       private byte[] getRescaledImageAsBytes(String contentType , int width, ImageIcon icon) {
       double ratio = (double) width / icon.getIconWidth();
       int height = (int) (icon.getIconHeight() * ratio);
      
       int imageType = "image/png".equals(contentType) ? BufferedImage.TYPE_INT_ARGB
       : BufferedImage.TYPE_INT_RGB;
       BufferedImage bImg = new BufferedImage(width, height, imageType);
       Graphics2D g2d = bImg.createGraphics();
       g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
       RenderingHints.VALUE_INTERPOLATION_BICUBIC);
       g2d.drawImage(icon.getImage(), 0, 0, width, height, null);
       g2d.dispose();
      
       String formatName = "";
       if ("image/png".equalsIgnoreCase(contentType))
       formatName = "png";
       else if ("image/jpeg".equalsIgnoreCase(contentType))
       formatName = "jpeg";
       else if ("image/jpg".equalsIgnoreCase(contentType))
       formatName = "jpg";
       else if ("image/gif".equalsIgnoreCase(contentType))
       formatName = "gif";
      
       ByteArrayOutputStream baos = null;
       OutputStream out = null;
       try {
       baos = new ByteArrayOutputStream();
       out = new BufferedOutputStream(baos);
       try {
       ImageIO.write(bImg, formatName, out);
       } catch (IOException e) {
       e.printStackTrace();
       }
       } finally { // Try to release any resources.
       try {
       if (baos != null) {
       baos.close();
       }
       } catch (IOException ignored) {}
       try {
       if (out != null) {
       out.close();
       }
       } catch (IOException ignored) {}
       }
       return baos.toByteArray();
       }
      


      I get a problem...

      1. Images with a transparent background come out with background as black :(


      Does anyone have a piece of code I can crib?