我正在围绕OpenJPEG本机库构建一个java ImageIO包装器。
我有一个有效的ImageReader实现。但是,我无法得到 ImageIO库自动加载我的实现。相反,我有 手动注册类,然后它可以工作。
有没有人对如何让ImageIO.scanForPlugins正常工作有任何想法?
如果你想查看代码,只需从这里克隆我的分支
https://github.com/CodecCentral/openjpeg/tree/java_imageio
里面有两个maven项目:一个用于读者,一个用于简单的查看器 链接到读者。
您还可以在此处找到示例Jpeg2000文件:
答案 0 :(得分:2)
您似乎缺少服务注册表获取Spi类所需的META-INF/services/
资源。
资源是文本文件,需要在它们实现的Spi类之后命名(一个用于编写器,一个用于读取器),并且包含一行具有Spi实现类的确切名称。
您需要以下文件(在java_imageio / wrapping / java / openjp2 / src / main / resources中):
/META-INF/services/javax.imageio.spi.ImageReaderSpi
# File content (comments allowed)
org.openJpeg.JP2KOpenJpegImageReaderSpi
/META-INF/services/javax.imageio.spi.ImageWriterSpi
# File content (comments allowed)
org.openJpeg.JP2KOpenJpegImageWriterSpi
一些其他评论:虽然与注册没有直接关系,但我浏览了您的源代码,并且您的Spi类可能还有其他一些问题。
inputTypes
,您列出了File
,byte[]
和URL
。虽然这些类型可能没问题,但ImageIO
可能也需要您支持ImageInputStream
(大多数读者仅支持此类型),以便正常运行。请参阅read
上的静态ImageIO
方法及其实现方式。canDecodeInput
应该查看文件/流内容以识别格式" magic"标识符或标题结构。如果您只是返回true
,则无论内容如何,您的读者都会尝试解码任何File
,byte[]
和URL
,而不会让其他读者有机会正确阅读它们。而且,我认为你必须支持ImageInputStream
作为正常操作的输入。