2016-11-16 36 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中操作圖像)。