我一直在阅读OS X Java Developer Tools,以帮助使我的应用程序与操作系统更“原生”。我在这个特殊的部分发现了一些有趣的东西。(重点是地雷)
要将与分辨率无关的tiff、icns或pdf文件从应用程序包的Resources文件夹加载到Java应用程序中,请使用Java.awt.toolkit
的GetImage()
方法。您传递到getImage()
中的字符串的格式为“nsimage:/myimage”
。不包含映像的文件扩展名。还要注意,当用户界面比例因子的值不是1.0时,Sun 2D渲染器将被禁用。使用石英渲染器,使您的图像缩放平滑。
由于熟悉javax.imageio
,这完全出乎我的意料,因为我不知道将其他文件类型加载到图像中的其他方法。尤其是在平台已经过时并且完全不支持.tiftif
等文件的情况下。例如,在我的计算机上进行的快速测试给出了以下信息:
Supported read formats: [jpg, bmp, gif, png, wbmp, jpeg]
Supported write formats: [jpg, bmp, gif, png, wbmp, jpeg]
'JPEG' reader: com.sun.imageio.plugins.jpeg.JPEGImageReader@5e9f23b4
'JPEG' reader: com.sun.imageio.plugins.jpeg.JPEGImageWriter@378fd1ac
我试着加载了一个简单的.tiff
图像,并对其进行了测试:
static Image n; public static void main(String[] args) { JFrame f = new JFrame(); JPanel p = new JPanel() { @Override public void paintComponent(Graphics graphics) { graphics.drawImage(n, 0, 0, null); } } f.add(p); n = Toolkit.getDefaultToolkit().getImage(("/Users/zinedine/Desktop/test_image.tiff"); f.setVisible(true) }
它一无所获:
我又试了一次:这一次,将图像添加到java项目的基本文件夹中,并将其作为字符串键入:“nsimage:/test_image.tiff”
。就像我做的每件事一样,都不起作用。
>
工具包如何加载图像?如果尝试从桌面加载.TIFF
图像,则调用.ToString()
将得到以下结果:
sun.awt.image.ToolkitImage@25f38edc // Also can't be cast to java.awt.BufferedImage
阅读器(和编写器(如果有的话))是公共API的一部分吗?换句话说,我可以调用一些东西来将我的.tiff
文件加载到图像
(然后我可以将其转换为`BufferedImage?
而且,如果读取器/写入器是API的一部分,为什么javax.imageio
包不能找到它们?
你在这里问了很多问题,但我会尽我最大的努力来解释所有的问题。:-)
使用toolkit
加载图像(java.awt.image
和friends)是“旧的”异步生产者/消费者成像API的一部分,使用起来可能会有点尴尬。它完全可以加载打包的图标和类似的,但不太适合加载大的,用户提供的图像,因为您没有进度跟踪,很少的错误反馈,如果任何错误,等等。
如果要执行任何类型的图像操作,这些图像也没有bufferedimage
有用。您不能将它们强制转换为BufferedImage
,但可以通过将它们绘制到BufferedImage
上来“转换”它们。
Apple Java实现确实有一些额外的特性,比如允许您使用特殊的URI方案加载Apple系统映像。它似乎也可以通过这种方式加载捆绑图像,使用@2X
命名约定,甚至可以在OS X中使用多比例TIFF或可缩放PDF,为应用程序提供分辨率无关的图形。
请注意,要使其工作,您需要将应用程序打包为应用程序包,并将您的映像放置在包的Resources文件夹(即contents/Resources
)中。并且必须使用其基名称引用映像,而不使用扩展名。据我所知,您不能使用此功能来读取未随应用程序打包的随机TIFF文件(即用户提供的内容)。
此外,该功能是Apple JRE特有的,只能在Apple自己的JRE和OS X上工作。它不是公共Java API的一部分,也不能跨平台工作。我建议在OS X上尽量少使用这些功能,并且只有在系统集成更好的情况下(即,使您的应用程序看起来更原生)。
要读(写)任何TIFF(或任何其他格式),您应该使用imageio
和一些适当的插件。由于某种原因,JRE没有附带TIFF格式的插件,但存在几个第三方插件。
如果您不想使用JAI(通过jai_imageio.jar
),我可以推荐我自己的TwelveMonkeys库,它支持TIFF和其他一些格式。它使用业务友好的开源BSD许可证。
也有Apache Commons Imaging、iCafe和其他可能可以读/写TIFF的软件,但它们有自己的自定义API,这使得它们不那么灵活,更多的是专有的IMO。
问题内容: 我正在尝试编写一个将从用户的串行端口读取的Java小程序。为此,我将Java Comm API 与RXTX库结合使用。我已经成功地通过本地Java应用程序读取了数据,但似乎无法在applet中进行相同的操作。问题在于RXTX库是一个本机库,我还没有找到在Java小程序中加载该库的方法。我发现了两篇有趣的文章(在Applets中使用JNI引用了本文),但是这两篇文章已有10多年的历史了,
我正在通过Node.js1的[node-java]包装器运行一个JNA编译的本机库 这个库是Hunsplaw JNA,它包装了Hunsplaw拼写库。 当试图从lib路径加载本机库时,所发生的情况是节点似乎挂起: 库就在那里,我也尝试了该方法的第二个选项,复制到一个临时文件夹中并从那里加载,这样我就可以看到 它就在那里。
我有以下分布 主要的jar包含main方法,我想在其中访问lib提供的本机函数。所以被捆绑在发行版中。开始sh只需设置java的类路径和引导。 加载库的最佳方法是什么。那么应用程序内部的库呢?我知道两种方法: 系统。加载(绝对路径) 系统。loadLibrary(名称) 前者需要库在文件系统中的绝对路径,后者需要设置特定于应用程序的java。图书馆路径JVM参数。在这种情况下,哪种解决方案更好?将
我尝试从数组中随机加载gif。我尝试了几种方法,但都没有奏效。我要么收到错误消息,要么图像就不会出现。 版本 1(结果:图像未显示): 版本2(结果:“无效调用”) 版本3(结果:无法加载图像): 有什么想法吗?