Я столкнулся с той же проблемой необходимости значков высокого разрешения.После часа копания я думаю, что ответ вполне ясен, хотя и весьма неудачен.
- В настоящее время нет поддержки нативных библиотек.
- Ожидается собственная поддержка в версии 12 Java.
- Нет нигде надежной сторонней библиотеки, которую я мог бы найти, даже после тщательного поиска.
Билет с этим вопросом уже отправлен здесь в системе ошибок JDK, но она кажется довольно низкой в их списке приоритетов.
Однако, кажется, есть обходные пути:
Я предполагаю, что выиспользуя Windows.Поиск файла значков в Linux тривиален, поскольку значок хранится отдельно и связан с записью рабочего стола.
- Извлеките значок с помощью стороннего инструмента командной строки exe, например this или это , во временный каталог.Вы можете использовать
Runtime.exec()
. - . Использовать библиотеку чтения .ico, такую как , предлагаемую здесь , чтобы прочитать все файлы изображений, которые она содержит, в
BufferedImage
в List
. - Итерируйте по списку, чтобы найти изображение с самым высоким разрешением.
- Удалите временные файлы.
Обновите
Только что реализованомой обходной путь, и это сработало.Вот фрагмент кода.В своей реализации я использовал 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](https://i.stack.imgur.com/hjA4a.png)
Хорошие и большие значки!
Обходной путь сложен и запутан, я знаю.И это сводит на нет кросс-платформенные преимущества Java, но, честно говоря, это лучшее, что я могу придумать.Надеюсь, это поможет.