The service provider interface (SPI) for ImageWriters. For more information on service provider classes, see the class comment for the IIORegistry class.

Each ImageWriterSpi provides several types of information about the ImageWriter class with which it is associated.

The name of the vendor who defined the SPI class and a brief description of the class are available via the getVendorName, getDescription, and getVersion methods. These methods may be internationalized to provide locale-specific output. These methods are intended mainly to provide short, human-writable information that might be used to organize a pop-up menu or other list.

Lists of format names, file suffixes, and MIME types associated with the service may be obtained by means of the getFormatNames, getFileSuffixes, and getMIMEType methods. These methods may be used to identify candidate ImageWriters for writing a particular file or stream based on manual format selection, file naming, or MIME associations.

A more reliable way to determine which ImageWriters are likely to be able to parse a particular data stream is provided by the canEncodeImage method. This methods allows the service provider to inspect the actual image contents.

Finally, an instance of the ImageWriter class associated with this service provider may be obtained by calling the createWriterInstance method. Any heavyweight initialization, such as the loading of native libraries or creation of large tables, should be deferred at least until the first invocation of this method.

Constructs an ImageWriterSpi with a given set of values.
Parameters
vendorNamethe vendor name, as a non-null String.
versiona version identifier, as a non-null String.
namesa non-null array of Strings indicating the format names. At least one entry must be present.
suffixesan array of Strings indicating the common file suffixes. If no suffixes are defined, null should be supplied. An array of length 0 will be normalized to null.
MIMETypesan array of Strings indicating the format's MIME types. If no suffixes are defined, null should be supplied. An array of length 0 will be normalized to null.
writerClassNamethe fully-qualified name of the associated ImageWriterSpi class, as a non-null String.
outputTypesan array of Class objects of length at least 1 indicating the legal output types.
readerSpiNamesan array Strings of length at least 1 naming the classes of all associated ImageReaders, or null. An array of length 0 is normalized to null.
supportsStandardStreamMetadataFormata boolean that indicates whether a stream metadata object can use trees described by the standard metadata format.
nativeStreamMetadataFormatNamea String, or null, to be returned from getNativeStreamMetadataFormatName.
nativeStreamMetadataFormatClassNamea String, or null, to be used to instantiate a metadata format object to be returned from getNativeStreamMetadataFormat.
extraStreamMetadataFormatNamesan array of Strings, or null, to be returned from getExtraStreamMetadataFormatNames. An array of length 0 is normalized to null.
extraStreamMetadataFormatClassNamesan array of Strings, or null, to be used to instantiate a metadata format object to be returned from getStreamMetadataFormat. An array of length 0 is normalized to null.
supportsStandardImageMetadataFormata boolean that indicates whether an image metadata object can use trees described by the standard metadata format.
nativeImageMetadataFormatNamea String, or null, to be returned from getNativeImageMetadataFormatName.
nativeImageMetadataFormatClassNamea String, or null, to be used to instantiate a metadata format object to be returned from getNativeImageMetadataFormat.
extraImageMetadataFormatNamesan array of Strings to be returned from getExtraImageMetadataFormatNames. An array of length 0 is normalized to null.
extraImageMetadataFormatClassNamesan array of Strings, or null, to be used to instantiate a metadata format object to be returned from getImageMetadataFormat. An array of length 0 is normalized to null.
Throws
IllegalArgumentExceptionif vendorName is null.
IllegalArgumentExceptionif version is null.
IllegalArgumentExceptionif names is null or has length 0.
IllegalArgumentExceptionif writerClassName is null.
IllegalArgumentExceptionif outputTypes is null or has length 0.
A single-element array, initially containing ImageInputStream.class, to be returned from getInputTypes.
Returns true if the ImageWriter implementation associated with this service provider is able to encode an image with the given layout. The layout (i.e., the image's SampleModel and ColorModel) is described by an ImageTypeSpecifier object.

A return value of true is not an absolute guarantee of successful encoding; the encoding process may still produce errors due to factors such as I/O errors, inconsistent or malformed data structures, etc. The intent is that a reasonable inspection of the basic structure of the image be performed in order to determine if it is within the scope of the encoding format. For example, a service provider for a format that can only encode greyscale would return false if handed an RGB BufferedImage. Similarly, a service provider for a format that can encode 8-bit RGB imagery might refuse to encode an image with an associated alpha channel.

Different ImageWriters, and thus service providers, may choose to be more or less strict. For example, they might accept an image with premultiplied alpha even though it will have to be divided out of each pixel, at some loss of precision, in order to be stored.

Parameters
typean ImageTypeSpecifier specifying the layout of the image to be written.
Return
true if this writer is likely to be able to encode images with the given layout.
Throws
IllegalArgumentExceptionif type is null.
Returns true if the ImageWriter implementation associated with this service provider is able to encode the given RenderedImage instance. Note that this includes instances of java.awt.image.BufferedImage.

See the discussion for canEncodeImage(ImageTypeSpecifier) for information on the semantics of this method.

Parameters
iman instance of RenderedImage to be encoded.
Return
true if this writer is likely to be able to encode this image.
Throws
IllegalArgumentExceptionif im is null.
Returns an instance of the ImageWriter implementation associated with this service provider. The returned object will initially be in an initial state as if its reset method had been called.

The default implementation simply returns createWriterInstance(null).

Return
an ImageWriter instance.
Throws
IOExceptionif an error occurs during loading, or initialization of the writer class, or during instantiation or initialization of the writer object.
Returns an instance of the ImageWriter implementation associated with this service provider. The returned object will initially be in an initial state as if its reset method had been called.

An Object may be supplied to the plug-in at construction time. The nature of the object is entirely plug-in specific.

Typically, a plug-in will implement this method using code such as return new MyImageWriter(this).

Parameters
extensiona plug-in specific extension object, which may be null.
Return
an ImageWriter instance.
Throws
IOExceptionif the attempt to instantiate the writer fails.
IllegalArgumentExceptionif the ImageWriter's constructor throws an IllegalArgumentException to indicate that the extension object is unsuitable.
Indicates whether some other object is "equal to" this one.

The equals method implements an equivalence relation on non-null object references:

  • It is reflexive: for any non-null reference value x, x.equals(x) should return true.
  • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
  • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
  • For any non-null reference value x, x.equals(null) should return false.

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

Parameters
objthe reference object with which to compare.
Return
true if this object is the same as the obj argument; false otherwise.
Returns the runtime class of an object. That Class object is the object that is locked by static synchronized methods of the represented class.
Return
The java.lang.Class object that represents the runtime class of the object. The result is of type {@code Class} where X is the erasure of the static type of the expression on which getClass is called.
Returns a brief, human-readable description of this service provider and its associated implementation. The resulting string should be localized for the supplied Locale, if possible.
Parameters
localea Locale for which the return value should be localized.
Return
a String containing a description of this service provider.
Returns an array of Strings containing the names of additional document formats, other than the native and standard formats, recognized by the getAsTree and setFromTree methods on the image metadata objects produced or consumed by this plug-in.

If the plug-in does not handle image metadata, null should be returned.

The set of formats may differ according to the particular images being read or written; this method should indicate all the additional formats supported by the plug-in under any circumstances.

The default implementation returns a clone of the extraImageMetadataFormatNames instance variable, which is typically set by the constructor.

Returns an array of Strings containing the names of additional document formats, other than the native and standard formats, recognized by the getAsTree and setFromTree methods on the stream metadata objects produced or consumed by this plug-in.

If the plug-in does not handle metadata, null should be returned.

The set of formats may differ according to the particular images being read or written; this method should indicate all the additional formats supported by the plug-in under any circumstances.

The default implementation returns a clone of the extraStreamMetadataFormatNames instance variable, which is typically set by the constructor.

Returns an array of Strings containing a list of file suffixes associated with the formats that are generally usable by the ImageReader or ImageWriter implementation associated with this service provider. For example, a single ImageReader might be able to process files with '.pbm' and '.pnm' suffixes, or both '.jpg' and '.jpeg' suffixes. If there are no known file suffixes, null will be returned.

Returning a particular suffix does not guarantee that files with that suffix can be processed; it merely indicates that it may be worthwhile attempting to decode or encode such files using this service provider.

Return
an array of Strings or length at least 1 containing common file suffixes associated with this reader or writer, or null.
Returns an array of Strings containing human-readable names for the formats that are generally usable by the ImageReader or ImageWriter implementation associated with this service provider. For example, a single ImageReader might be able to process both PBM and PNM files.
Return
a non-null array of Strings or length at least 1 containing informal format names associated with this reader or writer.
Returns an IIOMetadataFormat object describing the given image metadata format, or null if no description is available. The supplied name must be the native iamge metadata format name, the standard metadata format name, or one of those returned by getExtraImageMetadataFormatNames.
Parameters
formatNamethe desired image metadata format.
Return
an IIOMetadataFormat object.
Throws
IllegalArgumentExceptionif formatName is null or is not a supported name.
Returns an array of Strings containing all the fully qualified names of all the ImageReaderSpi classes that can understand the internal metadata representation used by the ImageWriter associated with this service provider, or null if there are no such ImageReaders specified. If a non-null value is returned, it must have non-zero length.

The first item in the array must be the name of the service provider for the "preferred" reader, as it will be used to instantiate the ImageReader returned by ImageIO.getImageReader(ImageWriter).

This mechanism may be used to obtain ImageReaders that will generated non-pixel meta-data (see IIOExtraDataInfo) in a structure understood by an ImageWriter. By reading the image and obtaining this data from one of the ImageReaders obtained with this method and passing it on to the ImageWriter, a client program can read an image, modify it in some way, and write it back out preserving all meta-data, without having to understand anything about the internal structure of the meta-data, or even about the image format.

Return
an array of Strings of length at least 1 containing names of ImageReaderSpis, or null.
Returns an array of Strings containing a list of MIME types associated with the formats that are generally usable by the ImageReader or ImageWriter implementation associated with this service provider.

Ideally, only a single MIME type would be required in order to describe a particular format. However, for several reasons it is necessary to associate a list of types with each service provider. First, many common image file formats do not have standard MIME types, so a list of commonly used unofficial names will be required, such as image/x-pbm and image/x-portable-bitmap. Some file formats have official MIME types but may sometimes be referred to using their previous unofficial designations, such as image/x-png instead of the official image/png. Finally, a single service provider may be capable of parsing multiple distinct types from the MIME point of view, for example image/x-xbitmap and image/x-xpixmap.

Returning a particular MIME type does not guarantee that files claiming to be of that type can be processed; it merely indicates that it may be worthwhile attempting to decode or encode such files using this service provider.

Return
an array of Strings or length at least 1 containing MIME types associated with this reader or writer, or null.
Returns the name of the "native" image metadata format for this plug-in, which typically allows for lossless encoding and transmission of the image metadata stored in the format handled by this plug-in. If no such format is supported, nullwill be returned.

The default implementation returns the nativeImageMetadataFormatName instance variable, which is typically set by the constructor.

Return
the name of the native image metadata format, or null.
Returns the name of the "native" stream metadata format for this plug-in, which typically allows for lossless encoding and transmission of the stream metadata stored in the format handled by this plug-in. If no such format is supported, nullwill be returned.

The default implementation returns the nativeStreamMetadataFormatName instance variable, which is typically set by the constructor.

Return
the name of the native stream metadata format, or null.
Returns an array of Class objects indicating what types of objects may be used as arguments to the writer's setOutput method.

For most writers, which only output to an ImageOutputStream, a single-element array containing ImageOutputStream.class should be returned.

Return
a non-null array of Classobjects of length at least 1.
Returns the fully-qualified class name of the ImageReader or ImageWriter plug-in associated with this service provider.
Return
the class name, as a non-null String.
Returns an IIOMetadataFormat object describing the given stream metadata format, or null if no description is available. The supplied name must be the native stream metadata format name, the standard metadata format name, or one of those returned by getExtraStreamMetadataFormatNames.
Parameters
formatNamethe desired stream metadata format.
Return
an IIOMetadataFormat object.
Throws
IllegalArgumentExceptionif formatName is null or is not a supported name.
Returns the name of the vendor responsible for creating this service provider and its associated implementation. Because the vendor name may be used to select a service provider, it is not localized.

The default implementation returns the value of the vendorName instance variable.

Return
a non-null String containing the name of the vendor.
Returns a string describing the version number of this service provider and its associated implementation. Because the version may be used by transcoders to identify the service providers they understand, this method is not localized.

The default implementation returns the value of the version instance variable.

Return
a non-null String containing the version of this service provider.
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

The general contract of hashCode is:

  • Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
  • It is not required that if two objects are unequal according to the method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

Return
a hash code value for this object.
Returns true if the format that this writer outputs preserves pixel data bit-accurately. The default implementation returns true.
Return
true if the format preserves full pixel accuracy.
Returns true if the ImageWriter object passed in is an instance of the ImageWriter associated with this service provider.
Parameters
writeran ImageWriter instance.
Return
true if writer is recognized
Throws
IllegalArgumentExceptionif writer is null.
Returns true if the standard metadata format is among the document formats recognized by the getAsTree and setFromTree methods on the image metadata objects produced or consumed by this plug-in.
Return
true if the standard format is supported for image metadata.
Returns true if the standard metadata format is among the document formats recognized by the getAsTree and setFromTree methods on the stream metadata objects produced or consumed by this plug-in.
Return
true if the standard format is supported for stream metadata.
Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. A thread waits on an object's monitor by calling one of the wait methods.

The awakened thread will not be able to proceed until the current thread relinquishes the lock on this object. The awakened thread will compete in the usual manner with any other threads that might be actively competing to synchronize on this object; for example, the awakened thread enjoys no reliable privilege or disadvantage in being the next thread to lock this object.

This method should only be called by a thread that is the owner of this object's monitor. A thread becomes the owner of the object's monitor in one of three ways:

  • By executing a synchronized instance method of that object.
  • By executing the body of a synchronized statement that synchronizes on the object.
  • For objects of type Class, by executing a synchronized static method of that class.

Only one thread at a time can own an object's monitor.

Throws
IllegalMonitorStateExceptionif the current thread is not the owner of this object's monitor.
Wakes up all threads that are waiting on this object's monitor. A thread waits on an object's monitor by calling one of the wait methods.

The awakened threads will not be able to proceed until the current thread relinquishes the lock on this object. The awakened threads will compete in the usual manner with any other threads that might be actively competing to synchronize on this object; for example, the awakened threads enjoy no reliable privilege or disadvantage in being the next thread to lock this object.

This method should only be called by a thread that is the owner of this object's monitor. See the notify method for a description of the ways in which a thread can become the owner of a monitor.

Throws
IllegalMonitorStateExceptionif the current thread is not the owner of this object's monitor.
A callback that will be whenever the Spi class has been deregistered from a ServiceRegistry.

Only the registry should call this method.

The default implementation does nothing.

A callback that will be called exactly once after the Spi class has been instantiated and registered in a ServiceRegistry. This may be used to verify that the environment is suitable for this service, for example that native libraries can be loaded. If the service cannot function in the environment where it finds itself, it should deregister itself from the registry.

Only the registry should call this method.

The default implementation does nothing.

Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
 
Return
a string representation of the object.
Causes current thread to wait until another thread invokes the method or the method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0).

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

