Ziz*_*212 7 java macos image toolkit
我一直在阅读OS X Java Developer Tools,以帮助我的应用程序在操作系统中更加"原生".我找到了在这个特殊的有趣的部分.(强调我的)
要将与应用程序包的Resources文件夹中的与分辨率无关的tiff,icns或pdf文件加载到Java应用程序中,请使用以下
getImage()方法:java.awt.Toolkit.您传入的字符串getImage()是表单"NSImage://MyImage".不要包含图像的文件扩展名.另请注意,当用户界面比例因子的值不为1.0时,将禁用Sun 2D渲染器.使用Quartz渲染器,以便您的图像可以平滑地缩放.
熟悉javax.imageio,这是一个完全的惊喜,因为我不知道任何其他方式将其他文件类型加载到图像中.特别是对于过时的平台,绝对不支持文件.tiff.例如,我的计算机上的快速测试给了我:
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
Run Code Online (Sandbox Code Playgroud)
我试着加载一个简单的 .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".就像我做的一切一样,它不起作用.
但是,如果我将我的花式路径字符串更改为NSImage,例如"NSImage://NSApplicationIcon"...
有用.我做了一个快速的聚光灯搜索NSImage,并找到了一个.它看起来像这些图像的文件类型.png.这有点令人不安,因为我预计会有一个合适的图像.请注意,我也有点期待它:如果它需要表单的参数"NSImage://something",那么它可能会忽略其他任何东西.
显然,我有几个问题:
Toolkit如何加载图像?如果我尝试.tiff从桌面加载图像,这就是我打电话时得到的图像.toString():
sun.awt.image.ToolkitImage@25f38edc // Also can't be cast to java.awt.BufferedImage
Run Code Online (Sandbox Code Playgroud)读者(和作者,如果有的话)是公共API的一部分吗?换句话说,我可以调用一些东西将我的.tiff文件加载到Image(我可以然后将其转换为`BufferedImage?
然后,如果读者/作者是API的一部分,为什么javax.imageio包不能找到它们?
这可能看起来像少数(是的,我很抱歉在这个问题上毁了你的一天),但对我来说,这看起来像预期的,但同时也是错误的行为.奖励标记:是否有任何可以处理.tiff文件(和其他)的友好(即开放源代码)成像API(不是JAI )?
您在这里提出了多个问题,但我会尽力解释所有问题。:-)
使用Toolkit来加载图像(java.awt.Image和朋友)是“旧的”异步生产者/消费者成像 API 的一部分,并且使用起来可能会感觉有点尴尬。加载打包的图标和类似的东西是完全可以的,但不太适合加载用户提供的大型图像,因为你没有进度跟踪,如果出现任何问题,几乎没有错误反馈,等等。
BufferedImage如果您想执行任何类型的图像操作,这些图像也比 s 有用得多。您不能将它们转换为 a BufferedImage,但可以通过将它们绘制到 a 上来“转换”它们BufferedImage。
该类Toolkit是抽象的,您可以使用 获得具体实例Toolkit.getToolkit()。这个具体实例是特定于平台的,并且最终使用系统特定的本机调用来执行大多数方法,例如加载图像。
Apple Java 实现确实有一些额外的功能,例如允许您使用特殊的 URI 方案加载 Apple 系统映像。它似乎还可以使用@2x命名约定以这种方式加载捆绑图像,甚至可以在 OS X 中加载多尺度 TIFF 或可缩放 PDF,为您的应用程序提供与分辨率无关的图形。
请注意,为此,您需要将应用程序打包为应用程序包,并将图像放置在Contents/Resources该包的 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)。
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |