当我遵循javafx教程并尝试为ImageView创建新的Image实例,以将其用于TreeView时,我注意到该辅导老师曾经创建过ImageView:
extension UIImage {
func toCIImage()->CIImage? {
if let ciImage = CIImage(image: self) {
return ciImage
}
else {
guard let cgImg = self.cgImage else {
return nil
}
return CIImage(cgImage: cgImg)
}
}
代替:
new ImageView(new Image(getClass().getResourceAsStream("/Path/to/pic"))
我尝试了两种方法,并且都适用。我想知道使用new ImageView(new Image("/Path/to/pic"))
进行的这种滚动是否有任何效果或意义。
答案 0 :(得分:1)
是的。这实际上非常重要。
图片是资源。资源是程序使用的一些不变的信息,例如图像,声音,默认属性,模板,初始数据等。
在使用IDE进行开发时,资源通常以文件形式存储在工作区的文件夹中。因此,只要使用IDE而不打包程序,就可以将资源视为文件。
但是,当您要部署程序(将其打包并安装到其他位置,例如服务器或其他人的计算机)时,通常会将其打包到一个或多个JAR文件中。 JAR文件包括已编译的类和资源。
当它们位于JAR文件中时,资源不再是文件。它们只是zip条目(zip条目不是文件,它们是zip文件的一部分,可以使用适当的软件进行访问)。
如果使用文件操作访问资源,则会遇到问题,例如this one。图片不会显示-因为文件不存在。该资源不是文件,它不作为磁盘上的文件存在。这只是您JAR文件中的一组字节。
要访问资源,请使用类对象和显示的getResourceAsStream()
。当您在IDE中运行时,这“神奇地”知道(当正确设置了类加载器和类路径时),资源存储在工作区中的文件中,而当您从JAR运行时,资源存储在内部。罐。它将从存储它们的字节中获取这些字节,然后您就可以创建图像。