As in the one argument version, interrupts and spurious wakeups are possible, and this method should always be used in a loop:

     synchronized (obj) {
         while (<condition does not hold>)
             obj.wait();
         ... // Perform action appropriate to condition
     }
 
This method should only be called by a thread that is the owner of this object's monitor. See the notify method for a description of the ways in which a thread can become the owner of a monitor.
Throws
IllegalMonitorStateExceptionif the current thread is not the owner of the object's monitor.
InterruptedExceptionif another thread interrupted the current thread before or while the current thread was waiting for a notification. The interrupted status of the current thread is cleared when this exception is thrown.
Causes current thread to wait until either another thread invokes the method or the method for this object, or a specified amount of time has elapsed.

The current thread must own this object's monitor.

This method causes the current thread (call it T) to place itself in the wait set for this object and then to relinquish any and all synchronization claims on this object. Thread T becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:

  • Some other thread invokes the notify method for this object and thread T happens to be arbitrarily chosen as the thread to be awakened.
  • Some other thread invokes the notifyAll method for this object.
  • Some other thread interrupts thread T.
  • The specified amount of real time has elapsed, more or less. If timeout is zero, however, then real time is not taken into consideration and the thread simply waits until notified.
The thread T is then removed from the wait set for this object and re-enabled for thread scheduling. It then competes in the usual manner with other threads for the right to synchronize on the object; once it has gained control of the object, all its synchronization claims on the object are restored to the status quo ante - that is, to the situation as of the time that the wait method was invoked. Thread T then returns from the invocation of the wait method. Thus, on return from the wait method, the synchronization state of the object and of thread T is exactly as it was when the wait method was invoked.

