当前位置: 首页 > 知识库问答 >
问题:

Java如何加载本机nsimages?

沈子实
2023-03-14

我一直在阅读OS X Java Developer Tools,以帮助使我的应用程序与操作系统更“原生”。我在这个特殊的部分发现了一些有趣的东西。(重点是地雷)

要将与分辨率无关的tiff、icns或pdf文件从应用程序包的Resources文件夹加载到Java应用程序中,请使用Java.awt.toolkitGetImage()方法。您传递到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包不能找到它们?

  • 共有1个答案

    融焕
    2023-03-14

    你在这里问了很多问题,但我会尽我最大的努力来解释所有的问题。:-)

    使用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(结果:无法加载图像): 有什么想法吗?