Skip to content

Commit b0308e2

Browse files
XGC-146: Convert WebP to JPEG
1 parent 2fe6b9b commit b0308e2

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.awt.image.Raster;
3333
import java.awt.image.RenderedImage;
3434
import java.awt.image.WritableRaster;
35+
import java.io.ByteArrayInputStream;
3536
import java.io.ByteArrayOutputStream;
3637
import java.io.FileNotFoundException;
3738
import java.io.IOException;
@@ -45,15 +46,19 @@
4546
import java.util.zip.Inflater;
4647

4748
import javax.imageio.IIOException;
49+
import javax.imageio.IIOImage;
4850
import javax.imageio.ImageIO;
4951
import javax.imageio.ImageReadParam;
5052
import javax.imageio.ImageReader;
5153
import javax.imageio.ImageTypeSpecifier;
54+
import javax.imageio.ImageWriteParam;
55+
import javax.imageio.ImageWriter;
5256
import javax.imageio.metadata.IIOMetadata;
5357
import javax.imageio.metadata.IIOMetadataFormatImpl;
5458
import javax.imageio.metadata.IIOMetadataNode;
5559
import javax.imageio.spi.IIOServiceProvider;
5660
import javax.imageio.stream.ImageInputStream;
61+
import javax.imageio.stream.ImageOutputStream;
5762
import javax.xml.transform.Source;
5863

5964
import org.w3c.dom.Element;
@@ -69,8 +74,10 @@
6974
import org.apache.xmlgraphics.image.loader.ImageSessionContext;
7075
import org.apache.xmlgraphics.image.loader.impl.AbstractImageLoader;
7176
import org.apache.xmlgraphics.image.loader.impl.ImageBuffered;
77+
import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
7278
import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
7379
import org.apache.xmlgraphics.image.loader.util.ImageUtil;
80+
7481
import org.apache.xmlgraphics.io.XmlSourceUtil;
7582
import org.apache.xmlgraphics.java2d.color.profile.ColorProfileUtil;
7683

@@ -251,6 +258,10 @@ public Image loadImage(ImageInfo info, Map<String, Object> hints, ImageSessionCo
251258
}
252259
}
253260

261+
if ("image/webp".equals(info.getMimeType()) && !hints.containsKey("CMYK")) {
262+
//skip for AFP by checking hints map
263+
return convertToJPEG(info, imageData);
264+
}
254265
if (ImageFlavor.BUFFERED_IMAGE.equals(this.targetFlavor)) {
255266
imageData = rgbToCmyk((BufferedImage) imageData, info, session);
256267
return new ImageBuffered(info, (BufferedImage)imageData, transparentColor);
@@ -259,6 +270,21 @@ public Image loadImage(ImageInfo info, Map<String, Object> hints, ImageSessionCo
259270
}
260271
}
261272

273+
private ImageRawJPEG convertToJPEG(ImageInfo info, RenderedImage imageData) throws IOException {
274+
ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
275+
ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
276+
jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
277+
jpgWriteParam.setCompressionQuality(0.8f);
278+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
279+
ImageOutputStream outputStream = ImageIO.createImageOutputStream(bos);
280+
jpgWriter.setOutput(outputStream);
281+
IIOImage outputImage = new IIOImage(imageData, null, null);
282+
jpgWriter.write(null, outputImage, jpgWriteParam);
283+
jpgWriter.dispose();
284+
return new ImageRawJPEG(info, new ByteArrayInputStream(bos.toByteArray()), 0,
285+
imageData.getColorModel().getColorSpace(), null, false);
286+
}
287+
262288
/**
263289
* Convert RGB to CMYK using ICC file passed via fop.xconf
264290
*/

src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderImageIOTestCase.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.awt.image.BufferedImage;
2323
import java.io.File;
2424
import java.net.URL;
25+
import java.util.HashMap;
2526

2627
import org.junit.Assert;
2728
import org.junit.Test;
@@ -74,4 +75,14 @@ public void testRGBToCMYK() throws Exception {
7475
Assert.assertEquals(image.getBufferedImage().getType(), BufferedImage.TYPE_CUSTOM);
7576
Assert.assertEquals(image.getBufferedImage().getColorModel().getNumColorComponents(), 4);
7677
}
78+
79+
@Test
80+
public void testWebP() throws Exception {
81+
//Use jpg file to avoid need for TwelveMonkeys jars
82+
File file = new File("test/images/bgimg300dpi.jpg");
83+
ImageInfo info = new ImageInfo(file.toURI().toASCIIString(), "image/webp");
84+
Image image = new ImageLoaderImageIO(ImageFlavor.BUFFERED_IMAGE)
85+
.loadImage(info, new HashMap<>(), new MockImageSessionContext(MockImageContext.newSafeInstance()));
86+
Assert.assertTrue(image instanceof ImageRawJPEG);
87+
}
7788
}

0 commit comments

Comments
 (0)