1
+ package org .teacon .slides .cache ;
2
+
3
+ import org .teacon .slides .Slideshow ;
4
+
5
+ import javax .imageio .ImageIO ;
6
+ import javax .imageio .ImageReader ;
7
+ import javax .imageio .stream .MemoryCacheImageInputStream ;
8
+ import javax .imageio .stream .MemoryCacheImageOutputStream ;
9
+ import java .awt .image .BufferedImage ;
10
+ import java .io .ByteArrayInputStream ;
11
+ import java .io .ByteArrayOutputStream ;
12
+ import java .util .Iterator ;
13
+
14
+ public final class WebpToPng {
15
+ private static boolean isWebP (byte [] webp ) {
16
+ if (webp .length < 12 ) {
17
+ return false ;
18
+ }
19
+ boolean isRiff = webp [0 ] == 'R' && webp [1 ] == 'I' && webp [2 ] == 'F' && webp [3 ] == 'F' ;
20
+ boolean isWebp = webp [8 ] == 'W' && webp [9 ] == 'E' && webp [10 ] == 'B' && webp [11 ] == 'P' ;
21
+ return isRiff && isWebp ;
22
+ }
23
+
24
+ public static byte [] webpToPng (byte [] webp ) {
25
+ try {
26
+ if (!isWebP (webp )) {
27
+ return webp ;
28
+ }
29
+ Iterator <ImageReader > imageReader = ImageIO .getImageReadersByFormatName ("webp" );
30
+ if (!imageReader .hasNext ()) {
31
+ return webp ;
32
+ }
33
+ ImageReader webpReader = imageReader .next ();
34
+ try (ByteArrayInputStream bais = new ByteArrayInputStream (webp ); MemoryCacheImageInputStream inputStream = new MemoryCacheImageInputStream (bais )) {
35
+ webpReader .setInput (inputStream );
36
+ BufferedImage bufferedImage = webpReader .read (0 );
37
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream (); MemoryCacheImageOutputStream outputStream = new MemoryCacheImageOutputStream (baos )) {
38
+ ImageIO .write (bufferedImage , "png" , outputStream );
39
+ outputStream .flush ();
40
+ return baos .toByteArray ();
41
+ }
42
+ }
43
+ } catch (Exception e ) {
44
+ Slideshow .LOGGER .warn ("Failed to convert webp to PNG" , e );
45
+ return webp ;
46
+ }
47
+ }
48
+ }
0 commit comments