2016-11-16 6 views
0

Я пытаюсь получить значок из файла .lnk, поместив его в изображение javafx, а затем сохраните его как .png-файл (чтобы убедиться, что он работает).Значок из файла .lnk в javafx Изображение

Мой текущий код компилируется, но не работает:

import java.io.*; 
import java.util.*; 
import javax.swing.filechooser.FileSystemView; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javafx.embed.swing.SwingFXUtils; 
import java.awt.image.BufferedImage; 
import java.awt.Graphics; 
import javafx.scene.image.Image; 
import javax.imageio.ImageIO; 
class Iconic { 
    public static void main(String[] args) throws IOException{ 
     File origin = new File("C:\\Users\\00001\\OneDrive.lnk"); 
     Icon icn = FileSystemView.getFileSystemView().getSystemIcon(origin); 
     ImageIcon ico = ((ImageIcon) icn); 
     BufferedImage bi = new BufferedImage(
      ico.getIconWidth(), 
      ico.getIconHeight(), 
      BufferedImage.TYPE_INT_RGB); 
     Graphics g = bi.createGraphics(); 
     ico.paintIcon(null,g,0,0); 
     g.dispose(); 
     Image img = SwingFXUtils.toFXImage(bi,null); 

     File output = new File("C:\\Users\\00001\\"); 
     BufferedImage bim = SwingFXUtils.fromFXImage(img,null); 
     ImageIO.write(bim,".png",output); 
    } 
} 
+0

«Не работает». Так что же происходит? Вы получаете исключение? Если это так, разместите трассировку стека. И похоже, вы пытаетесь записать изображение в каталог в конце ...? –

+0

В настоящее время он не генерирует никаких исключений, однако он не сохраняет значок .lnk файла как .jpg –

ответ

0

Вы почти там, однако, есть две проблемы в вашем коде. Оба они связаны с методом ImageIO.write(...).

Из API док из ImageIO.write(RenderedImage, String, File):

записывает изображение с помощью произвольного ImageWriter, который поддерживает данный формат к File. Если уже есть File, его содержимое отбрасывается.

Параметры:

im - это RenderedImage быть написано.

formatName - a String, содержащий неофициальное название формата.

output - a File для написания.

  1. Второй параметр имя формата, а не расширение файла. Итак, вторым аргументом должен быть «PNG», а не «.png». Поскольку ImageIO не находит плагинов, которые могут писать формат «.png», вызов write(...) будет просто молча возвращаться false. Я рекомендую всегда проверять возвращаемое значение ImageIO.write(...).

  2. Третий параметр: целевой файл для записи. Путь к этому файлу должен указывать на файл, однако ваш адрес указывает только на каталог. Если вы исправите только имя формата выше, вы увидите, что, скорее всего, вы получите IOException.

Таким образом, исправленная версия вашего написания кода, как хотелось бы:

File output = new File(origin.getParentFile(), origin.getName().replace(".lnk", ".png")); 

if (!ImageIO.write(bi, "PNG", output)) { 
    System.err.println("Could not write icon"); 
} 

Я намеренно оставил преобразование FX Image из них. Вы должны иметь возможность писать bi напрямую, без преобразования на FX и обратно Image (если, конечно, вы не манипулируете изображением в FX).