更改Java ImageIO类的功能

时间:2012-01-31 16:37:23

标签: java java-native-interface tiff javax.imageio

我正在使用

  

javax.imageio.ImageIO class

sun提供的那个不支持读取.tif文件。因此,如果我尝试读取.tif文件,它只返回一个null。然后我从oracle的网站下载了这个api并将其包含在classpath中。这个api使用jni,因为该文件夹中的.so文件很明显。之后,我不必更改代码中的任何内容,而且它有效。怎么会发生这种情况?班级名字不会发生冲突吗?

我下载的api中有3件事情:

  1. clibwrapper_jiio.jar
  2. jai_imageio.jar
  3. libclib_jiio.so
  4. 我没有必要做任何额外的导入。实际上,ImageIO类提供的功能已经增强了

    我很好奇这是如何运作的。

    这是javax.imageio包中的类。该课程已被宣布为最终成绩。它做了一些我无法理解的奇怪复杂的东西。有人可以通过一个更简单的例子解释如何实现这种效果。

    http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html

2 个答案:

答案 0 :(得分:4)

ImageIOscanForPlugins(...)方法。我想,在类加载时,它需要查看CLASSPATH并查找可以扩展其功能的任何内容。

The javadoc which hints to this is here

你可以通过在一个类中放置一个静态块来做类似的事情

public class MyClass {

  public static scanForExtensions() {
    ... code looking for extensions goes here ...
    ... for each found extension, register them in the "ExtensionRegistry"
    ExtensionRegistry.register(extension);
  }

  static  {
    scanForExtensions();
  }

  public void doSomething(String input) {
    for (Extension extension : ExtensionRegistry.getExtensions()) {
      if (extension.canHandle(input)) {
        extension.handle(input);
        return;
      }
    }
    throw UnhandledInputException("No extension to handle " + input);
  }

}

答案 1 :(得分:2)

Java的Image IO使用服务提供者接口工作(有关详细信息,请参阅下面的链接)。

JavaSound的工作方式相同。要向(例如)MP3添加对JavaSound的支持,只需要将JMF的mp3plugin.jar添加到运行时类路径,然后JavaSound可以像WAV一样轻松地解码MP3文件(使用完全相同的类 - 非常时髦。

我希望通过在JRE的lib目录中添加一堆不同图像类型的服务提供程序,JAI的安装也做了类似的事情。

  1. ImageWriterSpi
  2. Creating Extensible Applications With the Java Platform