Как получить все разные размеры системной иконки файла - PullRequest
9 голосов
/ 06 февраля 2012

Я делаю кусок кода в Java, и мне нужно получить системные размеры файлов значков разных размеров.Я знаю, что для получения значков файловой системы, я должен использовать это:

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

, но этот код возвращает наименьший размер значка.Что я должен делать для получения других размеров?

Ответы [ 4 ]

1 голос
/ 10 мая 2016

Для 32x32 Icon вы можете использовать ShellFolder.

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

Или используйте JNI Api. Оба "решения" уже обсуждены здесь

0 голосов
/ 29 ноября 2018

Если вы ищете, как это сделать на 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);
    }
}
0 голосов
/ 24 августа 2018

Я сделал библиотеку, которая может извлекать все размеры иконок.Это здесь JIconExtract Просто введите:

BufferedImage Image = JIconExtractor.getJIconExtractor(new File(„sometext.txt“,IconSize.JUMBO));
0 голосов
/ 16 июня 2018

Я столкнулся с той же проблемой необходимости значков высокого разрешения.После часа копания я думаю, что ответ вполне ясен, хотя и весьма неудачен.

  1. В настоящее время нет поддержки нативных библиотек.
  2. Ожидается собственная поддержка в версии 12 Java.
  3. Нет нигде надежной сторонней библиотеки, которую я мог бы найти, даже после тщательного поиска.

Билет с этим вопросом уже отправлен здесь в системе ошибок JDK, но она кажется довольно низкой в ​​их списке приоритетов.


Однако, кажется, есть обходные пути:

Я предполагаю, что выиспользуя Windows.Поиск файла значков в Linux тривиален, поскольку значок хранится отдельно и связан с записью рабочего стола.

  1. Извлеките значок с помощью стороннего инструмента командной строки exe, например this или это , во временный каталог.Вы можете использовать Runtime.exec().
  2. . Использовать библиотеку чтения .ico, такую ​​как , предлагаемую здесь , чтобы прочитать все файлы изображений, которые она содержит, в BufferedImage в List.
  3. Итерируйте по списку, чтобы найти изображение с самым высоким разрешением.
  4. Удалите временные файлы.

Обновите

Только что реализованомой обходной путь, и это сработало.Вот фрагмент кода.В своей реализации я использовал iconsext.exe и image4j .

    // 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:

Nice and big icons

Хорошие и большие значки!


Обходной путь сложен и запутан, я знаю.И это сводит на нет кросс-платформенные преимущества Java, но, честно говоря, это лучшее, что я могу придумать.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...