All formats

webp-imageio

LanguageJava 11+ (written in Kotlin and Java)
LicenseApache 2.0 (bundled libwebp: BSD-3-Clause)
Repositorygithub.com/usefulness/webp-imageio
DocumentationREADME
Depends onbundled native libwebp for Windows, macOS (x64, arm64) and Linux
Read / writeyes / 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#