Module java.desktop

Class ImageReaderSpi

所有已实现的接口:
RegisterableService

public abstract class ImageReaderSpi extends ImageReaderWriterSpi
ImageReader的服务提供者接口(SPI)。有关服务提供者类的更多信息,请参阅IIORegistry类的类注释。

每个ImageReaderSpi提供了关于其关联的ImageReader类的多种信息。

通过getVendorNamegetDescriptiongetVersion方法可以获取定义SPI类的供应商名称和类的简要描述。这些方法可以国际化以提供特定于区域设置的输出。这些方法主要用于提供可用于组织弹出菜单或其他列表的简短、易读的信息。

可以通过getFormatNamesgetFileSuffixesgetMIMETypes方法获取与服务关联的格式名称、文件后缀和MIME类型的列表。这些方法可用于根据手动格式选择、文件命名或MIME关联(例如,在通过HTTP访问文件或作为电子邮件附件时)识别用于解码特定文件或流的候选ImageReader

通过canDecodeInput方法提供了一种更可靠的方法来确定哪些ImageReader可能能够解析特定的数据流。此方法允许服务提供者检查实际流内容。

最后,可以通过调用createReaderInstance方法获取与此服务提供者关联的ImageReader类的实例。任何繁重的初始化,如加载本机库或创建大型表,都应至少推迟到第一次调用此方法之前。

