【问题标题】:How to get all different sizes of system icon of a file如何获取文件的所有不同大小的系统图标
【发布时间】:2012-02-28 05:26:35
【问题描述】:

我正在用 java 编写一段代码,我需要获取不同大小的文件系统图标。 我知道要获取文件系统图标,我应该使用这个:

File file = new File("Whatever.txt");
FileSystemView view = FileSystemView.getFileSystemView();
Icon icon = view.getSystemIcon(file);

但此代码返回图标的最小尺寸。 我应该怎么做才能获得其他尺寸?

【问题讨论】:

  • 据我所知,Java 不支持其他图标。如果需要,请向 Oracle 提出 RFE,以添加提供 Icon[] 的方法。
  • @AndrewThompson 你能解释一下吗?
  • 你能说得更具体点吗?你有什么不明白的?
  • @AndrewThompson 是的,当然。我只需要获取单个文件的所有不同大小和图标的图像,如操作系统默认文件浏览器或资源管理器等中所示。使用我上面提到的代码,只返回最小的图标;您说为了解决问题,我可以向 Oracle 提出 RFE 以添加提供图标 [] 的方法。你确定它会给我我想要的吗?如果是这样,我不知道什么是 RFE 以及您所说的几乎全部内容!
  • “你确定它会给我我想要的吗?” 如果你指定的很好,Oracle 可以实现它。 RFE - '请求增强' - 你通过bug database 提出一个。按照链接然后按照说明进行操作(在链接末尾描述)。顺便说一句 - 请注意,即使 Oracle 确实实现了它,它也至少要到 Java 8 才能使用。;)

标签: java swing icons


【解决方案1】:

对于 32x32 图标,您可以使用 ShellFolder。

sun.awt.shell.ShellFolder.getShellFolder( file ).getIcon( true ) 

或者使用 JNI Api 。两种“解决方案”都已分发here

【讨论】:

    【解决方案2】:

    我遇到了同样需要高分辨率图标的问题。经过一个小时的挖掘,我认为答案很清楚,尽管很不幸。

    1. 目前没有原生库支持。
    2. Java 版本 12 预计会提供本机支持。
    3. 即使经过大量搜索,我也找不到任何可靠的第三方库。

    已在 JDK 错误系统上提交了此问题的票证 here,但在他们的优先级列表中似乎很低。


    但是,似乎确实有解决方法:

    我假设您使用的是 Windows。在 Linux 上查找图标文件很简单,因为图标单独存储并链接在桌面条目中。

    1. 使用第三方命令行 exe 工具(如 this onethis one)将图标解压缩到临时目录。您可以使用Runtime.exec()
    2. 使用 .ico 阅读器库(如 the ones suggested here)将其包含的所有图像文件读入 BufferedImage 中的 List
    3. 遍历列表以找到最高分辨率的图像。
    4. 删除临时文件。

    更新

    刚刚实施了我的解决方法,它奏效了。这是代码sn-p。我在实现中使用了iconsext.exeimage4j

        // Extract icons and wait for completion.
        File iconDir = new File("tempIcons");
        String[] iconsextCmd = { "iconsext.exe", "/save", exeFile.getPath(), iconDir.getPath(), "-icons" };
        Process iconsextProc = Runtime.getRuntime().exec(iconsextCmd);
        iconsextProc.waitFor();
    
        // Get all icons, sort by ascending name, and pick first one.
        File[] icons = iconDir.listFiles();
        Arrays.sort(icons, (f1, f2) -> f1.getName().compareTo(f2.getName()));
        File defaultIcon = icons[0];
    
        // Read images from icon.
        List<ICOImage> iconImgs = ICODecoder.readExt(defaultIcon);
    
        // Sort images by descending size and color depth, and pick first one.
        iconImgs.sort((i1, i2) -> (i2.getWidth() * i2.getHeight() * 33 + i2.getColourDepth())
                - (i1.getWidth() * i1.getHeight() * 33 + i1.getColourDepth()));
        BufferedImage awtImg = iconImgs.get(0).getImage();
    
        // Delete temporary icons.
        for (File i : icons)
        {
            i.delete();
        }
        iconDir.delete();
    

    引入一些 JavaFX 代码:

    漂亮的大图标!


    我知道,解决方法是混乱和复杂的。它确实否定了 Java 的跨平台优势,但老实说,这是我能想到的最好的。希望对您有所帮助。

    【讨论】:

    • 这不是只提取系统默认图标吗?如果我需要蒸汽图标怎么办?在iconsextract页面上,它说它有一个[将单个图标复制到剪贴板]的选项,这在这里可能很方便,但不幸的是页面本身相当古老
    【解决方案3】:

    如果您正在寻找如何在 Mac 上执行此操作,可以使用第三方库 Quaqua

    import java.awt.image.BufferedImage;
    import java.io.File;
    
    public class SystemIconMac {
        public static BufferedImage getIconImage(File file, int size) {
            return  ch.randelshofer.quaqua.osx.OSXFile.getIconImage(file, size);
        }
    }
    

    【讨论】:

      【解决方案4】:

      我创建了一个名为 JIconExtractReloaded 的库,它可以提取所有图标大小,而不仅仅是 32x32。这是链接https://github.com/MrMarnic/JIconExtractReloaded

      只写:

      BufferedImage image = JIconExtract.getIconForFile(128,128,"C:\\Windows\\explorer.exe");
      

      你有图标。

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多