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