参见:
  • Field Details

    • STANDARD_INPUT_TYPE

      @Deprecated public static final Class<?>[] STANDARD_INPUT_TYPE
      Deprecated.
      Instead of using this field, directly create the equivalent array { ImageInputStream.class }.
      getInputTypes返回的初始包含ImageInputStream.class的单元素数组。
    • inputTypes

      protected Class<?>[] inputTypes
      要从getInputTypes返回的Class对象数组,最初为null
    • writerSpiNames

      protected String[] writerSpiNames
      要从getImageWriterSpiNames返回的字符串数组,最初为null
  • Constructor Details

    • ImageReaderSpi

      protected ImageReaderSpi()
      构造一个空白的ImageReaderSpi。子类应初始化实例变量和/或覆盖方法实现,以提供所有方法的工作版本。
    • ImageReaderSpi

      public ImageReaderSpi(String vendorName, String version, String[] names, String[] suffixes, String[] MIMETypes, String readerClassName, Class<?>[] inputTypes, String[] writerSpiNames, boolean supportsStandardStreamMetadataFormat, String nativeStreamMetadataFormatName, String nativeStreamMetadataFormatClassName, String[] extraStreamMetadataFormatNames, String[] extraStreamMetadataFormatClassNames, boolean supportsStandardImageMetadataFormat, String nativeImageMetadataFormatName, String nativeImageMetadataFormatClassName, String[] extraImageMetadataFormatNames, String[] extraImageMetadataFormatClassNames)
      使用给定的一组值构造一个ImageReaderSpi
      参数:
      vendorName - 供应商名称,作为非nullString
      version - 版本标识符,作为非nullString
      names - 包含格式名称的非nullString数组。必须至少有一个条目。
      suffixes - 包含常见文件后缀的String数组。如果未定义后缀,则应提供null。长度为0的数组将被规范化为null
      MIMETypes - 包含格式的MIME类型的String数组。如果未定义MIME类型,则应提供null。长度为0的数组将被规范化为null
      readerClassName - 关联的ImageReader类的完全限定名称,作为非null String
      inputTypes - 长度至少为1的Class对象数组,指示合法的输入类型。
      writerSpiNames - 命名所有关联ImageWriter的类的String数组,或null。长度为0的数组将被规范化为null
      supportsStandardStreamMetadataFormat - 一个boolean,指示流元数据对象是否可以使用标准元数据格式描述的树。
      nativeStreamMetadataFormatName - 从getNativeStreamMetadataFormatName返回的String,或null
      nativeStreamMetadataFormatClassName - 用于实例化元数据格式对象以从getNativeStreamMetadataFormat返回的String,或null
      extraStreamMetadataFormatNames - 从getExtraStreamMetadataFormatNames返回的String数组,或null。长度为0的数组将被规范化为null
      extraStreamMetadataFormatClassNames - 用于实例化元数据格式对象以从getStreamMetadataFormat返回的String数组,或null。长度为0的数组将被规范化为null
      supportsStandardImageMetadataFormat - 一个boolean,指示图像元数据对象是否可以使用标准元数据格式描述的树。
      nativeImageMetadataFormatName - 从getNativeImageMetadataFormatName返回的String,或null
      nativeImageMetadataFormatClassName - 用于实例化元数据格式对象以从getNativeImageMetadataFormat返回的String,或null
      extraImageMetadataFormatNames - 从getExtraImageMetadataFormatNames返回的String数组。长度为0的数组将被规范化为null
      extraImageMetadataFormatClassNames - 用于实例化元数据格式对象以从getImageMetadataFormat返回的String数组,或null。长度为0的数组将被规范化为null
      抛出:
      IllegalArgumentException - 如果vendorNamenull
      IllegalArgumentException - 如果versionnull
      IllegalArgumentException - 如果namesnull或长度为0。
      IllegalArgumentException - 如果readerClassNamenull
      IllegalArgumentException - 如果inputTypesnull或长度为0。
  • Method Details

    • getInputTypes

      public Class<?>[] getInputTypes()
      返回一个Class对象数组,指示可以用作读取器的setInput方法的参数类型。

      对于大多数只接受来自ImageInputStream的输入的读取器,应返回包含ImageInputStream.class的单元素数组。

      返回:
      至少包含1个元素的非nullClass对象数组。
    • canDecodeInput

      public abstract boolean canDecodeInput(Object source) throws IOException
      如果提供的源对象似乎是此读取器支持的格式,则返回true。从此方法返回true并不保证读取将成功,只是根据对流内容的简要检查,似乎有合理的成功机会。如果源是ImageInputStream,实现通常会检查流的前几个字节,以查找与格式相关联的“魔数”。一旦实际读取开始,读取器仍可能在解码完成之前的任何时间指示失败。

      重要的是不要破坏对象的状态,以便其他ImageReaderSpi可以正确确定它们是否能够解码对象。特别是,如果源是ImageInputStream,应使用mark/reset对来保留流位置。

      诸如“原始”之类的格式,可能尝试读取几乎任何流的格式,应返回false,以避免在优先于更接近匹配的情况下被调用。

      如果source不是由getInputTypes返回的类之一的实例,则该方法应简单地返回false

      参数:
      source - 要解码的对象(通常是一个ImageInputStream)。
      返回:
      true 如果可能可以解码此流。
      抛出:
      IllegalArgumentException - 如果sourcenull
      IOException - 如果在读取流时发生I/O错误。
    • createReaderInstance

      public ImageReader createReaderInstance() throws IOException
      返回与此服务提供者关联的ImageReader实现的实例。返回的对象最初将处于初始状态,就好像其reset方法已被调用一样。

      默认实现只是返回createReaderInstance(null)

      返回:
      一个ImageReader实例。
      抛出:
      IOException - 如果在加载、初始化读取器类、实例化或初始化读取器对象期间发生错误。
    • createReaderInstance

      public abstract ImageReader createReaderInstance(Object extension) throws IOException
      返回与此服务提供者关联的ImageReader实现的实例。返回的对象最初将处于初始状态,就好像其reset方法已被调用一样。

      可能会在构造时向插件提供一个Object。对象的性质完全取决于插件。

      通常,插件将使用类似return new MyImageReader(this)的代码来实现此方法。

      参数:
      extension - 插件特定的扩展对象,可以为null
      返回:
      一个ImageReader实例。
      抛出:
      IOException - 如果尝试实例化读取器失败。
      IllegalArgumentException - 如果ImageReader的构造函数抛出IllegalArgumentException以指示扩展对象不合适。
    • isOwnReader

      public boolean isOwnReader(ImageReader reader)
      如果传入的ImageReader对象是与此服务提供者关联的ImageReader的实例,则返回true

      默认实现将reader参数的完全限定类名与传递给构造函数的类名进行比较。如果需要更复杂的检查,可以重写此方法。

      参数:
      reader - 一个ImageReader实例。
      返回:
      如果reader被识别,则返回true
      抛出:
      IllegalArgumentException - 如果readernull
    • getImageWriterSpiNames

      public String[] getImageWriterSpiNames()
      返回一个包含所有能理解与此服务提供者关联的ImageReader使用的内部元数据表示的ImageWriterSpi类的完全限定名称的String数组,如果没有指定这样的ImageWriter,则返回null。如果返回非null值,则其长度必须为非零。

      数组中的第一项必须是“首选”写入器的服务提供者的名称,因为它将用于实例化ImageIO.getImageWriter(ImageReader)返回的ImageWriter

      此机制可用于获取将理解由ImageReader生成的非像素元数据内部结构(参见IIOTreeInfo)的ImageWriters。通过从ImageReader获取此数据并将其传递给使用此方法获取的ImageWriters之一,客户端程序可以读取图像,以某种方式修改它,并在保留所有元数据的同时将其写回,而无需了解任何关于元数据的内部结构,甚至关于图像格式的信息。

      返回:
      至少包含1个ImageWriterSpi名称的String数组,或null
      参见: