You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by ss...@apache.org on 2025/06/12 10:58:27 UTC

(xmlgraphics-commons) branch main updated: XGC-146: Convert WebP to JPEG

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

ssteiner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/xmlgraphics-commons.git


The following commit(s) were added to refs/heads/main by this push:
     new b0308e2  XGC-146: Convert WebP to JPEG
b0308e2 is described below

commit b0308e2d522db50edfd29b49937ac28a19562d1a
Author: Simon Steiner <ss...@apache.org>
AuthorDate: Thu Jun 12 11:57:49 2025 +0100

    XGC-146: Convert WebP to JPEG
---
 .../loader/impl/imageio/ImageLoaderImageIO.java    | 26 ++++++++++++++++++++++
 .../loader/impl/ImageLoaderImageIOTestCase.java    | 11 +++++++++
 2 files changed, 37 insertions(+)

diff --git a/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java b/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java
index abff36b..b7bef78 100644
--- a/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java
+++ b/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java
@@ -32,6 +32,7 @@ import java.awt.image.IndexColorModel;
 import java.awt.image.Raster;
 import java.awt.image.RenderedImage;
 import java.awt.image.WritableRaster;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -45,15 +46,19 @@ import java.util.zip.DataFormatException;
 import java.util.zip.Inflater;
 
 import javax.imageio.IIOException;
+import javax.imageio.IIOImage;
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReadParam;
 import javax.imageio.ImageReader;
 import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
 import javax.imageio.metadata.IIOMetadata;
 import javax.imageio.metadata.IIOMetadataFormatImpl;
 import javax.imageio.metadata.IIOMetadataNode;
 import javax.imageio.spi.IIOServiceProvider;
 import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageOutputStream;
 import javax.xml.transform.Source;
 
 import org.w3c.dom.Element;
@@ -69,8 +74,10 @@ import org.apache.xmlgraphics.image.loader.ImageInfo;
 import org.apache.xmlgraphics.image.loader.ImageSessionContext;
 import org.apache.xmlgraphics.image.loader.impl.AbstractImageLoader;
 import org.apache.xmlgraphics.image.loader.impl.ImageBuffered;
+import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
 import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
 import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+
 import org.apache.xmlgraphics.io.XmlSourceUtil;
 import org.apache.xmlgraphics.java2d.color.profile.ColorProfileUtil;
 
@@ -251,6 +258,10 @@ public class ImageLoaderImageIO extends AbstractImageLoader {
             }
         }
 
+        if ("image/webp".equals(info.getMimeType()) && !hints.containsKey("CMYK")) {
+            //skip for AFP by checking hints map
+            return convertToJPEG(info, imageData);
+        }
         if (ImageFlavor.BUFFERED_IMAGE.equals(this.targetFlavor)) {
             imageData = rgbToCmyk((BufferedImage) imageData, info, session);
             return new ImageBuffered(info, (BufferedImage)imageData, transparentColor);
@@ -259,6 +270,21 @@ public class ImageLoaderImageIO extends AbstractImageLoader {
         }
     }
 
+    private ImageRawJPEG convertToJPEG(ImageInfo info, RenderedImage imageData) throws IOException {
+        ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
+        ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
+        jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+        jpgWriteParam.setCompressionQuality(0.8f);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ImageOutputStream outputStream = ImageIO.createImageOutputStream(bos);
+        jpgWriter.setOutput(outputStream);
+        IIOImage outputImage = new IIOImage(imageData, null, null);
+        jpgWriter.write(null, outputImage, jpgWriteParam);
+        jpgWriter.dispose();
+        return new ImageRawJPEG(info, new ByteArrayInputStream(bos.toByteArray()), 0,
+                imageData.getColorModel().getColorSpace(), null, false);
+    }
+
     /**
      * Convert RGB to CMYK using ICC file passed via fop.xconf
      */
diff --git a/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderImageIOTestCase.java b/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderImageIOTestCase.java
index 0ce09d7..36a57be 100644
--- a/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderImageIOTestCase.java
+++ b/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderImageIOTestCase.java
@@ -22,6 +22,7 @@ package org.apache.xmlgraphics.image.loader.impl;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.net.URL;
+import java.util.HashMap;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -74,4 +75,14 @@ public class ImageLoaderImageIOTestCase {
         Assert.assertEquals(image.getBufferedImage().getType(), BufferedImage.TYPE_CUSTOM);
         Assert.assertEquals(image.getBufferedImage().getColorModel().getNumColorComponents(), 4);
     }
+
+    @Test
+    public void testWebP() throws Exception {
+        //Use jpg file to avoid need for TwelveMonkeys jars
+        File file = new File("test/images/bgimg300dpi.jpg");
+        ImageInfo info = new ImageInfo(file.toURI().toASCIIString(), "image/webp");
+        Image image = new ImageLoaderImageIO(ImageFlavor.BUFFERED_IMAGE)
+                .loadImage(info, new HashMap<>(), new MockImageSessionContext(MockImageContext.newSafeInstance()));
+        Assert.assertTrue(image instanceof ImageRawJPEG);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org