The Apache Commons Imaging team is pleased to announce the commons-imaging-1.0-alpha3 release!

Apache Commons Imaging (previously Sanselan) is a pure-Java image library.

Changes in this version include:

New features:
o Add CIELAB and DIN99 conversion, reduce code duplication, and issues related to zero-division and precision.  Issue: IMAGING-283. Thanks to Wanja Gayk. 
o Imaging.getBufferedImage() drops alpha layer for TIFF images.  Issue: IMAGING-216. Thanks to Gary Lucas. 
o Consolidate redundant methods in TIFF datareaders.  Issue: IMAGING-269. Thanks to Gary Lucas. 
o Add list of TIFF files and example survey application.  Issue: IMAGING-268. Thanks to Gary Lucas. 

Fixed Bugs:
o Add PNG predictor to reduce output size.  Issue: IMAGING-330. Thanks to Gary Lucas. 
o Change getExif name to getOutputSet.  Issue: IMAGING-327. Thanks to Gary Lucas. 
o Prevent OutOfMemoryError in BmpImageParser. This can happen when the color palette length is
        a large negative number.  Issue: IMAGING-325. Thanks to Jin Wang. 
o Read TIFFs with 32-bit samples.  Issue: IMAGING-320. Thanks to Gary Lucas. 
o The Imaging ImageParser's used HashMap's before, but on this issue we replaced the maps by proper
        ImagingParameter classes, that encapsulate the parameters for each image format.

        The Imaging class also had the HashMap methods removed, but we also removed the public methods that
        supported parameters. This was due to the complexity to handle cases where users could provide a byte
        array, or file, and parameters. In Java, with or without generics, it was rather difficult to handle
        the cases where users could provide a PNG image stream with TIFF parameters.

        To prevent issues like this, we will improve the ImageParser's API's, and work on either providing
        other ways to customize and create parsers (factories, builders, etc.) or similar ways to use
        the Imaging entry class (like merging parameters or using parameter builders.)

        This was the last blocker issue of the 1.0 release vote, rolled a few years ago.  Issue: IMAGING-159. Thanks to Bruno P. Kinoshita, Gary Lucas, Matt Juntunen. 
o Encoding Support for IPTC metadata.  Issue: IMAGING-168. Thanks to Yavuz Kavus. 
o Array sizes not checked for overflow in BmpImageParser.  Issue: IMAGING-279. 
o ArrayIndexOutOfBoundsException on reading simple GeoTIFF.  Issue: IMAGING-265. Thanks to Gary Lucas. 
o BMP Parser physicalWidthDpi and physicalHeightDpi truncated before rounding off.  Issue: IMAGING-264. 
o Failure when reading a partial raster from a floating-point TIFF  Issue: IMAGING-263. Thanks to Gary Lucas. 
o Fix typos  Issue: IMAGING-291. Thanks to Arturo Bernal. 
o Fix javadoc  Issue: IMAGING-289. Thanks to Arturo Bernal. 
o Fix IptcParserTest on Windows  Issue: IMAGING-308. Thanks to Gary Lucas. 
o Read integer data from GeoTIFFS  Issue: IMAGING-266. Thanks to Gary Lucas. 
o Corrected handling of ExtraSamples tag  Issue: IMAGING-312. Thanks to Gary Lucas. 
o Decoding of Rational Numbers broken when large values present  Issue: IMAGING-285. Thanks to Gary Lucas. 
o Update examples, add GeoTIFF metadata to output  Issue: IMAGING-314. Thanks to Gary Lucas. 
o Read TIFFs with multiple floating-point sampless  Issue: IMAGING-311. Thanks to Gary Lucas. 
o A PNG image using indexed color type but no PLTE chunks throws NPE.  Issue: IMAGING-317. Thanks to OSS-Fuzz. 
o Validate when accessing GIF color table array.  Issue: IMAGING-318. Thanks to OSS-Fuzz. 

Changes:
o Bump animal-sniffer-maven-plugin from 1.19 to 1.21 #120, #199. Thanks to Dependabot. 
o Bump maven-checkstyle-plugin from 3.1.1 to 3.1.2 #117. Thanks to Dependabot. 
o Bump spotbugs from 4.0.6 to 4.7.0 #111 #118 #123 #128 #156 #160 #167 #174 #185 #188 #191 #208 #218. Thanks to Dependabot. 
o Bump spotbugs-maven-plugin from 4.0.4 to 4.6.0.0 #111 #115 #125 #129 #157 #171 #176 #180 #186 #192 #211. Thanks to Dependabot. 
o Bump maven-pmd-plugin from 3.13.0 to 3.15.0 #109 #166. Thanks to Dependabot. 
o Bump actions/setup-java from v1.4.0 to v3 #92 #95 #101 #127 #213. Thanks to Dependabot. 
o Bump commons-io from 2.7 to 2.11.0 #96 #152 #153, #158. Thanks to Dependabot. 
o Bump junit-jupiter from 5.6.2 to 5.8.2 #97 #119 #151 #170 #172 #187. Thanks to Dependabot. 
o Bump actions/checkout from v2.3.2 to v3 #99 #107 #175 #181 #205. Thanks to Dependabot. 
o Remove redundant local variable  Issue: IMAGING-290. Thanks to Arturo Bernal. 
o Java 8 improvements  Issue: IMAGING-288. Thanks to Arturo Bernal. 
o Simplify assertions in tests  Issue: IMAGING-287. Thanks to Arturo Bernal. 
o Use 'compare()' method to compare numbers  Issue: IMAGING-295. Thanks to Arturo Bernal. 
o Use java style array declaration  Issue: IMAGING-294. Thanks to Arturo Bernal. 
o Throw ImageReadException if the PNG parser is given an image with invalid ICC Profile.  Issue: IMAGING-298. Thanks to OSS-Fuzz. 
o Throw ImageReadException if the GIF parser is given an image with invalid image data instead of throwing IndexOutOfBoundsException.  Issue: IMAGING-300. Thanks to OSS-Fuzz. 
o Throw ImageReadException if the GIF parser is given an image with invalid Lzw table instead of throwing IndexOutOfBoundsException.  Issue: IMAGING-301. Thanks to OSS-Fuzz. 
o Throw ImageReadException if the JPEG parser is given an image with a negative number of segments in SOF0Segment.  Issue: IMAGING-302. Thanks to OSS-Fuzz. 
o Use Comparator combinator  Issue: IMAGING-304. Thanks to Arturo Bernal. 
o Simplify If-else conditions  Issue: IMAGING-303. Thanks to Arturo Bernal. 
o Replace Collections.sort with list.sort  Issue: IMAGING-305. Thanks to Arturo Bernal. 
o Remove redundant variables  Issue: IMAGING-315. Thanks to Arturo Bernal. 
o Bump github/codeql-action from 1 to 2 #216 Thanks to Dependabot. 


Have fun!
-Apache Commons Imaging team

