
Apache Commons Imaging
Version 1.0
Release Notes

INTRODUCTION

Apache Commons Imaging is a pure-Java image library for reading and writing
a variety of image formats.

For complete information on Commons Imaging, including sample code,
instructions on how to submit bug reports, patches, or suggestions for
improvement, see the Apache Commons Net website:

http://commons.apache.org/imaging/

Please note that the project was previously known as Apache Sanselan,
and has been renamed to Apache Commons Imaging. As part of this rename:

 * the package changed to
     org.apache.commons.imaging
   from
     org.apache.sanselan

 * the main class is now
     org.apache.commons.imaging.Imaging
   and not
     org.apache.sanselan.Sanselan

 * the Maven coordinates are now:
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-imaging</artifactId>
     <name>Commons Imaging</name>
   instead of the old:
     <groupId>org.apache.sanselan</groupId>
     <artifactId>sanselan</artifactId>
     <name>Apache Sanselan</name>

 * the website is
     http://commons.apache.org/imaging
   and not
     http://commons.apache.org/sanselan

 * etc.

VERSION HISTORY

Release 1.0
------------
24 November 2013

Changes in this version include:

New features:
o IMAGING-75:  Added accessor methods for a number of ImageInfo properties. 
o IMAGING-71:  Applied patch contributed by Nicolas Richeton, adding getEXIFThumbnailSize() and getEXIFThumbnailData() methods to JpegImageMetadata. Thanks to Nicolas Richeton. 
o IMAGING-56:  Add support for the ICNS icon format. Thanks to damjan. 
o IMAGING-58:  Add support for PCX, DCX, WBMP, XBM and XPM images. 
o IMAGING-64:  Add support for TIFF files with compression=2, (CCITT Group 3 1-Dimensional Modified Huffman run length encoding). 
o IMAGING-77:  Add a type-safe high-level API for writing TIFF fields. 
o IMAGING-51:  Add TagInfoXpText for fields like XPTITLE, and encode/decode it using UTF-16LE like Windows does. 
o IMAGING-60:  Added support for reading the RGBE / Radiance HDR image format. Thanks to proyal. 
o IMAGING-68:  Add a field to IptcRecord that contains its raw bytes, and a getter for this value. 
o IMAGING-73:  Provide a way to write EXIF data into files using Sanselan.writeImage(). 
o IMAGING-47:  Run a Findbugs analysis on "mvn site". Also audit and fix resource leaks. Thanks to adrian2k7. 
o IMAGING-65:  Provide a way to write the pixel density (DPI) into an image. 
o IMAGING-61:  Include a test utility for timing and memory in project example classes. Thanks to gwlucas. 
o IMAGING-81:  Add more Javadoc to main package. Thanks to gwlucas. 
o IMAGING-89:  Detect the YCCK color space/type in JPEG files' APP14 segment. 
o IMAGING-94:  Add ability to load partial TIFF images Thanks to gwlucas. 

Fixed Bugs:
o IMAGING_121:  Null Pointer exception while extracting metadata for CR2 image. Thanks to Piyush Kapoor. 
o IMAGING-115:  DhtSegment class contains mutable public arrays. 
o IMAGING-117:  SofnSegment.components - public mutable array. 
o IMAGING-116:  GenericSegment.bytes - public mutable array. 
o IMAGING-118:  interface RgbeConstants contains mutable array. 
o IMAGING-114:  ComSegment.comment is a public final byte array. 
o IMAGING-109:  Several files contain non-UTF8 characters. 
o IMAGING-113:  Cannot read multipage tiff. 
o IMAGING-108:  JPEG EOI marker could not be found at expected location. 
o IMAGING-101:  GIF dimensions transposed. Thanks to Colm O hEigeartaigh. 
o IMAGING-23:  JpegXMPWriter throws NullPointerException. 
o IMAGING-74:  Fixed a couple of platform-dependent paths in the tests.
        Constantized the magic numbers used when guessing formats.  
        Added a test for the format guessing. 
o IMAGING-2:  SanselanGuessFormatTest and SanselanTestConstants use Java 1.5 method String.replace(CharSequence, CharSequence). 
o IMAGING-80:  Sanselan tests fail on Windows. 
o IMAGING-18:  Fix for "JpegImageMetadata getEXIFThumbnail only works on Jpeg thumbnails stored as Tiff images" issue.
        Jpeg thumbnails are read using ImageIO. Thanks to James E-J. 
