Skip to content

HugoSmits86/nativewebp

Repository files navigation

Codecov Coverage Go Reference License: MIT

Native WebP for Go

This is a native WebP encoder written entirely in Go, with no dependencies on libwebp or other external libraries. Designed for performance and efficiency, this encoder generates smaller files than the standard Go PNG encoder and is approximately 50% faster in execution.

Currently, the encoder supports only WebP lossless images (VP8L).

Benchmark

We conducted a quick benchmark to showcase file size reduction and encoding performance. Using an image from Google’s WebP Lossless and Alpha Gallery, we compared the results of our nativewebp encoder with the standard PNG encoder.

For the PNG encoder, we applied the png.BestCompression setting to achieve the most competitive compression outcomes.

PNG encoder nativeWebP encoder reduction

file size 120 kb 96 kb 20% smaller
encoding time 42945049 ns/op 27716447 ns/op 35% faster

file size 46 kb 36 kb 22% smaller
encoding time 98509399 ns/op 31461759 ns/op 68% faster

file size 236 kb 194 kb 18% smaller
encoding time 178205535 ns/op 102454192 ns/op 43% faster

file size 53 kb 41 kb 23% smaller
encoding time 29088555 ns/op 14959849 ns/op 49% faster

file size 139 kb 123 kb 12% smaller
encoding time 63423995 ns/op 21717392 ns/op 66% faster

image source: https://developers.google.com/speed/webp/gallery2

Installation

To install the nativewebp package, use the following command:

go get github.com/HugoSmits86/nativewebp

Usage

Here’s a simple example of how to encode an image:

file, err := os.Create(name)
if err != nil {
  log.Fatalf("Error creating file %s: %v", name, err)
}
defer file.Close()

err = nativewebp.Encode(file, img, nil)
if err != nil {
  log.Fatalf("Error encoding image to WebP: %v", err)
}