2016-11-16 48 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(...)方法有关。

ImageIO.write(RenderedImage, String, File)的API文档:

写入使用支持给定格式的一个File任意ImageWriter的图像。如果已经存在File,则其内容被丢弃。

参数:

im - 一个RenderedImage被写入。

formatName - 一个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中操作图像)。