123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242 |
- /* ImageIO.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
- This file is part of GNU Classpath.
- GNU Classpath is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
- GNU Classpath is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNU Classpath; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301 USA.
- Linking this library statically or dynamically with other modules is
- making a combined work based on this library. Thus, the terms and
- conditions of the GNU General Public License cover the whole
- combination.
- As a special exception, the copyright holders of this library give you
- permission to link this library with independent modules to produce an
- executable, regardless of the license terms of these independent
- modules, and to copy and distribute the resulting executable under
- terms of your choice, provided that you also meet, for each linked
- independent module, the terms and conditions of the license of that
- module. An independent module is a module which is not derived from
- or based on this library. If you modify this library, you may extend
- this exception to your version of the library, but you are not
- obligated to do so. If you do not wish to do so, delete this
- exception statement from your version. */
- package javax.imageio;
- import java.awt.image.BufferedImage;
- import java.awt.image.RenderedImage;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Iterator;
- import javax.imageio.spi.IIORegistry;
- import javax.imageio.spi.ImageInputStreamSpi;
- import javax.imageio.spi.ImageOutputStreamSpi;
- import javax.imageio.spi.ImageReaderSpi;
- import javax.imageio.spi.ImageTranscoderSpi;
- import javax.imageio.spi.ImageWriterSpi;
- import javax.imageio.spi.ServiceRegistry;
- import javax.imageio.stream.ImageInputStream;
- import javax.imageio.stream.ImageOutputStream;
- import javax.imageio.stream.MemoryCacheImageInputStream;
- import javax.imageio.stream.MemoryCacheImageOutputStream;
- /**
- * An uninstantiable class that provides static methods for locating
- * and using image readers and writers.
- */
- public final class ImageIO
- {
- /**
- * Construct an ImageIO. Private since ImageIO is not instantiable.
- */
- private ImageIO()
- {
- }
- private static final class ReaderFormatFilter implements ServiceRegistry.Filter
- {
- private String formatName;
- public ReaderFormatFilter(String formatName)
- {
- this.formatName = formatName;
- }
- public boolean filter (Object provider)
- {
- if (provider instanceof ImageReaderSpi)
- {
- ImageReaderSpi spi = (ImageReaderSpi) provider;
- String[] formatNames = spi.getFormatNames();
- for (int i = formatNames.length - 1; i >= 0; --i)
- if (formatName.equals(formatNames[i]))
- return true;
- }
- return false;
- }
- }
- private static final class ReaderMIMETypeFilter implements ServiceRegistry.Filter
- {
- private String MIMEType;
- public ReaderMIMETypeFilter(String MIMEType)
- {
- this.MIMEType = MIMEType;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageReaderSpi)
- {
- ImageReaderSpi spi = (ImageReaderSpi) provider;
- String[] mimetypes = spi.getMIMETypes();
- for (int i = mimetypes.length - 1; i >= 0; --i)
- if (MIMEType.equals(mimetypes[i]))
- return true;
- }
- return false;
- }
- }
- private static final class ReaderObjectFilter implements ServiceRegistry.Filter
- {
- private Object object;
- public ReaderObjectFilter(Object object)
- {
- this.object = object;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageReaderSpi)
- {
- ImageReaderSpi spi = (ImageReaderSpi) provider;
- try
- {
- if (spi.canDecodeInput(object))
- return true;
- }
- catch (IOException e)
- {
- // Return false in this case
- }
- }
- return false;
- }
- }
- private static final class ReaderSuffixFilter implements ServiceRegistry.Filter
- {
- private String fileSuffix;
- public ReaderSuffixFilter(String fileSuffix)
- {
- this.fileSuffix = fileSuffix;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageReaderSpi)
- {
- ImageReaderSpi spi = (ImageReaderSpi) provider;
- String[] suffixes = spi.getFileSuffixes();
- for (int i = suffixes.length - 1; i >= 0; --i)
- if (fileSuffix.equals(suffixes[i]))
- return true;
- }
- return false;
- }
- }
- private static final class WriterFormatFilter implements ServiceRegistry.Filter
- {
- private String formatName;
- public WriterFormatFilter(String formatName)
- {
- this.formatName = formatName;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageWriterSpi)
- {
- ImageWriterSpi spi = (ImageWriterSpi) provider;
- String[] formatNames = spi.getFormatNames();
- for (int i = formatNames.length - 1; i >= 0; --i)
- if (formatName.equals(formatNames[i]))
- return true;
- }
- return false;
- }
- }
- private static final class WriterMIMETypeFilter implements ServiceRegistry.Filter
- {
- private String MIMEType;
- public WriterMIMETypeFilter(String MIMEType)
- {
- this.MIMEType = MIMEType;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageWriterSpi)
- {
- ImageWriterSpi spi = (ImageWriterSpi) provider;
- String[] mimetypes = spi.getMIMETypes();
- for (int i = mimetypes.length - 1; i >= 0; --i)
- if (MIMEType.equals(mimetypes[i]))
- return true;
- }
- return false;
- }
- }
- private static final class WriterSuffixFilter implements ServiceRegistry.Filter
- {
- private String fileSuffix;
- public WriterSuffixFilter(String fileSuffix)
- {
- this.fileSuffix = fileSuffix;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageWriterSpi)
- {
- ImageWriterSpi spi = (ImageWriterSpi) provider;
- String[] suffixes = spi.getFileSuffixes();
- for (int i = suffixes.length - 1; i >= 0; --i)
- if (fileSuffix.equals(suffixes[i]))
- return true;
- }
- return false;
- }
- }
- private static final class WriterObjectFilter implements ServiceRegistry.Filter
- {
- private ImageTypeSpecifier type;
- private String formatName;
- public WriterObjectFilter(ImageTypeSpecifier type,
- String formatName)
- {
- this.type = type;
- this.formatName = formatName;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageWriterSpi)
- {
- ImageWriterSpi spi = (ImageWriterSpi) provider;
- if (spi.canEncodeImage(type))
- {
- String[] formatNames = spi.getFormatNames();
- for (int i = formatNames.length - 1; i >= 0; --i)
- if (formatName.equals(formatNames[i]))
- return true;
- }
- }
- return false;
- }
- }
- private static final class TranscoderFilter implements ServiceRegistry.Filter
- {
- private ImageReader reader;
- private ImageWriter writer;
- public TranscoderFilter(ImageReader reader,
- ImageWriter writer)
- {
- this.reader = reader;
- this.writer = writer;
- }
- public boolean filter(Object provider)
- {
- if (provider instanceof ImageTranscoderSpi)
- {
- ImageTranscoderSpi spi = (ImageTranscoderSpi) provider;
- if (spi.getReaderServiceProviderName().equals
- (reader.getOriginatingProvider().getClass().getName())
- && spi.getWriterServiceProviderName().equals
- (writer.getOriginatingProvider().getClass().getName()))
- return true;
- }
- return false;
- }
- }
- private static final class ImageReaderIterator
- implements Iterator<ImageReader>
- {
- Iterator<ImageReaderSpi> it;
- Object readerExtension;
- public ImageReaderIterator(Iterator<ImageReaderSpi> it,
- Object readerExtension)
- {
- this.it = it;
- this.readerExtension = readerExtension;
- }
- public ImageReaderIterator(Iterator<ImageReaderSpi> it)
- {
- this.it = it;
- }
- public boolean hasNext()
- {
- return it.hasNext();
- }
- public ImageReader next()
- {
- try
- {
- ImageReaderSpi spi = it.next();
- return (readerExtension == null
- ? spi.createReaderInstance()
- : spi.createReaderInstance(readerExtension));
- }
- catch (IOException e)
- {
- return null;
- }
- }
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
- }
- private static final class ImageWriterIterator
- implements Iterator<ImageWriter>
- {
- Iterator<ImageWriterSpi> it;
- Object writerExtension;
- public ImageWriterIterator(Iterator<ImageWriterSpi> it,
- Object writerExtension)
- {
- this.it = it;
- this.writerExtension = writerExtension;
- }
- public ImageWriterIterator(Iterator<ImageWriterSpi> it)
- {
- this.it = it;
- }
- public boolean hasNext()
- {
- return it.hasNext();
- }
- public ImageWriter next()
- {
- try
- {
- ImageWriterSpi spi = it.next();
- return (writerExtension == null
- ? spi.createWriterInstance()
- : spi.createWriterInstance(writerExtension));
- }
- catch (IOException e)
- {
- return null;
- }
- }
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
- }
- private static File cacheDirectory;
- private static boolean useCache = true;
- private static Iterator<ImageReader> getReadersByFilter(Class<ImageReaderSpi> type,
- ServiceRegistry.Filter filter,
- Object readerExtension)
- {
- try
- {
- Iterator<ImageReaderSpi> it
- = getRegistry().getServiceProviders(type, filter, true);
- return new ImageReaderIterator(it, readerExtension);
- }
- catch (IllegalArgumentException e)
- {
- return Collections.EMPTY_SET.iterator();
- }
- }
- private static Iterator<ImageWriter> getWritersByFilter(Class<ImageWriterSpi> type,
- ServiceRegistry.Filter filter,
- Object writerExtension)
- {
- try
- {
- Iterator<ImageWriterSpi> it
- = getRegistry().getServiceProviders(type, filter, true);
- return new ImageWriterIterator(it, writerExtension);
- }
- catch (IllegalArgumentException e)
- {
- return Collections.EMPTY_SET.iterator();
- }
- }
- /**
- * Retrieve the current cache directory.
- *
- * @return the current cache directory or null if none is set.
- */
- public static File getCacheDirectory()
- {
- return cacheDirectory;
- }
- /**
- * Retrieve an iterator over all registered readers for the given
- * format.
- *
- * @param formatName an infomal format name (e.g. "jpeg" or "bmp")
- *
- * @return an iterator over a collection of image readers
- *
- * @exception IllegalArgumentException if formatName is null
- */
- public static Iterator<ImageReader> getImageReadersByFormatName(String formatName)
- {
- if (formatName == null)
- throw new IllegalArgumentException("formatName may not be null");
- return getReadersByFilter(ImageReaderSpi.class,
- new ReaderFormatFilter(formatName),
- formatName);
- }
- /**
- * Retrieve an iterator over all registered readers for the given
- * MIME type.
- *
- * @param MIMEType a MIME specification for an image type
- * (e.g. "image/jpeg" or "image/x-bmp")
- *
- * @return an iterator over a collection of image readers
- *
- * @exception IllegalArgumentException if MIMEType is null
- */
- public static Iterator<ImageReader> getImageReadersByMIMEType(String MIMEType)
- {
- if (MIMEType == null)
- throw new IllegalArgumentException("MIMEType may not be null");
- return getReadersByFilter(ImageReaderSpi.class,
- new ReaderMIMETypeFilter(MIMEType),
- MIMEType);
- }
- /**
- * Retrieve an iterator over all registered readers for the given
- * file suffix.
- *
- * @param fileSuffix an image file suffix (e.g. "jpg" or "bmp")
- *
- * @return an iterator over a collection of image readers
- *
- * @exception IllegalArgumentException if fileSuffix is null
- */
- public static Iterator<ImageReader> getImageReadersBySuffix(String fileSuffix)
- {
- if (fileSuffix == null)
- throw new IllegalArgumentException("formatName may not be null");
- return getReadersByFilter(ImageReaderSpi.class,
- new ReaderSuffixFilter(fileSuffix),
- fileSuffix);
- }
- /**
- * Retrieve an iterator over all registered writers for the given
- * format.
- *
- * @param formatName an infomal format name (e.g. "jpeg" or "bmp")
- *
- * @return an iterator over a collection of image writers
- *
- * @exception IllegalArgumentException if formatName is null
- */
- public static Iterator<ImageWriter> getImageWritersByFormatName(String formatName)
- {
- if (formatName == null)
- throw new IllegalArgumentException("formatName may not be null");
- return getWritersByFilter(ImageWriterSpi.class,
- new WriterFormatFilter(formatName),
- formatName);
- }
- /**
- * Retrieve an iterator over all registered writers for the given
- * MIME type.
- *
- * @param MIMEType a MIME specification for an image type
- * (e.g. "image/jpeg" or "image/x-bmp")
- *
- * @return an iterator over a collection of image writers
- *
- * @exception IllegalArgumentException if MIMEType is null
- */
- public static Iterator<ImageWriter> getImageWritersByMIMEType(String MIMEType)
- {
- if (MIMEType == null)
- throw new IllegalArgumentException("MIMEType may not be null");
- return getWritersByFilter(ImageWriterSpi.class,
- new WriterMIMETypeFilter(MIMEType),
- MIMEType);
- }
- /**
- * Retrieve an iterator over all registered writers for the given
- * file suffix.
- *
- * @param fileSuffix an image file suffix (e.g. "jpg" or "bmp")
- *
- * @return an iterator over a collection of image writers
- *
- * @exception IllegalArgumentException if fileSuffix is null
- */
- public static Iterator<ImageWriter> getImageWritersBySuffix(String fileSuffix)
- {
- if (fileSuffix == null)
- throw new IllegalArgumentException("fileSuffix may not be null");
- return getWritersByFilter(ImageWriterSpi.class,
- new WriterSuffixFilter(fileSuffix),
- fileSuffix);
- }
- /**
- * Retrieve all the informal format names supported by the
- * collection of registered image readers.
- *
- * @return an array of format names
- */
- public static String[] getReaderFormatNames()
- {
- try
- {
- Iterator it =
- getRegistry().getServiceProviders(ImageReaderSpi.class, true);
- ArrayList result = new ArrayList();
- while (it.hasNext())
- {
- ImageReaderSpi spi = (ImageReaderSpi) it.next();
- String[] names = spi.getFormatNames();
- for (int i = names.length - 1; i >= 0; --i)
- result.add(names[i]);
- }
- return (String[]) result.toArray(new String[result.size()]);
- }
- catch (IllegalArgumentException e)
- {
- return new String[0];
- }
- }
- /**
- * Retrieve all the MIME types supported by the collection of
- * registered image readers.
- *
- * @return an array of MIME types
- */
- public static String[] getReaderMIMETypes()
- {
- try
- {
- Iterator it =
- getRegistry().getServiceProviders(ImageReaderSpi.class, true);
- ArrayList result = new ArrayList();
- while (it.hasNext())
- {
- ImageReaderSpi spi = (ImageReaderSpi) it.next();
- String[] names = spi.getMIMETypes();
- for (int i = names.length - 1; i >= 0; --i)
- result.add(names[i]);
- }
- return (String[]) result.toArray(new String[result.size()]);
- }
- catch (IllegalArgumentException e)
- {
- return new String[0];
- }
- }
- private static IIORegistry getRegistry()
- {
- return IIORegistry.getDefaultInstance();
- }
- /**
- * Check whether or not an on-disk cache is used for image input and
- * output streams.
- *
- * @return true if an on-disk cache is available, false otherwise
- */
- public static boolean getUseCache()
- {
- return useCache;
- }
- /**
- * Retrieve all the informal format names supported by the
- * collection of registered image writers.
- *
- * @return an array of format names
- */
- public static String[] getWriterFormatNames()
- {
- try
- {
- Iterator it =
- getRegistry().getServiceProviders(ImageWriterSpi.class, true);
- ArrayList result = new ArrayList();
- while (it.hasNext())
- {
- ImageWriterSpi spi = (ImageWriterSpi) it.next();
- String[] names = spi.getFormatNames();
- for (int i = names.length - 1; i >= 0; --i)
- result.add(names[i]);
- }
- return (String[]) result.toArray(new String[result.size()]);
- }
- catch (IllegalArgumentException e)
- {
- return new String[0];
- }
- }
- /**
- * Retrieve all the MIME types supported by the collection of
- * registered image writers.
- *
- * @return an array of MIME types
- */
- public static String[] getWriterMIMETypes()
- {
- try
- {
- Iterator it =
- getRegistry().getServiceProviders(ImageWriterSpi.class, true);
- ArrayList result = new ArrayList();
- while (it.hasNext())
- {
- ImageWriterSpi spi = (ImageWriterSpi) it.next();
- String[] names = spi.getMIMETypes();
- for (int i = names.length - 1; i >= 0; --i)
- result.add(names[i]);
- }
- return (String[]) result.toArray(new String[result.size()]);
- }
- catch (IllegalArgumentException e)
- {
- return new String[0];
- }
- }
- /**
- * Rescans the application classpath for ImageIO service providers
- * and registers them.
- */
- public static void scanForPlugins()
- {
- IIORegistry.getDefaultInstance().registerApplicationClasspathSpis();
- }
- /**
- * Set the directory to be used for caching image data. A null
- * argument means to use the default system temporary directory.
- * This cache directory is only used if getUseCache returns true.
- *
- * @param cacheDirectory the directory where image data should be
- * cached
- *
- * @exception IllegalArgumentException if cacheDirectory is not a
- * directory
- */
- public static void setCacheDirectory(File cacheDirectory)
- {
- // FIXME: add SecurityManager call
- if (cacheDirectory != null)
- {
- if (!cacheDirectory.isDirectory())
- throw new IllegalArgumentException("cacheDirectory must be a directory");
- cacheDirectory.canWrite();
- }
- ImageIO.cacheDirectory = cacheDirectory;
- }
- /**
- * Control whether or not an on-disk cache is used. This cache is
- * used to store input or output data from an image data stream when
- * data in the stream needs to be re-processed.
- *
- * If useCache is false the cache will be stored in memory. Doing
- * so eliminates file creation and deletion overhead. The default
- * is to use an on-disk cache.
- *
- * @param useCache true to use an on-disk cache, false otherwise
- */
- public static void setUseCache(boolean useCache)
- {
- ImageIO.useCache = useCache;
- }
- /**
- * Write an image to a file using a registered writer that supports
- * the given format, overwriting the file if it already exists.
- *
- * @param im the image data to write
- * @param formatName an informal description of the output format
- * @param output the file to which the image will be written
- *
- * @return false if no registered writer supports the given format,
- * true otherwise
- *
- * @exception IllegalArgumentException if any argument is null
- * @exception IOException if a writing error occurs
- */
- public static boolean write(RenderedImage im,
- String formatName,
- File output)
- throws IOException
- {
- if (im == null || formatName == null || output == null)
- throw new IllegalArgumentException ("null argument");
- return write(im, formatName, new FileOutputStream(output));
- }
- /**
- * Write an image to an output stream using a registered writer that
- * supports the given format.
- *
- * @param im the image data to write
- * @param formatName an informal description of the output format
- * @param output the output stream to which the image will be
- * written
- *
- * @return false if no registered writer supports the given format,
- * true otherwise
- *
- * @exception IllegalArgumentException if any argument is null
- * @exception IOException if a writing error occurs
- */
- public static boolean write(RenderedImage im,
- String formatName,
- OutputStream output)
- throws IOException
- {
- if (im == null || formatName == null || output == null)
- throw new IllegalArgumentException ("null argument");
- return write(im, formatName, new MemoryCacheImageOutputStream(output));
- }
- /**
- * Write an image to an ImageOutputStream using a registered writer
- * that supports the given format. Image data is written starting
- * at the ImageOutputStream's current stream pointer, overwriting
- * any existing data.
- *
- * @param im the image data to write
- * @param formatName an informal description of the output format
- * @param output the image output stream to which the image will be
- * written
- *
- * @return false if no registered writer supports the given format,
- * true otherwise
- *
- * @exception IllegalArgumentException if any argument is null
- * @exception IOException if a writing error occurs
- */
- public static boolean write(RenderedImage im,
- String formatName,
- ImageOutputStream output)
- throws IOException
- {
- if (im == null || formatName == null || output == null)
- throw new IllegalArgumentException ("null argument");
- Iterator writers = getImageWritersByFormatName(formatName);
- IIOImage img = new IIOImage(im, null, null);
- while (writers.hasNext())
- {
- ImageWriter w = (ImageWriter) writers.next();
- try
- {
- w.setOutput(output);
- }
- catch (IllegalArgumentException e)
- {
- continue;
- }
- w.write(null, img, null);
- w.dispose();
- output.close();
- return true;
- }
- return false;
- }
- /**
- * Create a buffered image from an image input stream. An image
- * reader that supports the given image data is automatically
- * selected from the collection of registered readers. If no
- * registered reader can handle the input format, null is returned.
- *
- * @param stream the image input stream from which to read image
- * data
- *
- * @return a new buffered image created from the given image data,
- * or null
- *
- * @exception IllegalArgumentException if stream is null
- * @exception IOException if a reading error occurs
- */
- public static BufferedImage read(ImageInputStream stream)
- throws IOException
- {
- if (stream == null)
- throw new IllegalArgumentException("null argument");
- Iterator providers = getRegistry().getServiceProviders(ImageReaderSpi.class, true);
- while (providers.hasNext())
- {
- ImageReaderSpi spi = (ImageReaderSpi) providers.next();
- if (spi.canDecodeInput(stream))
- {
- ImageReader reader = spi.createReaderInstance();
- reader.setInput(stream);
- return reader.read(0, null);
- }
- }
- return null;
- }
- /**
- * Create a buffered image from a URL. An image reader that
- * supports the given image data is automatically selected from the
- * collection of registered readers. If no registered reader can
- * handle the input format, null is returned.
- *
- * The image data will be cached in the current cache directory if
- * caching is enabled.
- *
- * This method does not locate readers that read data directly from
- * a URL. To locate such readers manually, use IIORegistry and
- * ImageReaderSpi.
- *
- * @param input the URL from which to retrieve the image file
- *
- * @return a new buffered image created from the given image URL, or
- * null
- *
- * @exception IllegalArgumentException if input is null
- * @exception IOException if a reading error occurs
- */
- public static BufferedImage read(URL input)
- throws IOException
- {
- if (input == null)
- throw new IllegalArgumentException("null argument");
- return read(input.openStream());
- }
- /**
- * Create a buffered image from an input stream. An image reader
- * that supports the given image data is automatically selected from
- * the collection of registered readers. If no registered reader
- * can handle the input format, null is returned.
- *
- * The image data will be cached in the current cache directory if
- * caching is enabled.
- *
- * This method does not locate readers that read data directly from
- * an input stream. To locate such readers manually, use
- * IIORegistry and ImageReaderSpi.
- *
- * @param input the input stream from which to read the image data
- *
- * @return a new buffered image created from the given input stream,
- * or null
- *
- * @exception IllegalArgumentException if input is null
- * @exception IOException if a reading error occurs
- */
- public static BufferedImage read(InputStream input)
- throws IOException
- {
- if (input == null)
- throw new IllegalArgumentException("null argument");
- return read(new MemoryCacheImageInputStream(input));
- }
- /**
- * Create a buffered image from a file. An image reader that
- * supports the given image data is automatically selected from the
- * collection of registered readers. If no registered reader can
- * handle the input format, null is returned.
- *
- * The image data will be cached in the current cache directory if
- * caching is enabled.
- *
- * This method does not locate readers that read data directly from
- * a file. To locate such readers manually, use IIORegistry and
- * ImageReaderSpi.
- *
- * @param input the file from which to read image data
- *
- * @return a new buffered image created from the given image file,
- * or null
- *
- * @exception IllegalArgumentException if input is null
- * @exception IOException if a reading error occurs
- */
- public static BufferedImage read(File input)
- throws IOException
- {
- if (input == null)
- throw new IllegalArgumentException("null argument");
- return read(new FileInputStream(input));
- }
- /**
- * Create an image input stream from the given object. The
- * collection of ImageInputStreamSpis registered with the
- * IIORegistry is searched for an image input stream that can take
- * input from the given object. null is returned if no such SPI is
- * registered.
- *
- * The image data will be cached in the current cache directory if
- * caching is enabled.
- *
- * @param input an object from which to read image data
- *
- * @return an ImageInputStream that can read data from input, or
- * null
- *
- * @exception IllegalArgumentException if input is null
- * @exception IOException if caching is required but not enabled
- */
- public static ImageInputStream createImageInputStream (Object input)
- throws IOException
- {
- if (input == null)
- throw new IllegalArgumentException ("null argument");
- Iterator spis = getRegistry().getServiceProviders
- (ImageInputStreamSpi.class, true);
- ImageInputStreamSpi foundSpi = null;
- while(spis.hasNext())
- {
- ImageInputStreamSpi spi = (ImageInputStreamSpi) spis.next();
- if (input.getClass().equals(spi.getInputClass()))
- {
- foundSpi = spi;
- break;
- }
- }
- return foundSpi == null ? null :
- foundSpi.createInputStreamInstance (input,
- getUseCache(),
- getCacheDirectory());
- }
- /**
- * Create an image output stream from the given object. The
- * collection of ImageOutputStreamSpis registered with the
- * IIORegistry is searched for an image output stream that can send
- * output to the given object. null is returned if no such SPI is
- * registered.
- *
- * The image data will be cached in the current cache directory if
- * caching is enabled.
- *
- * @param output an object to which to write image data
- *
- * @return an ImageOutputStream that can send data to output, or
- * null
- *
- * @exception IllegalArgumentException if output is null
- * @exception IOException if caching is required but not enabled
- */
- public static ImageOutputStream createImageOutputStream (Object output)
- throws IOException
- {
- if (output == null)
- throw new IllegalArgumentException ("null argument");
- Iterator spis = getRegistry().getServiceProviders
- (ImageOutputStreamSpi.class, true);
- ImageOutputStreamSpi foundSpi = null;
- while(spis.hasNext())
- {
- ImageOutputStreamSpi spi = (ImageOutputStreamSpi) spis.next();
- if (output.getClass().equals(spi.getOutputClass()))
- {
- foundSpi = spi;
- break;
- }
- }
- return foundSpi == null ? null :
- foundSpi.createOutputStreamInstance (output,
- getUseCache(),
- getCacheDirectory());
- }
- /**
- * Retrieve an image reader corresponding to an image writer, or
- * null if writer is not registered or if no corresponding reader is
- * registered.
- *
- * @param writer a registered image writer
- *
- * @return an image reader corresponding to writer, or null
- *
- * @exception IllegalArgumentException if writer is null
- */
- public static ImageReader getImageReader (ImageWriter writer)
- {
- if (writer == null)
- throw new IllegalArgumentException ("null argument");
- ImageWriterSpi spi = writer.getOriginatingProvider();
- String[] readerSpiNames = spi.getImageReaderSpiNames();
- ImageReader r = null;
- if (readerSpiNames != null)
- {
- try
- {
- Class readerClass = Class.forName (readerSpiNames[0]);
- r = (ImageReader) readerClass.newInstance ();
- }
- catch (Exception e)
- {
- return null;
- }
- }
- return r;
- }
- /**
- * Retrieve an iterator over the collection of registered image
- * readers that support reading data from the given object.
- *
- * @param input the object for which to retrieve image readers
- *
- * @return an iterator over a collection of image readers
- */
- public static Iterator<ImageReader> getImageReaders (Object input)
- {
- if (input == null)
- throw new IllegalArgumentException ("null argument");
- Iterator<ImageReaderSpi> spiIterator
- = getRegistry().getServiceProviders (ImageReaderSpi.class,
- new ReaderObjectFilter(input),
- true);
- return new ImageReaderIterator(spiIterator);
- }
- /**
- * Retrieve an iterator over the collection of registered image
- * writers that support writing images of the given type and in the
- * given format.
- *
- * @param type the output image's colour and sample models
- * @param formatName the output image format
- *
- * @return an iterator over a collection of image writers
- */
- public static Iterator<ImageWriter> getImageWriters (ImageTypeSpecifier type,
- String formatName)
- {
- if (type == null || formatName == null)
- throw new IllegalArgumentException ("null argument");
- final Iterator<ImageWriterSpi> spiIterator
- = getRegistry().getServiceProviders (ImageWriterSpi.class,
- new WriterObjectFilter(type,
- formatName),
- true);
- return new ImageWriterIterator(spiIterator);
- }
- /**
- * Retrieve an image writer corresponding to an image reader, or
- * null if reader is not registered or if no corresponding writer is
- * registered. This method is useful for preserving metadata
- * without needing to understand its format, since the returned
- * writer will be able to write, unchanged, the metadata passed to
- * it by the reader.
- *
- * @param reader a registered image reader
- *
- * @return an image writer corresponding to reader, or null
- *
- * @exception IllegalArgumentException if reader is null
- */
- public static ImageWriter getImageWriter (ImageReader reader)
- {
- if (reader == null)
- throw new IllegalArgumentException ("null argument");
- ImageReaderSpi spi = reader.getOriginatingProvider();
- String[] writerSpiNames = spi.getImageWriterSpiNames();
- ImageWriter w = null;
- if (writerSpiNames != null)
- {
- try
- {
- Class writerClass = Class.forName (writerSpiNames[0]);
- w = (ImageWriter) writerClass.newInstance ();
- }
- catch (Exception e)
- {
- return null;
- }
- }
- return w;
- }
- /**
- * Retrieve an iterator over a collection of image transcoders that
- * support transcoding from the given image reader's metadata format
- * to the given writer's metadata format.
- *
- * @param reader an image reader
- * @param writer an image writer
- *
- * @return an iterator over a collection of image transcoders
- *
- * @exception IllegalArgumentException if either reader or writer is
- * null
- */
- public static Iterator<ImageTranscoder> getImageTranscoders (ImageReader reader,
- ImageWriter writer)
- {
- if (reader == null || writer == null)
- throw new IllegalArgumentException ("null argument");
- final Iterator<ImageTranscoderSpi> spiIterator
- = getRegistry().getServiceProviders (ImageTranscoderSpi.class,
- new TranscoderFilter (reader,
- writer),
- true);
- return new Iterator<ImageTranscoder>()
- {
- public boolean hasNext()
- {
- return spiIterator.hasNext();
- }
- public ImageTranscoder next()
- {
- return spiIterator.next().createTranscoderInstance();
- }
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
- };
- }
- }
|