an be InputStream or RandomAccessFile ii.setDetermineImageNumber(true); // default is false ii.setCollectComments(true); // default is false if (!ii.check()) { System.err.println("Not a supported image file format."); return; } System.out.println(ii.getFormatName() + ", " + ii.getMimeType() + ", " + ii.getWidth() + " x " + ii.getHeight() + " pixels, " + ii.getBitsPerPixel() + " bits per pixel, " + ii.getNumberOfImages() + " image(s), " + ii.getNumberOfComments() + " comment(s)."); // there are other properties, check out the API documentation You can also use this class as a command line program. Call it with a number of image file names and URLs as parameters:
java ImageInfo *.jpg *.png *.gif http://somesite.tld/image.jpg
or call it without parameters and pipe data to it:
java ImageInfo < image.jpg
Known limitations:
- When the determination of the number of images is turned off, GIF bits per pixel are only read from the global header. For some GIFs, local palettes change this to a typically larger value. To be certain to get the correct color depth, call setDetermineImageNumber(true) before calling check(). The complete scan over the GIF file will take additional time.
- Transparency information is not included in the bits per pixel count. Actually, it was my decision not to include those bits, so it's a feature! ;-)
Requirements:
The latest version can be found at http://schmidt.devlib.org/image-info/.
Written by Marco Schmidt.
This class is contributed to the Public Domain. Use it at your own risk.
History:
- 2001-08-24 Initial version.
- 2001-10-13 Added support for the file formats BMP and PCX.
- 2001-10-16 Fixed bug in read(int[], int, int) that returned
- 2002-01-22 Added support for file formats Amiga IFF and Sun Raster (RAS).
- 2002-01-24 Added support for file formats Portable Bitmap / Graymap / Pixmap (PBM, PGM, PPM) and Adobe Photoshop (PSD). Added new method getMimeType() to return the MIME type associated with a particular file format.
- 2002-03-15 Added support to recognize number of images in file. Only works with GIF. Use {@link #setDetermineImageNumber} with
true
as argument to identify animated GIFs( {@link #getNumberOfImages()} will return a value larger than 1
). - 2002-04-10 Fixed a bug in the feature 'determine number of images in animated GIF' introduced with version 1.1. Thanks to Marcelo P. Lima for sending in the bug report. Released as 1.1.1.
- 2002-04-18 Added {@link #setCollectComments(boolean)}. That new method lets the user specify whether textual comments are to be stored in an internal list when encountered in an input image file / stream. Added two methods to return the physical width and height of the image in dpi: {@link #getPhysicalWidthDpi()} and {@link #getPhysicalHeightDpi()}. If the physical resolution could not be retrieved, these methods return
-1
. - 2002-04-23 Added support for the new properties physical resolution and comments for some formats. Released as 1.2.
- 2002-06-17 Added support for SWF, sent in by Michael Aird. Changed checkJpeg() so that other APP markers than APP0 will not lead to a failure anymore. Released as 1.3.
- 2003-07-28 Bug fix - skip method now takes return values into consideration. Less bytes than necessary may have been skipped, leading to flaws in the retrieved information in some cases. Thanks to Bernard Bernstein for pointing that out. Released as 1.4.
- 2004-02-29 Added support for recognizing progressive JPEG and interlaced PNG and GIF. A new method {@link #isProgressive()} returns whether ImageInfohas found that the storage type is progressive (or interlaced). Thanks to Joe Germuska for suggesting the feature. Bug fix: BMP physical resolution is now correctly determined. Released as 1.5.
- 2004-11-30 Bug fix: recognizing progressive GIFs (interlaced in GIF terminology) did not work (thanks to Franz Jeitler for pointing this out). Now it should work, but only if the number of images is determined. This is because information on interlacing is stored in a local image header. In theory, different images could be stored interlaced and non-interlaced in one file. However, I think that's unlikely. Right now, the last image in the GIF file that is examined by ImageInfo is used for the "progressive" status.
- 2005-01-02 Some code clean up (unused methods and variables commented out, missing javadoc comments, etc.). Thanks to George Sexton for a long list. Removed usage of Boolean.toString because it's a Java 1.4+ feature (thanks to Gregor Dupont). Changed delimiter character in compact output from semicolon to tabulator (for better integration with cut(1) and other Unix tools). Added some points to the 'Known issues' section of the website. Released as 1.6.
- 2005-07-26 Removed code to identify Flash (SWF) files. Has repeatedly led to problems and support requests, and I don't know the format and don't have the time and interest to fix it myself. I repeatedly included fixes by others which didn't work for some people. I give up on SWF. Please do not contact me about it anymore. Set package of ImageInfo class to org.devlib.schmidt.imageinfo (a package was repeatedly requested by some users). Released as 1.7.
- 2006-02-23 Removed Flash helper methods which weren't used elsewhere. Updated skip method which tries "read" whenever "skip(Bytes)" returns a result of 0. The old method didn't work with certain input stream types on truncated data streams. Thanks to Martin Leidig for reporting this and sending in code. Released as 1.8.
- 2006-11-13 Removed check that made ImageInfo report JPEG APPx markers smaller than 14 bytes as files in unknown format. Such JPEGs seem to be generated by Google's Picasa application. First reported with fix by Karl von Randow. Released as 1.9.
@author Marco Schmidt