webp-imageio
| Language | Java 11+ (written in Kotlin and Java) |
|---|---|
| License | Apache 2.0 (bundled libwebp: BSD-3-Clause) |
| Repository | github.com/usefulness/webp-imageio |
| Documentation | README |
| Depends on | bundled native libwebp for Windows, macOS (x64, arm64) and Linux |
| Read / write | yes / yes, lossy and lossless still images |
webp-imageio registers a WebP reader and writer with Java’s ImageIO, so existing ImageIO.read / ImageIO.write code handles .webp files. It calls libwebp through JNI and ships the native libraries inside the jar, which it extracts at first use. It’s a maintained fork of the original Luciad / sejda plugin and keeps the com.luciad.imageio.webp package.
It doesn’t read or write animated WebP. On platforms without a bundled native library, use the pure Java TwelveMonkeys reader.
Installation#
Gradle:
Kotlin
dependencies {
implementation("com.github.usefulness:webp-imageio:0.10.0")
}
Maven:
XML
<dependency>
<groupId>com.github.usefulness</groupId>
<artifactId>webp-imageio</artifactId>
<version>0.10.0</version>
</dependency>
Basic usage: read WebP, write WebP#
Java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Main {
public static void main(String[] args) throws IOException {
BufferedImage image = ImageIO.read(new File("in.webp"));
if (image == null) throw new IOException("no reader for this file");
System.out.println(image.getWidth() + " x " + image.getHeight());
// default settings: lossy, quality 75
ImageIO.write(image, "webp", new File("out.webp"));
ImageIO.write(image, "png", new File("out.png"));
}
}
How to set WebP quality and compression type#
Java
import com.luciad.imageio.webp.CompressionType;
import com.luciad.imageio.webp.WebPWriteParam;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
BufferedImage image = ImageIO.read(new File("photo.jpg"));
ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();
WebPWriteParam param = (WebPWriteParam) writer.getDefaultWriteParam();
param.setCompressionType(CompressionType.Lossy); // or CompressionType.Lossless
param.setCompressionQuality(0.8f); // 0..1; for lossless it's the effort
param.setMethod(6); // 0 = fast .. 6 = smallest
param.setUseSharpYUV(true);
try (FileImageOutputStream out = new FileImageOutputStream(new File("photo.webp"))) {
writer.setOutput(out);
writer.write(null, new IIOImage(image, null, null), param);
} finally {
writer.dispose();
}
How to get WebP dimensions without decoding#
Java
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
try (ImageInputStream in = ImageIO.createImageInputStream(new File("in.webp"))) {
ImageReader reader = ImageIO.getImageReaders(in).next();
reader.setInput(in);
System.out.println(reader.getWidth(0) + " x " + reader.getHeight(0));
reader.dispose();
}
How to read with decoder options#
WebPReadParam exposes libwebp’s decoder settings, e.g. faster decoding without the in-loop filter:
Java
import com.luciad.imageio.webp.WebPReadParam;
ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();
WebPReadParam readParam = new WebPReadParam();
readParam.setBypassFiltering(true);
try (ImageInputStream in = ImageIO.createImageInputStream(new File("in.webp"))) {
reader.setInput(in);
BufferedImage image = reader.read(0, readParam);
}
Tips#
- If both webp-imageio and TwelveMonkeys are on the classpath,
ImageIO.readuses whichever reader registered first; get the reader by MIME type to pick one. - The native library is extracted to the temp directory; in locked-down environments make sure it’s writable.