A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup. While this will rarely occur in practice, applications must guard against it by testing for the condition that should have caused the thread to be awakened, and continuing to wait if the condition is not satisfied. In other words, waits should always occur in loops, like this one:

     synchronized (obj) {
         while (<condition does not hold>)
             obj.wait(timeout);
         ... // Perform action appropriate to condition
     }
 
(For more information on this topic, see Section 3.2.3 in Doug Lea's "Concurrent Programming in Java (Second Edition)" (Addison-Wesley, 2000), or Item 50 in Joshua Bloch's "Effective Java Programming Language Guide" (Addison-Wesley, 2001).

If the current thread is interrupted by another thread while it is waiting, then an InterruptedException is thrown. This exception is not thrown until the lock status of this object has been restored as described above.

Note that the wait method, as it places the current thread into the wait set for this object, unlocks only this object; any other objects on which the current thread may be synchronized remain locked while the thread waits.

This method should only be called by a thread that is the owner of this object's monitor. See the notify method for a description of the ways in which a thread can become the owner of a monitor.

Parameters
timeoutthe maximum time to wait in milliseconds.
Throws
IllegalArgumentExceptionif the value of timeout is negative.
IllegalMonitorStateExceptionif the current thread is not the owner of the object's monitor.
InterruptedExceptionif another thread interrupted the current thread before or while the current thread was waiting for a notification. The interrupted status of the current thread is cleared when this exception is thrown.
Causes current thread to wait until another thread invokes the method or the method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.

This method is similar to the wait method of one argument, but it allows finer control over the amount of time to wait for a notification before giving up. The amount of real time, measured in nanoseconds, is given by:

 1000000*timeout+nanos

In all other respects, this method does the same thing as the method of one argument. In particular, wait(0, 0) means the same thing as wait(0).

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until either of the following two conditions has occurred:

  • Another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method.
  • The timeout period, specified by timeout milliseconds plus nanos nanoseconds arguments, has elapsed.

The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

As in the one argument version, interrupts and spurious wakeups are possible, and this method should always be used in a loop:

     synchronized (obj) {
         while (<condition does not hold>)
             obj.wait(timeout, nanos);
         ... // Perform action appropriate to condition
     }
 
This method should only be called by a thread that is the owner of this object's monitor. See the notify method for a description of the ways in which a thread can become the owner of a monitor.
Parameters
timeoutthe maximum time to wait in milliseconds.
nanosadditional time, in nanoseconds range 0-999999.
Throws
IllegalArgumentExceptionif the value of timeout is negative or the value of nanos is not in the range 0-999999.
IllegalMonitorStateExceptionif the current thread is not the owner of this object's monitor.
InterruptedExceptionif another thread interrupted the current thread before or while the current thread was waiting for a notification. The interrupted status of the current thread is cleared when this exception is thrown.