o IMAGING-48:  JpegImageMetadata getEXIFThumbnail may raise a null pointer exception. 
o IMAGING-52:  Implement dumpImageFile for ICO files and fix a typo. Thanks to damjan. 
o IMAGING-12:  Tiff (exif) tags of type double written in wrong byte order. Thanks to gwlucas. 
o IMAGING-30:  The isTransparent flag is not set on transparent PNGs. Thanks to clement.escoffier. 
o IMAGING-11:  Ignore TIFF entries that have invalid offsets and/or lengths when we are not in strict mode. 
o IMAGING-78:  readDirectory method in TiffReader doesn't gracefully handle exceptions that can be thrown from ByteSource implementations. 
o IMAGING-24:  Search all tags instead of just EXIF tags when parsing TIFF metadata tags, and try to match on directory type as well. 
o IMAGING-21:  Don't allow very large TIFF lengths to be interpreted as negative because they have the highest order bit set. 
o IMAGING-50:  Make JPEG parsing highly resilient: skip all bytes after the end of a segment until the next segment (0xFF followed by non-0xFF). 
o IMAGING-16:  Fix reading ASCII tags in TIFF files. 
o IMAGING-3:  Ignore string differences in our tests when 7 bit unclean TIFF string are copied. 
o IMAGING-41:  Don't redefine BYTE_ORDER_BIG_ENDIAN and BYTE_ORDER_LITTLE_ENDIAN in UnicodeMetricsUTF16. 
o IMAGING-35:  Fixed issue "FieldTypeASCII does not conform to the EXIF specification," identified by Libor Nenadál. 
o IMAGING-31:  Fixed a bug in which gifs have incorrect size information in the the Logical Screen Descriptor.
        This appears to be a bug in how Microsoft Office writes gifs. The Image Descriptor has the correct value. 
o IMAGING-13:  Added checks in ByteSource's getBlock() methods for invalid params. 
o IMAGING-46:  Fixed a possible NPE in Sanselan.getICCProfile pointed out by Jon Weygandt. 
o IMAGING-76:  Improve ICO file support. Thanks to damjan. 
o IMAGING-49:  Preserve the byte range occupied by the Maker Notes, so rewriting it doesn't corrupt it. 
o IMAGING-29:  Read in the full IPTC block before trying to ignore it, so we don't lose our position in the stream. Thanks to alexvigdor. 
o IMAGING-45:  Fix the GIF BitsPerPixel formula in GifImageParser's getImageInfo(). Thanks to pkapoor. 
o IMAGING-39:  Fix various problems with reading and writing EXIF tags. 
o IMAGING-22:  Eliminate or hide public mutable final arrays in the API. 
o IMAGING-43:  If the TIFF rows per strip is not present, assume it is the image length. Thanks to pkapoor. 
o IMAGING-17:  Make BitInputStream sensitive to byte order. Allows 48 BPP TIFF files to load. Thanks to pkapoor. 
o IMAGING-38:  Fix the PhysicalWidthDpi calculation for JPEG images. Thanks to tjoris. 
o IMAGING-19:  Fix reading DPI for TIFF files. Thanks to vvd. 
o IMAGING-44:  Fix reading DPI for PNG files. Thanks to vvd. 
o IMAGING-40:  Add the Software TIFF tag, and get the byte order after reading the first TIFF directory. Thanks to pkapoor. 
o IMAGING-6:  Correct the expected size of the decompressed TIFF image data, and improve sample depth scaling for PNG images. 
o IMAGING-15:  Stop JpegImageMetadata from throwing NPE if the exif field is null. Thanks to pkapoor. 
o IMAGING-67:  Speed up reading paletted TIFF files. Thanks to gwlucas. 
o IMAGING-8:  Allow TIFF fields to change size during encoding. Fix a broken test that assumes they never do. 
o IMAGING-36:  Fix sample usage links on the website. 
o IMAGING-70:  Reduce memory usage when reading TIFF files. Thanks to gwlucas. 
o IMAGING-33:  Fixed the differencing predictor for tiled TIFF images. 
o IMAGING-5:  Update website, fix some broken links and remove old code. 
o IMAGING-69:  Add a streamlined TIFF reader that reduces load time by a factor of 5. Thanks to gwlucas. 
o IMAGING-82:  Fix BMP width and height DPI. Thanks to pkapoor. 
o IMAGING-86:  Fix the lengths for DateTimeOriginal and DateTimeDigitized TIFF/EXIF tags. 
o IMAGING-88:  Method lowerBound in org.apache.commons.imaging.common.itu_t4.T4AndT6Compression has a division error. Thanks to craigkelly. 
o IMAGING-92:  Issue trying to update GPS metadata info in a JPG. Thanks to hmarmy. 
o IMAGING-93:  Tiled TIFF images do not correctly load partial tiles. Thanks to gwlucas. 
o IMAGING-90:  Allow non-1 TIFF field lengths when parsing offset fields in non-strict mode. 
o IMAGING-99:  java.io.IOException: Could not read block Thanks to st.h. 

