diff --git a/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/CWebpHandler.java b/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/CWebpHandler.java index cebf7b39..f13b89b6 100644 --- a/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/CWebpHandler.java +++ b/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/CWebpHandler.java @@ -47,12 +47,13 @@ public byte[] convert(byte[] bytes, int q, int z, boolean lossless, - boolean withoutAlpha) throws IOException { + boolean withoutAlpha, + boolean multiThread) throws IOException { Path input = Files.createTempFile("input", "webp").toAbsolutePath(); Path output = Files.createTempFile("to_webp", "webp").toAbsolutePath(); try { Files.write(input, bytes, StandardOpenOption.CREATE); - convert(input, output, m, q, z, lossless, withoutAlpha); + convert(input, output, m, q, z, lossless, withoutAlpha, multiThread); return Files.readAllBytes(output); } finally { try { @@ -72,8 +73,8 @@ private void convert(Path input, int q, int z, boolean lossless, - boolean withoutAlpha) throws IOException { - + boolean withoutAlpha, + boolean multiThread) throws IOException { Path stdout = Files.createTempFile("stdout", "webp"); List commands = new ArrayList<>(); commands.add(binary.toAbsolutePath().toString()); @@ -95,6 +96,9 @@ private void convert(Path input, if (withoutAlpha) { commands.add("-noalpha"); } + if (multiThread) { + commands.add("-mt"); + } commands.add(input.toAbsolutePath().toString()); commands.add("-o"); commands.add(target.toAbsolutePath().toString()); diff --git a/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/WebpWriter.java b/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/WebpWriter.java index 9091fb42..9d3031a6 100644 --- a/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/WebpWriter.java +++ b/scrimage-webp/src/main/java/com/sksamuel/scrimage/webp/WebpWriter.java @@ -20,6 +20,7 @@ public class WebpWriter implements ImageWriter { private final int m; private final boolean lossless; private final boolean noAlpha; + private final boolean multiThread; public WebpWriter() { z = -1; @@ -27,6 +28,7 @@ public WebpWriter() { m = -1; lossless = false; noAlpha = false; + multiThread = false; } public WebpWriter(int z, int q, int m, boolean lossless) { @@ -35,6 +37,7 @@ public WebpWriter(int z, int q, int m, boolean lossless) { this.m = m; this.lossless = lossless; this.noAlpha = false; + this.multiThread = false; } public WebpWriter(int z, int q, int m, boolean lossless, boolean noAlpha) { @@ -43,6 +46,16 @@ public WebpWriter(int z, int q, int m, boolean lossless, boolean noAlpha) { this.m = m; this.lossless = lossless; this.noAlpha = noAlpha; + this.multiThread = false; + } + + public WebpWriter(int z, int q, int m, boolean lossless, boolean noAlpha, boolean multiThread) { + this.z = z; + this.q = q; + this.m = m; + this.lossless = lossless; + this.noAlpha = noAlpha; + this.multiThread = multiThread; } public WebpWriter withLossless() { @@ -53,6 +66,10 @@ public WebpWriter withoutAlpha() { return new WebpWriter(z, q, m, lossless, true); } + public WebpWriter withMultiThread() { + return new WebpWriter(z, q, m, lossless, noAlpha, multiThread); + } + public WebpWriter withQ(int q) { if (q < 0) throw new IllegalArgumentException("q must be between 0 and 100"); if (q > 100) throw new IllegalArgumentException("q must be between 0 and 100"); @@ -73,7 +90,7 @@ public WebpWriter withZ(int z) { @Override public void write(AwtImage image, ImageMetadata metadata, OutputStream out) throws IOException { - byte[] bytes = handler.convert(image.bytes(PngWriter.NoCompression), m, q, z, lossless, noAlpha); + byte[] bytes = handler.convert(image.bytes(PngWriter.NoCompression), m, q, z, lossless, noAlpha, multiThread); out.write(bytes); } } diff --git a/scrimage-webp/src/test/kotlin/com/sksamuel/scrimage/webp/WebpTest.kt b/scrimage-webp/src/test/kotlin/com/sksamuel/scrimage/webp/WebpTest.kt index ec95d456..f15ccdf4 100644 --- a/scrimage-webp/src/test/kotlin/com/sksamuel/scrimage/webp/WebpTest.kt +++ b/scrimage-webp/src/test/kotlin/com/sksamuel/scrimage/webp/WebpTest.kt @@ -30,6 +30,13 @@ class WebpTest : FunSpec() { javaClass.getResourceAsStream("/noAlpha.webp").readBytes() } + test("render with multi thread") { + val webpWriter = WebpWriter.MAX_LOSSLESS_COMPRESSION.withMultiThread() + ImmutableImage.loader().fromResource("/spacedock.jpg").scale(0.5) + .bytes(webpWriter) shouldBe + javaClass.getResourceAsStream("/spacedock.webp").readBytes() + } + test("dwebp should capture error on failure") { val dwebpPath = WebpHandler.getBinaryPaths("dwebp")[2]