You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ki...@apache.org on 2022/01/16 02:03:07 UTC

[commons-imaging] 07/24: [IMAGING-159] Add a method to create a parameter object, and a list of extensions to each format, and a default extension. Update tests.

This is an automated email from the ASF dual-hosted git repository.

kinow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-imaging.git

commit 461d385212fa255f8e105af555fec9bf69769165
Author: Bruno P. Kinoshita <ki...@apache.org>
AuthorDate: Sat May 15 19:26:15 2021 +1200

    [IMAGING-159] Add a method to create a parameter object, and a list of extensions to each format, and a default extension. Update tests.
---
 .../org/apache/commons/imaging/ImageFormat.java    |  6 +-
 .../org/apache/commons/imaging/ImageFormats.java   | 98 ++++++++++++++++------
 .../imaging/formats/dcx/DcxImageParser.java        |  9 +-
 .../imaging/formats/jpeg/JpegImageParser.java      |  3 +
 .../common/bytesource/ByteSourceImageTest.java     | 12 +--
 .../commons/imaging/formats/xmp/XmpUpdateTest.java |  2 +-
 .../roundtrip/NullParametersRoundtripTest.java     |  2 +-
 .../imaging/roundtrip/PixelDensityRoundtrip.java   |  2 +-
 .../commons/imaging/roundtrip/RoundtripBase.java   |  5 +-
 9 files changed, 97 insertions(+), 42 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/ImageFormat.java b/src/main/java/org/apache/commons/imaging/ImageFormat.java
index c733432..d9b1724 100644
--- a/src/main/java/org/apache/commons/imaging/ImageFormat.java
+++ b/src/main/java/org/apache/commons/imaging/ImageFormat.java
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.imaging;
 
+
 /**
  * Simple image format interface.
  */
@@ -33,6 +34,9 @@ public interface ImageFormat {
      *
      * @return String extension
      */
-    String getExtension();
+    String[] getExtensions();
+
+    String getDefaultExtension();
 
+    ImagingParameters createImagingParameters();
 }
diff --git a/src/main/java/org/apache/commons/imaging/ImageFormats.java b/src/main/java/org/apache/commons/imaging/ImageFormats.java
index 2f10c2e..fdceaf2 100644
--- a/src/main/java/org/apache/commons/imaging/ImageFormats.java
+++ b/src/main/java/org/apache/commons/imaging/ImageFormats.java
@@ -16,32 +16,62 @@
  */
 package org.apache.commons.imaging;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.commons.imaging.formats.bmp.BmpImagingParameters;