Changes:
o IMAGING-91:  ByteSourceInputStream.streamLength could be a long. 
o IMAGING-95:  Some tiff processing takes very long. Thanks to amitgupt. 

Minimum Java version: 1.5
Compatibility with 0.97:
  Binary compatible: No.
  Source compatible: No.
  Semantic compatible: No.


Release 0.97
------------
	
 * Rewrote the info.txt files for many images in the sample image library to clarify contribution to project.
 * Removed the images from the www.wpclipart.com Public Domain library.
 * Improved the examples illustrating how to change EXIF metadata.
 * Applied a patch from Niall Pemberton around jdk1.5 compatibility:
	"""
	Sanselan claims JDK 1.4 compatibility, but a JDK 1.5 method (Class's getSimpleName() [1]) has been used in JpegRewriter
	"""
 * Applied a "Build Improvements" patch from Niall Pemberton:
	"""
	I took a look at the propsed 0.96 relelase and have some suggestions to improve the build:
	 * Add standard manifest entries to jar
	 * Lock down version numbers for maven compiler, surefire and javadoc plugins
	 * generate sources jar for the release
	 * include the RELEASE-NOTES in the binary distribution
	 * include NOTICE/LICENSE files in the javadoc jar
	"""

Release 0.96
------------

 * Updated KEYS file.
 * Added more unit tests around BMP.
 * Added more images to the test image suite.
 * Fixed a bug where errors were being wrongly logged to System.out.
 * Moved the example code into the test source directory, to comply with Maven's standard project layout.
 * Added a couple of images to the sample image library that demonstrate a couple variations on Photoshop/IPTC data.  
 * Fixed a small bug in the IPTC constants introduced while cleaning up the constants.
 * Started shift towards moving field-level parsing into BinaryInputStream and BinaryOutputStream.
 * Fixed a png unit test that used a piece of Java 1.6 syntax.
 * Added unit tests around the new IPTC functionality.
 * Added IPTC remove/update/insert functionality.
 * Rewrote the IPTC parsing support.  
 * Added improved support for reading and writing iTXt, tEXt, zTXt Png chunks.
 	Added a unit test that demonstrates the feature.
 * Found a new regression wherein DeflaterOutputStream needs to be closed.
 * Added the .tar.bz2 distributions back into the maven assembly descriptors.
 * Moved the example/sample code to a new top-level source folder, "example."
 * Replaced dependency on java.util.zip.DeflaterOutputStream, which is only available in Java 1.6.
 * Added a unit test around reading and writing images in every format.
 * We now sort some (but not all) GIF color tables.
 * Applied the BMP "buffer flushing" bug to the PBM reading and writing code.
 * Fixed a regression around flushing the bit buffer when writing BMPs with very small palettes.
 * Removed assumption about DataBuffer type when reading BMPs.
 * When writing a GIF, we now always include a Graphic Control Extension block, even if its not necessary.
 * We are more defensive about missing GCEs.
 * Lastly, we now set a minimum bound on initial code sizes for LZW-compressed Gif image data.
 * Found a regression in writing TIFFs around strip offsets being properly updated.  Not a LZW issue after all.
	Added a few unit tests around this issue.	
	see: https://issues.apache.org/jira/browse/SANSELAN-6
 * Added ability to remove and update XMP XML in existing JPEG files.
 * Added ability to embed XMP XML when writing the following formats: GIF, PNG, TIFF.
 * Improved handling of tEXt and zTXt PNG text blocks.
 * Added XMP XML extraction for the following formats: GIF (untested), JPEG, TIFF, PNG, PSD.
 * Added RELEASE_NOTES file (this file).
 * Added Apache license header to bin.xml and src.xml Maven assembly descriptors.
 * Added Javadocs to the binary distribution
 

Release 0.94
------------

First Apache release of Sanselan

Fixed bugs:
-----------
 * Can't convert PNG image to GIF image
    The PNG reader wasn't handling the 16-bit mode 4 PNGs properly. 
    The PNG reader wasn't gamma-correcting non-palette values properly in PNGs.
	see: https://issues.apache.org/jira/browse/SANSELAN-5

