我正在尝试从.lnk文件中获取Icon,将其放入javafx图像中,然后将其另存为.png文件(以确保它正常工作)。
我当前的代码编译但不起作用:
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)
您几乎就在那里,但是,您的代码中存在两个问题。两者都与ImageIO.write(...)
方法有关。
来自ImageIO.write(RenderedImage, String, File)
的API文档:
使用支持给定格式的任意
ImageWriter
将图像写入File
。如果已存在File
,则其内容将被丢弃。<强>参数:强>
im
- 要写RenderedImage
。
formatName
-String
包含格式的非正式名称。
output
- 要写入File
。
第二个参数是格式名称,而不是文件扩展名。所以,第二个参数应该是&#34; PNG&#34;,而不是&#34; .png&#34;。因为ImageIO
找不到任何可以编写&#34; .png&#34;格式,write(...)
调用将默默返回false
。我建议您始终检查ImageIO.write(...)
。
第三个参数是要写入的目标文件。此文件的路径必须指向一个文件,但是您的文件只指向一个目录。如果您只修复上面的格式名称,那么您很可能会看到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中的图像)。