【问题标题】:Find format of clipboard image in Java在 Java 中查找剪贴板图像的格式
【发布时间】:2026-01-05 15:35:01
【问题描述】:

我正在使用这个从剪贴板获取图像:

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

现在我想使用ImageIO.write 将此图像保存在磁盘中;
如何找到在 ImageIO.write 中使用的图像格式 (JPG,PNG,GIF,...) 作为 formatName

谢谢

【问题讨论】:

  • This Question/Answer 可能会有所帮助。
  • @Gus:不幸的是,当图像来自剪贴板时,这不起作用; ImageIO.getImageReaders(imageIconObject) 返回一个空迭代器!
  • 简而言之,这根本不可能。当您从剪贴板检索图像时,它是java.awt.Image 格式。这是 Java 对图像数据的表示,完全独立于该数据来自的任何图像文件的原始格式。您可以以您选择的任何格式将图像写入磁盘。

标签: java image clipboard image-formats


【解决方案1】:

通过

检查时剪贴板内容的mime类型
.isDataFlavorAvailable(DataFlavor.imageFlavor)

image/x-java-image(但OS vendors do not need to follow MIME types for clipboards)。

我发现了两种从剪贴板获取图像并将其写入文件的方法:

  1. 使用这篇博文中的帮助方法: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"));
    

    getBufferedImage 方法如下所示:

    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. 通过可转让。请注意,这在 OS X 上运行,但会生成正确大小的空图像:

    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"));
    

【讨论】:

    最近更新 更多