Skip to content

Commit ed5cd09

Browse files
committed
add webp support
1 parent 0614522 commit ed5cd09

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/main/java/org/teacon/slides/cache/ImageCache.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public CompletableFuture<byte[]> getResource(@Nonnull URI location, boolean onli
7373
final HttpCacheContext context = HttpCacheContext.create();
7474
try (CloseableHttpResponse response = createResponse(location, context, online)) {
7575
try {
76-
return IOUtils.toByteArray(response.getEntity().getContent());
76+
return WebpToPng.webpToPng(IOUtils.toByteArray(response.getEntity().getContent()));
7777
} catch (IOException e) {
7878
if (online) {
7979
Slideshow.LOGGER.warn("Failed to read bytes from remote source.", e);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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

Comments
 (0)