+import org.apache.commons.imaging.formats.gif.GifImagingParameters;
+import org.apache.commons.imaging.formats.icns.IcnsImagingParameters;
+import org.apache.commons.imaging.formats.ico.IcoImagingParameters;
+import org.apache.commons.imaging.formats.jpeg.JpegImagingParameters;
+import org.apache.commons.imaging.formats.pcx.PcxImagingParameters;
+import org.apache.commons.imaging.formats.png.PngImagingParameters;
+import org.apache.commons.imaging.formats.pnm.PnmImagingParameters;
+import org.apache.commons.imaging.formats.psd.PsdImagingParameters;
+import org.apache.commons.imaging.formats.rgbe.RgbeImagingParameters;
+import org.apache.commons.imaging.formats.tiff.TiffImagingParameters;
+import org.apache.commons.imaging.formats.wbmp.WbmpImagingParameters;
+import org.apache.commons.imaging.formats.xbm.XbmImagingParameters;
+import org.apache.commons.imaging.formats.xpm.XpmImagingParameters;
+
 /**
  * Enum of known image formats.
  */
 public enum ImageFormats implements ImageFormat {
-    UNKNOWN,
-    BMP,
-    DCX,
-    GIF,
-    ICNS,
-    ICO,
-    JBIG2,
-    JPEG,
-    PAM,
-    PSD,
-    PBM,
-    PGM,
-    PNM,
-    PPM,
-    PCX,
-    PNG,
-    RGBE,
-    TGA,
-    TIFF,
-    WBMP,
-    XBM,
-    XPM;
+    UNKNOWN(ImagingParameters.class),
+    BMP(BmpImagingParameters.class, "bmp", "dib"),
+    DCX(PcxImagingParameters.class, "dcx"),
+    GIF(GifImagingParameters.class, "gif"),
+    ICNS(IcnsImagingParameters.class, ""),
+    ICO(IcoImagingParameters.class, "ico"),
+    JBIG2(ImagingParameters.class),
+    JPEG(JpegImagingParameters.class, "jpg", "jpeg", "jpe", "jif", "jfif", "jfi"),
+    PAM(PnmImagingParameters.class, "pam"),
+    PSD(PsdImagingParameters.class, "psd"),
+    PBM(PnmImagingParameters.class, "pbm"),
+    PGM(PnmImagingParameters.class, "pgm"),
+    PNM(PnmImagingParameters.class, "pnm"),
+    PPM(PnmImagingParameters.class, "ppm"),
+    PCX(PcxImagingParameters.class, "pcx"),
+    PNG(PngImagingParameters.class, "png"),
+    RGBE(RgbeImagingParameters.class, "rgbe"),
+    TGA(ImagingParameters.class),
+    TIFF(TiffImagingParameters.class, "tiff", "tif"), // TODO: Or is it .tif the default one?
+    WBMP(WbmpImagingParameters.class, "wbmp"),
+    XBM(XbmImagingParameters.class, "xbm"),
+    XPM(XpmImagingParameters.class, "xpm");
+
+    private static final Logger LOGGER = Logger.getLogger(ImageFormats.class.getName());
+
+    private String[] extensions;
+    private Class<? extends ImagingParameters> parametersClass;
+
+    ImageFormats(Class<? extends ImagingParameters> parametersClass, String ...extensions) {
+        this.extensions = extensions;
+        this.parametersClass = parametersClass;
+    }
 
     @Override
     public String getName() {
@@ -49,7 +79,27 @@ public enum ImageFormats implements ImageFormat {
     }
 
     @Override
-    public String getExtension() {
-        return name();
+    public String[] getExtensions() {
+        return this.extensions.clone();
+    }
+
+    @Override
+    public String getDefaultExtension() {
+        return this.extensions[0];
+    }
+
+    @Override
+    public ImagingParameters createImagingParameters() {
+        if (this.parametersClass != null) {
+            Constructor<?> ctor;
+            try {
+                ctor = this.parametersClass.getConstructor();
+                return (ImagingParameters) ctor.newInstance();
+            } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+                LOGGER.log(Level.WARNING, "Failed to create imaging parameters: " + e.getMessage(), e);
+                return new ImagingParameters();
+            }
+        }
+        return null;
     }
 }
diff --git a/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java b/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
index e4467a6..607f635 100644
--- a/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
@@ -42,9 +42,10 @@ import org.apache.commons.imaging.formats.pcx.PcxImageParser;
 import org.apache.commons.imaging.formats.pcx.PcxImagingParameters;
 
 public class DcxImageParser extends ImageParser<PcxImagingParameters> {
+    private static final ImageFormat imageFormat = ImageFormats.DCX;
     // See http://www.fileformat.fine/format/pcx/egff.htm for documentation
-    private static final String DEFAULT_EXTENSION = ".dcx";
-    private static final String[] ACCEPTED_EXTENSIONS = { ".dcx", };
+    private static final String DEFAULT_EXTENSION = imageFormat.getDefaultExtension();
+    private static final String[] ACCEPTED_EXTENSIONS = imageFormat.getExtensions();
 
     public DcxImageParser() {
         super.setByteOrder(ByteOrder.LITTLE_ENDIAN);
@@ -67,9 +68,7 @@ public class DcxImageParser extends ImageParser<PcxImagingParameters> {
 
     @Override
     protected ImageFormat[] getAcceptedTypes() {
-        return new ImageFormat[] {
-                ImageFormats.DCX, //
-        };
+        return new ImageFormat[] { ImageFormats.DCX };
     }
 
     // FIXME should throw UOE
diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
index e4bb582..b7e446f 100644
--- a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
@@ -359,6 +359,9 @@ public class JpegImageParser extends ImageParser<JpegImagingParameters> implemen
             return null;
         }
 
+        if (params == null) {
+            params = new JpegImagingParameters();
+        }
         params.setReadThumbnails(Boolean.TRUE);
 
         return (TiffImageMetadata) new TiffImageParser().getMetadata(bytes,
diff --git a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
index 943435c..a1aab34 100644
--- a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
+++ b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
@@ -40,6 +40,7 @@ import org.apache.commons.imaging.ImageReadException;
 import org.apache.commons.imaging.Imaging;
 import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.formats.jpeg.JpegImagingParameters;
+import org.apache.commons.imaging.formats.tiff.TiffImagingParameters;
 import org.apache.commons.imaging.internal.Debug;
 import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -160,15 +161,14 @@ public class ByteSourceImageTest extends ByteSourceTest {
     public void checkGetImageInfo(final File imageFile, final byte[] imageFileBytes)
             throws IOException, ImageReadException, IllegalAccessException,
             IllegalArgumentException, InvocationTargetException {
-        final ImagingParameters params;
         final boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
         final ImageFormat imageFormat = Imaging.guessFormat(imageFile);
-        if (imageFormat.equals(ImageFormats.TIFF)
-                || imageFormat.equals(ImageFormats.JPEG)) {
-            params = new JpegImagingParameters();
+        final ImagingParameters params = imageFormat.createImagingParameters();
+        if (imageFormat == ImageFormats.TIFF) {
+            ((TiffImagingParameters) params).setReadThumbnails(Boolean.valueOf(!ignoreImageData));
+        }
+        if (imageFormat == ImageFormats.JPEG) {
             ((JpegImagingParameters) params).setReadThumbnails(Boolean.valueOf(!ignoreImageData));
-        } else {
-            params = new ImagingParameters();
         }
 
         final ImageInfo imageInfoFile = Imaging.getImageInfo(imageFile, params);
diff --git a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
index db12db0..69574b9 100644
--- a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
+++ b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
@@ -71,7 +71,7 @@ public class XmpUpdateTest extends ImagingTest {
             }
 
             final File tempFile = File.createTempFile(imageFile.getName() + ".", "."
-                    + imageFormat.getExtension());
+                    + imageFormat.getDefaultExtension());
             final BufferedImage image = Imaging.getBufferedImage(imageFile);
 
             // ----
diff --git a/src/test/java/org/apache/commons/imaging/roundtrip/NullParametersRoundtripTest.java b/src/test/java/org/apache/commons/imaging/roundtrip/NullParametersRoundtripTest.java
index c5c4a0c..a3e02c4 100644
--- a/src/test/java/org/apache/commons/imaging/roundtrip/NullParametersRoundtripTest.java
+++ b/src/test/java/org/apache/commons/imaging/roundtrip/NullParametersRoundtripTest.java
@@ -37,7 +37,7 @@ public class NullParametersRoundtripTest extends RoundtripBase {
     @MethodSource("data")
     public void testNullParametersRoundtrip(final FormatInfo formatInfo) throws Exception {
         final BufferedImage testImage = TestImages.createFullColorImage(1, 1);
-        final File temp1 = File.createTempFile("nullParameters.", "." + formatInfo.format.getExtension());
+        final File temp1 = File.createTempFile("nullParameters.", "." + formatInfo.format.getDefaultExtension());
         Imaging.writeImage(testImage, temp1, null);
         Imaging.getImageInfo(temp1, null);
         Imaging.getImageSize(temp1, null);
diff --git a/src/test/java/org/apache/commons/imaging/roundtrip/PixelDensityRoundtrip.java b/src/test/java/org/apache/commons/imaging/roundtrip/PixelDensityRoundtrip.java
index dd1b102..3e88dbe 100644
--- a/src/test/java/org/apache/commons/imaging/roundtrip/PixelDensityRoundtrip.java
+++ b/src/test/java/org/apache/commons/imaging/roundtrip/PixelDensityRoundtrip.java
@@ -42,7 +42,7 @@ public class PixelDensityRoundtrip extends RoundtripBase {
         final BufferedImage testImage = TestImages.createFullColorImage(2, 2);
 
         final File temp1 = File.createTempFile("pixeldensity.", "."
-                + formatInfo.format.getExtension());
+                + formatInfo.format.getDefaultExtension());
 
         final ImagingParameters params = new ImagingParameters();
         params.setImageFormat(formatInfo.format);
diff --git a/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java b/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
index bff21f3..1905155 100644
--- a/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
+++ b/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
@@ -37,7 +37,7 @@ public class RoundtripBase {
                              final String tempPrefix, final boolean imageExact) throws IOException,
             ImageReadException, ImageWriteException {
         final File temp1 = File.createTempFile(tempPrefix + ".", "."
-                + formatInfo.format.getExtension());
+                + formatInfo.format.getDefaultExtension());
         Debug.debug("tempFile: " + temp1.getName());
 
         final ImagingParameters params = new ImagingParameters();
@@ -57,8 +57,7 @@ public class RoundtripBase {
 
         if (formatInfo.identicalSecondWrite) {
             final File temp2 = File.createTempFile(tempPrefix + ".", "."
-                    + formatInfo.format.getExtension());
-            // Debug.debug("tempFile: " + tempFile.getName());
+                    + formatInfo.format.getDefaultExtension());
             Imaging.writeImage(image2, temp2, params);
 
             ImageAsserts.assertEquals(temp1, temp2);