3232import java .awt .image .Raster ;
3333import java .awt .image .RenderedImage ;
3434import java .awt .image .WritableRaster ;
35+ import java .io .ByteArrayInputStream ;
3536import java .io .ByteArrayOutputStream ;
3637import java .io .FileNotFoundException ;
3738import java .io .IOException ;
4546import java .util .zip .Inflater ;
4647
4748import javax .imageio .IIOException ;
49+ import javax .imageio .IIOImage ;
4850import javax .imageio .ImageIO ;
4951import javax .imageio .ImageReadParam ;
5052import javax .imageio .ImageReader ;
5153import javax .imageio .ImageTypeSpecifier ;
54+ import javax .imageio .ImageWriteParam ;
55+ import javax .imageio .ImageWriter ;
5256import javax .imageio .metadata .IIOMetadata ;
5357import javax .imageio .metadata .IIOMetadataFormatImpl ;
5458import javax .imageio .metadata .IIOMetadataNode ;
5559import javax .imageio .spi .IIOServiceProvider ;
5660import javax .imageio .stream .ImageInputStream ;
61+ import javax .imageio .stream .ImageOutputStream ;
5762import javax .xml .transform .Source ;
5863
5964import org .w3c .dom .Element ;
6974import org .apache .xmlgraphics .image .loader .ImageSessionContext ;
7075import org .apache .xmlgraphics .image .loader .impl .AbstractImageLoader ;
7176import org .apache .xmlgraphics .image .loader .impl .ImageBuffered ;
77+ import org .apache .xmlgraphics .image .loader .impl .ImageRawJPEG ;
7278import org .apache .xmlgraphics .image .loader .impl .ImageRendered ;
7379import org .apache .xmlgraphics .image .loader .util .ImageUtil ;
80+
7481import org .apache .xmlgraphics .io .XmlSourceUtil ;
7582import 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 */
0 commit comments