From 52ca89e716535006a9d747adafb2e1124e5b23e6 Mon Sep 17 00:00:00 2001 From: Rguihard Date: Tue, 22 Apr 2025 09:21:07 +0200 Subject: [PATCH] Webp image support Append webp magic number detection on the Image class --- .../src/main/java/com/lowagie/text/Image.java | 29 +++++++++++++++++++ .../java/com/lowagie/text/ImageLoader.java | 17 +++++++++++ 2 files changed, 46 insertions(+) diff --git a/openpdf/src/main/java/com/lowagie/text/Image.java b/openpdf/src/main/java/com/lowagie/text/Image.java index 79f93cb8b..a4e4f338e 100644 --- a/openpdf/src/main/java/com/lowagie/text/Image.java +++ b/openpdf/src/main/java/com/lowagie/text/Image.java @@ -482,6 +482,11 @@ public static Image getInstance(URL url) throws BadElementException, int c6 = is.read(); int c7 = is.read(); int c8 = is.read(); + // webp + int c9 = is.read(); + int c10 = is.read(); + int c11 = is.read(); + int c12 = is.read(); is.close(); is = null; @@ -519,6 +524,15 @@ public static Image getInstance(URL url) throws BadElementException, img = ImageLoader.getTiffImage(url); return img; } + if (c1 == 'R' && c2 == 'I' + && c3 == 'F' + && c4 == 'F' + && c9 == 'W' + && c10 == 'E' + && c11 == 'B' + && c12 == 'P') { + return ImageLoader.getWebpImage(imgb); + } if (c1 == 0x97 && c2 == 'J' && c3 == 'B' && c4 == '2' && c5 == '\r' && c6 == '\n' && c7 == 0x1a && c8 == '\n') { throw new IOException(url.toString() @@ -612,6 +626,21 @@ public static Image getInstance(byte[] imgb) throws BadElementException, || (c1 == 'I' && c2 == 'I' && c3 == 42 && c4 == 0)) { return ImageLoader.getTiffImage(imgb); } + if (c1 == 'R' && c2 == 'I' + && c3 == 'F' + && c4 == 'F') { + is = new java.io.ByteArrayInputStream(imgb); + long skipped = is.skip(8); + if(skipped == 8) { + final int c9 = is.read(); + final int c10 = is.read(); + final int c11 = is.read(); + final int c12 = is.read(); + if (c9 == 'W' && c10 == 'E' && c11 == 'B' && c12 == 'P') { + return ImageLoader.getWebpImage(imgb); + } + } + } if (c1 == 0x97 && c2 == 'J' && c3 == 'B' && c4 == '2') { is = new java.io.ByteArrayInputStream(imgb); is.skip(4); diff --git a/openpdf/src/main/java/com/lowagie/text/ImageLoader.java b/openpdf/src/main/java/com/lowagie/text/ImageLoader.java index fd959c275..8c36bd8fd 100644 --- a/openpdf/src/main/java/com/lowagie/text/ImageLoader.java +++ b/openpdf/src/main/java/com/lowagie/text/ImageLoader.java @@ -176,6 +176,23 @@ public static Image getTiffImage(byte[] imageData) { } } + /** + * Creates an Image from an array of webp image bytes. + * https://datatracker.ietf.org/doc/rfc9649/ + * + * @param imageData bytes of the webp image + * @return an objet of type Image + */ + public static Image getWebpImage(byte[] imageData) { + try (InputStream is = new ByteArrayInputStream(imageData)) { + BufferedImage bufferedImage = ImageIO.read(is); + return Image.getInstance(bufferedImage, null, false); + + } catch (Exception e) { + throw new ExceptionConverter(e); + } + } + /** * Creates an Image from a JPEG image file in a byte array. *