CONTENTS | PREV | NEXT |
As a general rule of thumb, whenever a tradeoff between ease of use for application developers and plug-in developers was identified, the application developer was given a higher priority. Since relatively few users of the API are expected to write plug-ins, and even those developers who do write plug-ins will typically write no more than a handful in order to support formats of immediate use to them, it makes sense to push complexity into the plug-ins rather than into applications.
To ameliorate the complexity of plug-in development, some utility methods and implementation classes are provided that perform common functions. However, it is not possible to provide implementation classes to cover every situation, and providing an excessive number of utility classes and methods would increase the footprint for all API users even if they did not use non-standard plug-ins. We expect that plug-in developers will be able to incorporate source code from existing plug-ins and sample code into their plug-ins. While this might lead to some redundancy when using multiple, independently developed plug-ins, most users will probably use only a small number of plug-ins at a time in any case. Thus, we believe the cost of having to load code that might theoretically be shared but actually is not will tend to outweight the cost of loading some redundant code when many plug-ins are used.
Both generic and plug-in specific access to metadata (non-image data) is supported by allowing plug-ins to provide access to metadata in multiple formats. These may include plug-in specific formats, a plug-in neutral format defined by the API, and industry standard formats.
Automatic and Manual Plug-in Installation and Selection For simple applications that wish to load images without user intervention, it is important to allow a reader plug-in to be selected automatically based on file contents. However, it is desirable to avoid the loading and instantiation of complex classes unless they are needed. A plug-in must be able to determine whether it can handle a particular image without loading all of its code. In order to meet this goal, plug-ins are instantiated via a service provider interface mechanism that allows simple queries to be performed without loading the main body of plug-in code. All of the bytecode (.class) files
associated with a plug-in may be combined into a JAR file, which
may be installed permanently into a Java Runtime Environment, or
loaded dynamically using the application CLASSPATH
mechanism.
InputStream
due to the needs of other APIs. The Image I/O API offers a set of
interfaces that allow data from File
s,
InputStream
s, or other sources to be handled in a
unified manner while preserving the ability to seek backwards and
forwards. The API is future-proofed to allow new I/O interfaces,
including direct interfaces to image acquisition and output
devices, to be used without rewriting application code. Access to Metadata The metadata stored alongside an image may be
as important as the image data. The Java Image I/O API provides
thorough yet flexible access to metadata. Since metadata may take
many forms, and contain very specialized information, it is
difficult to provide direct access to such metadata in a
general-purpose API. Instead, the API requires plug-ins to cast
their metadata into the form of an XML Document structure, possibly
enhanced with Object
references in addition to textual
data. Once this has been done, the metadata may be accessed and
edited using standard XML DOM (Document Object Model) interfaces.
The syntax of the Document
s will vary from plug-in to
plug-in, but the structure may be traversed, displayed, and edited
without specific knowledge of the plug-in being used. Support for Advanced
Applications In order to
support advanced applications, the API must provide access to
features such as "thumbnail" images, multiple images stored
in a file, muli-resolution imagery, and tiled imagery. It must
provide the capability to decode portions of a larger image, and to
perform subsampling during decoding in order to allow panning over
very large images. When writing images, it must be possible to
write image data piece-by-piece, without storing the entire image
in memory at once.In many cases, image content must be generated dynamically. For example, consider supplying stock price charts. While it might be possible to generate and store a limited set of charts for each listed stock in advance, if the user is allowed to add customizations such as the time interval over which the price should be displayed, or a set of indices or other stocks against which the stock price should be compared, the number of possible images grows exponentially. Only a dynamic approach can possibly allow such customization.
Image Customization Web images are typically one-size-fits-all, with the same image data being delivered regardless of the display capabilities of the receiver. The increasing use of wireless and handheld devices will require images that are customized for their limited bandwidth and display capabilities. Desktop computers have seen increases in their display resolution, causing many web images to appear too small. The lack of scalable images also causes problems for visually impaired users. Server-side image customization can be used to provide optimal images for all users, with the image resolution and color characteristics being chosen based on user preferences.