[Git][java-team/libthumbnailator-java][upstream] New upstream version 0.4.15

Markus Koschany (@apo) gitlab at salsa.debian.org
Sat Dec 18 23:51:35 GMT 2021



Markus Koschany pushed to branch upstream at Debian Java Maintainers / libthumbnailator-java


Commits:
0c17c3bb by Markus Koschany at 2021-12-19T00:49:17+01:00
New upstream version 0.4.15
- - - - -


16 changed files:

- README.md
- pom.xml
- src/main/java/net/coobird/thumbnailator/Thumbnailator.java
- src/main/java/net/coobird/thumbnailator/Thumbnails.java
- src/main/java/net/coobird/thumbnailator/builders/ThumbnailParameterBuilder.java
- src/main/java/net/coobird/thumbnailator/filters/Pipeline.java
- src/main/java/net/coobird/thumbnailator/makers/FixedSizeThumbnailMaker.java
- src/main/java/net/coobird/thumbnailator/makers/ScaledThumbnailMaker.java
- src/main/java/net/coobird/thumbnailator/name/ConsecutivelyNumberedFilenames.java
- src/main/java/net/coobird/thumbnailator/name/Rename.java
- src/main/java/net/coobird/thumbnailator/resizers/DefaultResizerFactory.java
- src/main/java/net/coobird/thumbnailator/resizers/Resizers.java
- src/main/java/net/coobird/thumbnailator/tasks/io/ImageSink.java
- src/main/java/net/coobird/thumbnailator/tasks/io/OutputStreamImageSink.java
- src/main/java/net/coobird/thumbnailator/util/ThumbnailatorUtils.java
- + src/test/java/net/coobird/thumbnailator/tasks/io/Issue156OutputStreamImageSinkTest.java


Changes:

=====================================
README.md
=====================================
@@ -1,4 +1,4 @@
-_*March 11, 2021: Thumbnailator 0.4.14 has been released!
+_*December 5, 2021: Thumbnailator 0.4.15 has been released!
 See [Changes](https://github.com/coobird/thumbnailator/wiki/Changes) for details.*_
 
 _*Thumbnailator is now available through


=====================================
pom.xml
=====================================
@@ -2,7 +2,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>net.coobird</groupId>
   <artifactId>thumbnailator</artifactId>
-  <version>0.4.14</version>
+  <version>0.4.15</version>
   <packaging>jar</packaging>
   <name>thumbnailator</name>
   <description>Thumbnailator - a thumbnail generation library for Java</description>
@@ -60,6 +60,12 @@
           <show>public</show>
           <use>false</use>
           <destDir>${project.build.outputDirectory}/javadoc</destDir>
+          <javaApiLinks>
+            <property>
+              <name>api_1.5</name>
+              <value>https://docs.oracle.com/javase/1.5.0/docs/api/</value>
+            </property>
+          </javaApiLinks>
           <archive>
             <manifestEntries>
               <Specification-Title>Thumbnailator API Documentation</Specification-Title>
@@ -130,21 +136,6 @@
           </execution>
         </executions>
       </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-gpg-plugin</artifactId>
-        <version>1.5</version>
-        <executions>
-          <execution>
-            <id>sign-artifacts</id>
-            <phase>verify</phase>
-            <goals>
-              <goal>sign</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
       <plugin>
         <groupId>com.github.github</groupId>
         <artifactId>site-maven-plugin</artifactId>
@@ -231,6 +222,20 @@
               </execution>
             </executions>
           </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-gpg-plugin</artifactId>
+            <version>1.5</version>
+            <executions>
+              <execution>
+                <id>sign-artifacts</id>
+                <phase>verify</phase>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
           <plugin>
             <groupId>org.sonatype.plugins</groupId>
             <artifactId>nexus-staging-maven-plugin</artifactId>


=====================================
src/main/java/net/coobird/thumbnailator/Thumbnailator.java
=====================================
@@ -364,6 +364,7 @@ public final class Thumbnailator {
 	 * @param height		The height of the thumbnail.
 	 * @throws IOException	Thrown when a problem occurs when reading from
 	 * 						{@code File} representing an image file.
+	 * @return 			A collection of {@code File}s to the thumbnails.
 	 * 
 	 * @deprecated		This method has been deprecated in favor of using the
 	 * 					{@link Thumbnails#fromFiles(Iterable)} interface.


=====================================
src/main/java/net/coobird/thumbnailator/Thumbnails.java
=====================================
@@ -78,21 +78,26 @@ import net.coobird.thumbnailator.tasks.io.URLImageSource;
 import net.coobird.thumbnailator.util.ThumbnailatorUtils;
 
 /**
+ * <p>
  * Provides a fluent interface to create thumbnails.
+ * </p>
  * <p>
  * This is the main entry point for creating thumbnails with Thumbnailator.
+ * </p>
  * <p>
  * By using the Thumbnailator's fluent interface, it is possible to write
  * thumbnail generation code which resembles written English.
+ * </p>
  * <DL>
  * <DT><B>Usage:</B></DT>
  * <DD>
+ * <p>
  * The following example code demonstrates how to use the fluent interface
  * to create a thumbnail from multiple files from a directory, resizing them to
  * a maximum of 200 pixels by 200 pixels while preserving the aspect ratio of
  * the original, then saving the resulting thumbnails as JPEG images with file
  * names having {@code thumbnail.} appended to the beginning of the file name.
- * <p>
+ * </p>
  * <pre>
 Thumbnails.of(directory.listFiles())
     .size(200, 200)
@@ -105,21 +110,25 @@ Thumbnails.of(directory.listFiles())
  * </pre>
  * </DD>
  * </DL>
+ * <p>
  * For more examples, please visit the <a href="http://code.google.com/p/thumbnailator/">
  * Thumbnailator</a> project page.
- * <p> 
+ * </p>
  * <h2>Important Implementation Notes</h2>
+ * <p>
  * Upon calling one of the {@code Thumbnails.of(...)} methods, <em>in the
  * current implementation</em>, an instance of an inner class of this class is
  * returned. In most cases, the returned instance should not be used by
  * storing it in a local variable, as changes in the internal implementation
  * could break code in the future.
+ * </p>
  * <p>
  * As a rule of thumb, <em>always method chain from the {@code Thumbnails.of}
  * all the way until the output method (e.g. {@code toFile}, {@code asBufferedImage},
  * etc.) is called without breaking them down into single statements.</em>
  * See the "Usage" section above for the intended use of the Thumbnailator's
- * fluent interface. 
+ * fluent interface.
+ * </p>
  * <DL>
  * <DT><B>Unintended Use:</B></DT>
  * <DD>
@@ -376,7 +385,7 @@ public final class Thumbnails {
 	 * and less future-proof, as changes to this class (which is just an
 	 * inner class of the {@link Thumbnails} class) can lead to broken code  
 	 * when attempting to use future releases of Thumbnailator.
-	 * <p>
+	 * </p>
 	 * <DL>
 	 * <DT><B>Intended Use:</B></DT>
 	 * <DD>
@@ -1163,6 +1172,7 @@ Thumbnails.of(image)
 		 * 
 		 * @param region		A rectangular region which specifies the source
 		 * 						region to use when creating the thumbnail.
+		 * @return				Reference to this object.
 		 * @throws NullPointerException		If the region is {@code null}.
 		 * @since 	0.3.4
 		 */
@@ -1205,6 +1215,7 @@ Thumbnails.of(image)
 		 * 						{@link Positions#CENTER} is specified, the
 		 * 						resulting thumbnail will be made by cropping to
 		 * 						the center of the image.
+		 * @return				Reference to this object.
 		 * @throws NullPointerException		If the position is {@code null}.
 		 * @since 	0.4.0
 		 */
@@ -1244,7 +1255,7 @@ Thumbnails.of(image)
 		 * 							will not be altered. For specific behavior,
 		 * 							please refer to the specific output methods
 		 * 							listed above.
-		 * 						
+		 * @return					Reference to this object.
 		 * @since 	0.3.7
 		 */
 		public Builder<T> allowOverwrite(boolean allowOverwrite) {
@@ -1517,6 +1528,13 @@ Thumbnails.of(image)
 		 * Calling this method multiple times, or the
 		 * {@link #outputQuality(double)} in conjunction with this method will
 		 * result in an {@link IllegalStateException} to be thrown.
+		 * <p>
+		 * <em>
+		 * Implementation note:
+		 * Compression quality settings are ignored when the underlying
+		 * image writer does not support compression. This behavior is subject
+		 * to change in the future.
+		 * </em>
 		 * 
 		 * @param quality		The compression quality to use when writing
 		 * 						the thumbnail.
@@ -1560,6 +1578,13 @@ Thumbnails.of(image)
 		 * Calling this method multiple times, or the
 		 * {@link #outputQuality(float)} in conjunction with this method will
 		 * result in an {@link IllegalStateException} to be thrown.
+		 * <p>
+		 * <em>
+		 * Implementation note:
+		 * Compression quality settings are ignored when the underlying
+		 * image writer does not support compression. This behavior is subject
+		 * to change in the future.
+		 * </em>
 		 * 
 		 * @param quality		The compression quality to use when writing
 		 * 						the thumbnail.
@@ -1714,6 +1739,13 @@ Thumbnails.of(image)
 		 * {@link #outputFormat} method is disabled, in order to prevent
 		 * cases where the output format type does not exist in the format
 		 * specified for the {@code outputFormat} method.
+		 * <p>
+		 * <em>
+		 * Implementation note:
+		 * Compression format type settings are ignored when the underlying
+		 * image writer does not support compression. This behavior is subject
+		 * to change in the future.
+		 * </em>
 		 *
 		 * @param formatType	The compression format type
 		 * @return				Reference to this object.
@@ -1785,24 +1817,30 @@ Thumbnails.of(image)
 		}
 		
 		/**
+		 * <p>
 		 * Sets the image of the watermark to apply on the thumbnail.
+		 * </p>
 		 * <p>
 		 * This method is a convenience method for the
 		 * {@link #watermark(Position, BufferedImage, float)} method, where
 		 * the opacity is 50%, and the position is set to center of the
 		 * thumbnail:
-		 * <p>
+		 * </p>
 		 * <pre>
 watermark(Positions.CENTER, image, 0.5f);
 		 * </pre>
+		 * <p>
 		 * This method can be called multiple times to apply multiple
 		 * watermarks.
+		 * </p>
 		 * <p>
 		 * If multiple watermarks are to be applied, the watermarks will be
 		 * applied in the order that this method is called.
+		 * </p>
 		 * <p>
 		 * Calling this method to set this parameter is optional.
-		 * 
+		 * </p>
+		 *
 		 * @param image			The image of the watermark.
 		 * @return				Reference to this object.
 		 */
@@ -1811,23 +1849,29 @@ watermark(Positions.CENTER, image, 0.5f);
 		}
 		
 		/**
+		 * <p>
 		 * Sets the image and opacity of the watermark to apply on
 		 * the thumbnail.
+		 * </p>
 		 * <p>
 		 * This method is a convenience method for the
 		 * {@link #watermark(Position, BufferedImage, float)} method, where
 		 * the opacity is 50%:
-		 * <p>
+		 * </p>
 		 * <pre>
 watermark(Positions.CENTER, image, opacity);
 		 * </pre>
+		 * <p>
 		 * This method can be called multiple times to apply multiple
 		 * watermarks.
+		 * </p>
 		 * <p>
 		 * If multiple watermarks are to be applied, the watermarks will be
 		 * applied in the order that this method is called.
+		 * </p>
 		 * <p>
 		 * Calling this method to set this parameter is optional.
+		 * </p>
 		 * 
 		 * @param image			The image of the watermark.
 		 * @param opacity		The opacity of the watermark.
@@ -2138,16 +2182,20 @@ watermark(Positions.CENTER, image, opacity);
 		}
 		
 		/**
+		 * <p>
 		 * Create the thumbnails and return as a {@link List} of
 		 * {@link BufferedImage}s.
+		 * </p>
+		 * <p><strong>Note about performance</strong></p>
 		 * <p>
-		 * <h3>Note about performance</h3>
 		 * If there are many thumbnails generated at once, it is possible that
 		 * the Java virtual machine's heap space will run out and an
 		 * {@link OutOfMemoryError} could result.
+		 * </p>
 		 * <p>
 		 * If many thumbnails are being processed at once, then using the
 		 * {@link #iterableBufferedImages()} method would be preferable.
+		 * </p>
 		 * 
 		 * @return		A list of thumbnails.
 		 * @throws IOException					If an problem occurred during


=====================================
src/main/java/net/coobird/thumbnailator/builders/ThumbnailParameterBuilder.java
=====================================
@@ -38,11 +38,13 @@ import net.coobird.thumbnailator.resizers.Resizer;
 import net.coobird.thumbnailator.resizers.ResizerFactory;
 
 /**
+ * <p>
  * A builder for generating {@link ThumbnailParameter}.
+ * </p>
  * <p>
  * The default values assigned to the {@link ThumbnailParameter} created by
  * the {@link ThumbnailParameterBuilder} are as follows:
- * <p>
+ * </p>
  * <dl>
  * <dt>width</dt>
  * <dd>Unassigned. Must be set by the {@link #size(int, int)} method.</dd>


=====================================
src/main/java/net/coobird/thumbnailator/filters/Pipeline.java
=====================================
@@ -93,6 +93,8 @@ public final class Pipeline implements ImageFilter {
 	
 	/**
 	 * Adds an {@code ImageFilter} to the pipeline.
+	 *
+	 * @param filter		An {@code ImageFilter}.
 	 */
 	public void add(ImageFilter filter) {
 		if (filter == null) {
@@ -104,6 +106,8 @@ public final class Pipeline implements ImageFilter {
 	
 	/**
 	 * Adds an {@code ImageFilter} to the beginning of the pipeline.
+	 *
+	 * @param filter		An {@code ImageFilter}.
 	 */
 	public void addFirst(ImageFilter filter) {
 		if (filter == null) {


=====================================
src/main/java/net/coobird/thumbnailator/makers/FixedSizeThumbnailMaker.java
=====================================
@@ -27,8 +27,10 @@ package net.coobird.thumbnailator.makers;
 import java.awt.image.BufferedImage;
 
 /**
+ * <p>
  * A {@link ThumbnailMaker} which resizes an image to a specified dimension
  * when producing a thumbnail.
+ * </p>
  * <p>
  * Optionally, if the aspect ratio of the thumbnail is to be maintained the same
  * as the original image (by calling the {@link #keepAspectRatio(boolean)}
@@ -36,17 +38,19 @@ import java.awt.image.BufferedImage;
  * {@link #size(int, int)} method, {@link #FixedSizeThumbnailMaker(int, int)} or
  * {@link #FixedSizeThumbnailMaker(int, int, boolean)} constructor will be used
  * as the maximum constraint of dimensions of the thumbnail.
+ * </p>
  * <p>
  * In other words, when the aspect ratio is to be kept constant, then
  * thumbnails which are created will be sized to fit inside the dimensions
  * specified by the size parameter.
+ * </p>
  * <p>
  * Upon calculating the size of the thumbnail, if any of the dimensions are
  * {@code 0}, then that dimension will be promoted to {@code 1}, regardless of
  * whether the aspect ratio of the original image is to be maintained. This will
  * lead to some thumbnails not preserving the aspect ratio of the original
  * image, even if {@link #keepAspectRatio(boolean)} has been {@code true}.
- * <p>
+ * </p>
  * <DL>
  * <DT><B>Usage:</B></DT>
  * <DD>


=====================================
src/main/java/net/coobird/thumbnailator/makers/ScaledThumbnailMaker.java
=====================================
@@ -27,14 +27,16 @@ package net.coobird.thumbnailator.makers;
 import java.awt.image.BufferedImage;
 
 /**
+ * <p>
  * A {@link ThumbnailMaker} which scales an image by a specified scaling factor
  * when producing a thumbnail.
+ * </p>
  * <p>
  * Upon calculating the size of the thumbnail, if any of the dimensions are
  * {@code 0}, then that dimension will be promoted to {@code 1}. This will
  * cause some resizing operations to not preserve the aspect ratio of the
  * original image.
- * <p>
+ * </p>
  * <DL>
  * <DT><B>Usage:</B></DT>
  * <DD>
@@ -48,10 +50,11 @@ BufferedImage thumbnail = new ScaledThumbnailMaker()
  * </pre>
  * </DD>
  * </DL>
+ * <p>
  * It is also possible to independently specify the scaling factor for the
  * width and height. (If the two scaling factors are not equal then the aspect
  * ratio of the original image will not be preserved.)
- * <p>
+ * </p>
  * <DL>
  * <DT><B>Usage:</B></DT>
  * <DD>
@@ -65,8 +68,7 @@ BufferedImage thumbnail = new ScaledThumbnailMaker()
  * </pre>
  * </DD>
  * </DL>
- * <DL>
- * 
+ *
  * @author coobird
  *
  */


=====================================
src/main/java/net/coobird/thumbnailator/name/ConsecutivelyNumberedFilenames.java
=====================================
@@ -44,38 +44,46 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	private final Iterator<File> iter;
 
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are consecutively numbered
 	 * beginning from {@code 0}.
-	 * <p>
-	 * <h3>File name sequence</h3>
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <ol>
 	 * <li><code>0</code></li>
 	 * <li><code>1</code></li>
 	 * <li><code>2</code></li>
 	 * <li><code>3</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
+	 * </p>
 	 */
 	public ConsecutivelyNumberedFilenames() {
 		this.iter = new ConsecutivelyNumberedFilenamesIterator(new File("").getParentFile(), "%d", 0);
 	}
 
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are consecutively numbered
 	 * beginning from the given value.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the given value is {@code 5}:
+	 * </p>
 	 * <ol>
 	 * <li><code>5</code></li>
 	 * <li><code>6</code></li>
 	 * <li><code>7</code></li>
 	 * <li><code>8</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
 	 * @param start		The value from which to start counting.
 	 */
 	public ConsecutivelyNumberedFilenames(int start) {
@@ -83,20 +91,25 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	}
 	
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are consecutively numbered
 	 * beginning from {@code 0}, with the directory specified.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the parent directory is {@code /foo/bar/}:
+	 * </p>
 	 * <ol>
 	 * <li><code>/foo/bar/0</code></li>
 	 * <li><code>/foo/bar/1</code></li>
 	 * <li><code>/foo/bar/2</code></li>
 	 * <li><code>/foo/bar/3</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
  	 * @param dir			The directory in which the files are to be located.
  	 * @throws IOException	If the specified directory path is not a directory,
  	 * 						or if does not exist.
@@ -107,26 +120,32 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	}
 	
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are based on a format string.
 	 * The numbering will be consecutive from {@code 0}.
+	 * </p>
 	 * <p>
 	 * The format string should contain the string {@code %d} which will be
 	 * replaced with a consecutively counted number. Additional formatting
 	 * can be applied. For more details, please refer to the section on
 	 * <em>Numeric</em> formatting in the Java API specification for the
 	 * {@link Formatter} class.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the format string is {@code image-%d}:
+	 * </p>
 	 * <ol>
 	 * <li><code>image-0</code></li>
 	 * <li><code>image-1</code></li>
 	 * <li><code>image-2</code></li>
 	 * <li><code>image-3</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
 	 * @param format		The format string to use.
 	 */
 	public ConsecutivelyNumberedFilenames(String format) {
@@ -134,21 +153,26 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	}
 
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are consecutively numbered
 	 * beginning from from the given value, with the directory specified.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the parent directory is {@code /foo/bar/}, and the
 	 * specified value is {@code 5}:
+	 * </p>
 	 * <ol>
 	 * <li><code>/foo/bar/5</code></li>
 	 * <li><code>/foo/bar/6</code></li>
 	 * <li><code>/foo/bar/7</code></li>
 	 * <li><code>/foo/bar/8</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
 	 * @param dir			The directory in which the files are to be located.
 	 * @param start			The value from which to start counting.
  	 * @throws IOException	If the specified directory path is not a directory,
@@ -160,28 +184,34 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	}
 	
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are based on a format string,
 	 * located in the directory specified. The numbering will be consecutively
 	 * counted from {@code 0}.
+	 * </p>
 	 * <p>
 	 * The format string should contain the string {@code %d} which will be
 	 * replaced with a consecutively counted number. Additional formatting
 	 * can be applied. For more details, please refer to the section on
 	 * <em>Numeric</em> formatting in the Java API specification for the
 	 * {@link Formatter} class.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the parent directory is {@code /foo/bar/},
 	 * with the format string {@code image-%d}:
+	 * </p>
 	 * <ol>
 	 * <li><code>/foo/bar/image-0</code></li>
 	 * <li><code>/foo/bar/image-1</code></li>
 	 * <li><code>/foo/bar/image-2</code></li>
 	 * <li><code>/foo/bar/image-3</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
 	 * @param dir			The directory in which the files are to be located.
 	 * @param format		The format string to use.
  	 * @throws IOException	If the specified directory path is not a directory,
@@ -193,27 +223,33 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	}
 
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are based on a format string.
 	 * The numbering will be consecutive from the specified value.
+	 * </p>
 	 * <p>
 	 * The format string should contain the string {@code %d} which will be
 	 * replaced with a consecutively counted number. Additional formatting
 	 * can be applied. For more details, please refer to the section on
 	 * <em>Numeric</em> formatting in the Java API specification for the
 	 * {@link Formatter} class.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the parent directory is {@code /foo/bar/}, and the
 	 * specified value is {@code 5}, with the format string {@code image-%d}:
+	 * </p>
 	 * <ol>
 	 * <li><code>image-5</code></li>
 	 * <li><code>image-6</code></li>
 	 * <li><code>image-7</code></li>
 	 * <li><code>image-8</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
 	 * @param format		The format string to use.
 	 * @param start			The value from which to start counting.
 	 */
@@ -222,28 +258,34 @@ public class ConsecutivelyNumberedFilenames implements Iterable<File> {
 	}
 
 	/**
+	 * <p>
 	 * Instantiates an {@code ConsecutivelyNumberedFilenames} object which
 	 * returns {@link File}s with file names which are based on a format string,
 	 * located in the directory specified. The numbering will be consecutive
 	 * from the specified value.
+	 * </p>
 	 * <p>
 	 * The format string should contain the string {@code %d} which will be
 	 * replaced with a consecutively counted number. Additional formatting
 	 * can be applied. For more details, please refer to the section on
 	 * <em>Numeric</em> formatting in the Java API specification for the
 	 * {@link Formatter} class.
+	 * </p>
+	 * <p><strong>File name sequence</strong></p>
 	 * <p>
-	 * <h3>File name sequence</h3>
 	 * For a case where the parent directory is {@code /foo/bar/}, and the
 	 * specified value is {@code 5}, with format string {@code image-%d}:
+	 * </p>
 	 * <ol>
 	 * <li><code>/foo/bar/image-5</code></li>
 	 * <li><code>/foo/bar/image-6</code></li>
 	 * <li><code>/foo/bar/image-7</code></li>
 	 * <li><code>/foo/bar/image-8</code></li>
 	 * </ol>
+	 * <p>
 	 * and so on.
-	 * 
+	 * </p>
+	 *
 	 * @param dir			The directory in which the files are to be located.
 	 * @param format		The format string to use.
 	 * @param start			The value from which to start counting.


=====================================
src/main/java/net/coobird/thumbnailator/name/Rename.java
=====================================
@@ -34,17 +34,17 @@ import net.coobird.thumbnailator.ThumbnailParameter;
  */
 public abstract class Rename {
 	/**
+	 * <p>
 	 * A {@code Rename} which does not alter the given file name.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is {@code picture.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code picture.jpg}</li>
-	 * </ul>
+	 * </p>
 	 */
 	public static final Rename NO_CHANGE = new Rename() {
 		@Override
@@ -54,17 +54,18 @@ public abstract class Rename {
 	};
 	
 	/**
+	 * <p>
 	 * Appends {@code thumbnail.} to the beginning of the file name.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is
+	 * {@code thumbnail.picture.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code thumbnail.picture.jpg}</li>
-	 * </ul>
+	 * </p>
 	 */
 	public static final Rename PREFIX_DOT_THUMBNAIL = new Rename() {
 		@Override
@@ -74,17 +75,18 @@ public abstract class Rename {
 	};
 	
 	/**
+	 * <p>
 	 * Appends {@code thumbnail-} to the beginning of the file name.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is
+	 * {@code thumbnail-picture.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code thumbnail-picture.jpg}</li>
-	 * </ul>
+	 * </p>
 	 * 
 	 * @deprecated 		Please use the correctly spelled
 	 * 					{@link Rename#PREFIX_HYPHEN_THUMBNAIL}. This constant
@@ -94,17 +96,18 @@ public abstract class Rename {
 	public static final Rename PREFIX_HYPTHEN_THUMBNAIL = Rename.PREFIX_HYPHEN_THUMBNAIL;
 	
 	/**
+	 * <p>
 	 * Appends {@code thumbnail-} to the beginning of the file name.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is
+	 * {@code thumbnail-picture.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code thumbnail-picture.jpg}</li>
-	 * </ul>
+	 * </p>
 	 */
 	public static final Rename PREFIX_HYPHEN_THUMBNAIL = new Rename() {
 		@Override
@@ -114,18 +117,19 @@ public abstract class Rename {
 	};
 	
 	/**
+	 * <p>
 	 * Appends {@code .thumbnail} to the file name prior to the extension of
 	 * the file.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is
+	 * {@code picture.thumbnail.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code picture.thumbnail.jpg}</li>
-	 * </ul>
+	 * </p>
 	 */
 	public static final Rename SUFFIX_DOT_THUMBNAIL = new Rename() {
 		@Override
@@ -135,18 +139,19 @@ public abstract class Rename {
 	};
 	
 	/**
+	 * <p>
 	 * Appends {@code -thumbnail} to the file name prior to the extension of
 	 * the file.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is
+	 * {@code picture-thumbnail.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code picture-thumbnail.jpg}</li>
-	 * </ul>
+	 * </p>
 	 * 
 	 * @deprecated 		Please use the correctly spelled
 	 * 					{@link Rename#SUFFIX_HYPHEN_THUMBNAIL}. This constant
@@ -156,18 +161,19 @@ public abstract class Rename {
 	public static final Rename SUFFIX_HYPTHEN_THUMBNAIL = Rename.SUFFIX_HYPHEN_THUMBNAIL;
 	
 	/**
+	 * <p>
 	 * Appends {@code -thumbnail} to the file name prior to the extension of
 	 * the file.
+	 * </p>
+	 * <p>
+	 * For example, given {@code picture.jpg}, result is
+	 * {@code picture-thumbnail.jpg}.
+	 * </p>
 	 * <p>
 	 * Note: The {@link #apply(String, ThumbnailParameter)} method does not use
 	 * the {@code param} parameter. A value of {@code null} for {@code param} is
 	 * permitted.
-	 * <p>
-	 * <dt>Example</dt>
-	 * <ul>
-	 * <li>Before: {@code picture.jpg}</li>
-	 * <li>After: {@code picture-thumbnail.jpg}</li>
-	 * </ul>
+	 * </p>
 	 */
 	public static final Rename SUFFIX_HYPHEN_THUMBNAIL = new Rename() {
 		@Override


=====================================
src/main/java/net/coobird/thumbnailator/resizers/DefaultResizerFactory.java
=====================================
@@ -34,7 +34,7 @@ import java.awt.Dimension;
  * <dl>
  * <dt>{@code Resizer}s returned by this {@code ResizerFactory}:</dt>
  * <dd>
- * The {@link Resizer}s returned by this {@link ResizerFactory} depends upon
+ * The {@link Resizer}s returned by this {@link ResizerFactory} depends on
  * the size of the source and destination images. The conditions and the
  * {@link Resizer}s returned are as follows:
  * 
@@ -71,10 +71,11 @@ import java.awt.Dimension;
  * <DL>
  * <DT><B>Usage:</B></DT>
  * <DD>
+ * <p>
  * The following example code demonstrates how to use {@link DefaultResizerFactory}
  * in order to obtain the optimal {@link Resizer}, and using that in order to
  * perform the resizing operation.
- * <p>
+ * </p>
  * <pre>
 BufferedImage sourceImage = new BufferedImageBuilder(400, 400).build();
 BufferedImage destImage = new BufferedImageBuilder(200, 200).build();
@@ -90,10 +91,11 @@ resizer.resize(sourceImage, destImage);
  * </pre>
  * </DD>
  * </DL>
+ * <p>
  * When a specific {@link Resizer} is required, the {@link Resizers}
  * {@code enum} is another way to obtain {@link Resizer}s.
- * <p>
- * 
+ * </p>
+ *
  * @see Resizers
  *
  * @author coobird


=====================================
src/main/java/net/coobird/thumbnailator/resizers/Resizers.java
=====================================
@@ -27,21 +27,24 @@ package net.coobird.thumbnailator.resizers;
 import java.awt.image.BufferedImage;
 
 /**
+ * <p>
  * This enum can be used to select a specific {@link Resizer} in order
  * to perform a resizing operation.
+ * </p>
  * <p>
  * The instance held by a value of this enum is a single instance. When using
  * specific implementations of {@link Resizer}s, it is preferable to obtain
  * an instance of a {@link Resizer} through this enum or the
  * {@link DefaultResizerFactory} class in order to prevent many instances of the
  * {@link Resizer} class implementations from being instantiated.
- * <p>
+ * </p>
  * <DL>
  * <DT><B>Usage:</B></DT>
  * <DD>
+ * <p>
  * The following example code demonstrates how to use the {@link Resizers} enum
  * in order to resize an image using bilinear interpolation:
- * <p>
+ * </p>
  * <pre>
 BufferedImage sourceImage = new BufferedImageBuilder(400, 400).build();
 BufferedImage destImage = new BufferedImageBuilder(200, 200).build();


=====================================
src/main/java/net/coobird/thumbnailator/tasks/io/ImageSink.java
=====================================
@@ -70,11 +70,15 @@ public interface ImageSink<T> {
 	public void setThumbnailParameter(ThumbnailParameter param);
 	
 	/**
+	 * <p>
 	 * Returns the output format to use from information provided for the
 	 * output image.
+	 * </p>
 	 * <p>
 	 * If the output format cannot be determined, then
 	 * {@link ThumbnailParameter#ORIGINAL_FORMAT} should be returned.
+	 * </p>
+	 * @return 					Name of the preferred output format.
 	 */
 	public String preferredOutputFormatName();
 	


=====================================
src/main/java/net/coobird/thumbnailator/tasks/io/OutputStreamImageSink.java
=====================================
@@ -110,40 +110,55 @@ public class OutputStreamImageSink extends AbstractImageSink<OutputStream> {
 		ImageWriter writer = writers.next();
 		
 		ImageWriteParam writeParam = writer.getDefaultWriteParam();
-		if (writeParam.canWriteCompressed() && param != null) {
-			writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
-			
+		if (writeParam.canWriteCompressed()) {
 			/*
 			 * Sets the compression format type, if specified.
-			 * 
+			 *
 			 * Note:
 			 * The value to denote that the codec's default compression type
 			 * should be used is null.
 			 */
-			if (param.getOutputFormatType() != ThumbnailParameter.DEFAULT_FORMAT_TYPE) {
-				writeParam.setCompressionType(param.getOutputFormatType());
+			String compressionType = null;
+			if (param != null && param.getOutputFormatType() != ThumbnailParameter.DEFAULT_FORMAT_TYPE) {
+				compressionType = param.getOutputFormatType();
 
 			} else {
 				List<String> supportedFormats =
-					ThumbnailatorUtils.getSupportedOutputFormatTypes(formatName);
-				
+						ThumbnailatorUtils.getSupportedOutputFormatTypes(formatName);
+
 				if (!supportedFormats.isEmpty()) {
-					writeParam.setCompressionType(supportedFormats.get(0));
+					compressionType = supportedFormats.get(0);
 				}
 			}
-	
+			if (compressionType != null) {
+				setCompressionModeExplicit(writeParam);
+				writeParam.setCompressionType(compressionType);
+			}
+
 			/*
 			 * Sets the compression quality, if specified.
-			 * 
+			 *
 			 * Note:
 			 * The value to denote that the codec's default compression quality
 			 * should be used is Float.NaN.
 			 */
-			if (!Float.isNaN(param.getOutputQuality())) {
+			if (param != null && !Float.isNaN(param.getOutputQuality())) {
+				setCompressionModeExplicit(writeParam);
 				writeParam.setCompressionQuality(param.getOutputQuality());
+
+			} else if (isPng(formatName) && isJava9OrNewer() && isDefaultPngWriter(writer)) {
+				/*
+				 * Before Java 9, the PNG writer bundled with the JRE was
+				 * using maximum compression.
+				 * To replicate the behavior in Java 9+, the compression
+				 * quality is set to 0.0f to trigger maximum compression.
+				 * See Issue #156: https://github.com/coobird/thumbnailator/issues/156
+				 */
+				setCompressionModeExplicit(writeParam);
+				writeParam.setCompressionQuality(0.0f);
 			}
 		}
-		
+
 		/*
 		 * The following line is not surrounded by a try-catch, as catching
 		 * the `IOException` and re-throwing would not give a good feedback as
@@ -187,11 +202,7 @@ public class OutputStreamImageSink extends AbstractImageSink<OutputStream> {
 		 * Also, the BMP writer appears not to support ARGB, so an RGB image
 		 * will be produced before saving.
 		 */
-		if (
-				formatName.equalsIgnoreCase("jpg")
-				|| formatName.equalsIgnoreCase("jpeg")
-				|| formatName.equalsIgnoreCase("bmp")
-		) {
+		if (isJpegOrBmp(formatName)) {
 			img = BufferedImages.copy(img, BufferedImage.TYPE_INT_RGB);
 		}
 		
@@ -212,6 +223,40 @@ public class OutputStreamImageSink extends AbstractImageSink<OutputStream> {
 		ios.close();
 	}
 
+	/**
+	 * Sets the compression mode to explicit, if not already.
+	 * A check exists to prevent setting the explicit mode more than once,
+	 * as any previously set parameters will be discarded.
+	 *
+	 * @param writeParam	Current image writer parameters.
+	 */
+	private void setCompressionModeExplicit(ImageWriteParam writeParam) {
+		if (writeParam.getCompressionMode() != ImageWriteParam.MODE_EXPLICIT) {
+			writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+		}
+	}
+
+	private boolean isJpegOrBmp(String formatName) {
+		return formatName.equalsIgnoreCase("jpg")
+				|| formatName.equalsIgnoreCase("jpeg")
+				|| formatName.equalsIgnoreCase("bmp");
+	}
+
+	private boolean isPng(String formatName) {
+		return formatName.equalsIgnoreCase("png");
+	}
+
+	private boolean isDefaultPngWriter(ImageWriter writer) {
+		String writerClassName = writer.getClass().getName();
+		return "com.sun.imageio.plugins.png.PNGImageWriter".equals(writerClassName);
+	}
+
+	private boolean isJava9OrNewer() {
+		String version = System.getProperty("java.specification.version");
+		// Up to Java 8, specification version was 1.x.
+		return version != null && !version.contains(".");
+	}
+
 	public OutputStream getSink() {
 		return os;
 	}


=====================================
src/main/java/net/coobird/thumbnailator/util/ThumbnailatorUtils.java
=====================================
@@ -87,7 +87,8 @@ public final class ThumbnailatorUtils {
 	/**
 	 * Returns a {@link List} of supported output formats types for a specified
 	 * output format.
-	 * 
+	 *
+	 * @param format	The output format.
 	 * @return		A {@link List} of supported output formats types. If no
 	 * 				formats types are supported, or if compression is not
 	 * 				supported for the specified format, then an empty list


=====================================
src/test/java/net/coobird/thumbnailator/tasks/io/Issue156OutputStreamImageSinkTest.java
=====================================
@@ -0,0 +1,34 @@
+package net.coobird.thumbnailator.tasks.io;
+
+import net.coobird.thumbnailator.ThumbnailParameter;
+import net.coobird.thumbnailator.builders.ThumbnailParameterBuilder;
+import org.junit.Test;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertTrue;
+
+public class Issue156OutputStreamImageSinkTest {
+	@Test
+	public void compressedPngDoesntGetLarger() throws IOException {
+		File originalFile = new File("src/test/resources/Exif/original.png");
+		BufferedImage originalImage = ImageIO.read(originalFile);
+
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		OutputStreamImageSink imageSink = new OutputStreamImageSink(baos);
+
+		ThumbnailParameter param = new ThumbnailParameterBuilder()
+				.scale(1.0)
+				.build();
+		imageSink.setThumbnailParameter(param);
+
+		imageSink.setOutputFormatName("png");
+		imageSink.write(originalImage);
+
+		assertTrue(baos.size() < originalFile.length());
+	}
+}



View it on GitLab: https://salsa.debian.org/java-team/libthumbnailator-java/-/commit/0c17c3bb55fb0794ff4e3a2a695afefefbe8e69e

-- 
View it on GitLab: https://salsa.debian.org/java-team/libthumbnailator-java/-/commit/0c17c3bb55fb0794ff4e3a2a695afefefbe8e69e
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20211218/aaf8ab67/attachment.htm>


More information about the pkg-java-commits mailing list