Search code examples
javaimageclipboardimage-formats

Find format of clipboard image in Java


I'm getting images from clipboard using this:

if(Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(DataFlavor.imageFlavor)){
       ImageIcon IMG = new ImageIcon((BufferedImage) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.imageFlavor));
}

Now I want to save this image in disk using ImageIO.write;
How can I find image format (JPG,PNG,GIF,...) to use in ImageIO.write as formatName ?

Thanks


Solution

  • The mime type of the content of the clipboard when checked via

    .isDataFlavorAvailable(DataFlavor.imageFlavor)
    

    is image/x-java-image (but OS vendors do not need to follow MIME types for clipboards).

    I found two ways to supposedly get an image from a clipboard and write it to a file:

    1. Using a helper method found in this blog post: The nightmares of getting images from the Mac OS X clipboard using Java.

      Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard()
      
      ImageIcon IMG = new ImageIcon((BufferedImage)    
      clip.getData(DataFlavor.imageFlavor));
      BufferedImage bImage = getBufferedImage(IMG.getImage());
      ImageIO.write(bImage, "png", new File("/tmp/test.png"));
      

      The getBufferedImage method looks like this:

      public static BufferedImage getBufferedImage(Image img) {
          if (img == null) {
              return null;
          }
          int w = img.getWidth(null);
          int h = img.getHeight(null);
          // draw original image to thumbnail image object and 
          // scale it to the new size on-the-fly 
          BufferedImage bufimg = new BufferedImage(w, h, 
              BufferedImage.TYPE_INT_RGB);
          Graphics2D g2 = bufimg.createGraphics();
          g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
              RenderingHints.VALUE_INTERPOLATION_BILINEAR);
          g2.drawImage(img, 0, 0, w, h, null);
          g2.dispose();
          return bufimg;
      }
      
    2. Via Transferable. Note that this runs on OS X but produces an empty image of the correct size:

      Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard()
      Transferable content =
          clip.getContents(null);
      BufferedImage img = (BufferedImage) content.getTransferData(
          DataFlavor.imageFlavor);
      ImageIO.write(img, "png", new File("/tmp/test.png"));