libwebp clib Multimedia

libwebp WebP codec. Lossy/lossless encode, decode, quality, animation, convert from JPEG/PNG.

ppm install libwebp

Overview

libwebp is Google's WebP image codec. Lossy WebP is ~25–34% smaller than JPEG at equivalent quality. Lossless WebP is ~26% smaller than PNG. Supports RGBA, animation, ICC profiles, and Exif/XMP metadata. WebP is natively supported by all modern browsers and is ideal for web delivery.

CLib package

Ubuntu/Debian: sudo apt install libwebp-dev

Decode & Encode

uses libwebp;

{ decode WebP file to raw RGBA pixels }
var img := DecodeFile('/path/to/image.webp');
WriteLn('Size: ', img.Width, 'x', img.Height);

{ encode to lossy WebP — quality 0 (worst) .. 100 (best) }
var data := Encode(img, 80.0);
WriteLn('WebP size: ', Length(data), ' bytes');

{ save to file }
EncodeFile(img, '/tmp/output.webp', 80.0);

Lossy vs Lossless

uses libwebp;

var img := DecodeFile('photo.webp');

{ lossy encode with preset }
var photo    := EncodePreset(img, wpPhoto,   82.0);
var drawing  := EncodePreset(img, wpDrawing, 90.0);
var icon     := EncodePreset(img, wpIcon,    95.0);

{ lossless encode — effort 0 (fast) .. 9 (max compression) }
var lossless := EncodeLossless(img, 6);
EncodeLosslessFile(img, 'output-lossless.webp', 6);

WriteLn('Lossy photo:  ', Length(photo),    ' bytes');
WriteLn('Lossless:     ', Length(lossless), ' bytes');

Convert from JPEG / PNG

uses libwebp;

{ convert existing JPEG to WebP (lossy) }
var jpgData := ReadFile('photo.jpg');
var webp    := FromJPEG(jpgData, 80.0);
WriteFile('photo.webp', webp);

{ convert PNG to WebP (lossless, preserves alpha) }
var pngData    := ReadFile('icon.png');
var webpLossless := FromPNG(pngData);
WriteFile('icon.webp', webpLossless);

{ convert WebP back to PNG or JPEG }
var backPNG  := ToPNG(webp);
var backJPEG := ToJPEG(webp, 90);

Animation

uses libwebp;

{ decode all frames from animated WebP }
var frames := DecodeFrames(ReadFile('animation.webp'));
WriteLn('Frame count: ', Length(frames));
WriteLn('Frame 0 duration: ', frames[0].Duration, ' ms');

{ encode animated WebP from frames array }
{ loop=0 means infinite loop }
var animated := EncodeAnimation(frames, 80.0, 0);
WriteFile('output.webp', animated);

Resize & Pixel Access

uses libwebp;

{ decode and resize in a single efficient pass }
var thumb := DecodeResized(ReadFile('large.webp'), 160, 120);

{ pixel-level access (RGBA) }
var img := DecodeFile('image.webp');
var px  := GetPixel(img, 50, 30);   { returns [R, G, B, A] }
SetPixel(img, 50, 30, [0, 128, 255, 255]);   { opaque blue }

Image Info

uses libwebp;

{ read metadata without decoding pixels }
var info := ReadInfoFile('image.webp');
WriteLn('Width:        ', info.Width);
WriteLn('Height:       ', info.Height);
WriteLn('HasAlpha:     ', info.HasAlpha);
WriteLn('HasAnimation: ', info.HasAnimation);
WriteLn('FrameCount:   ', info.FrameCount);
WriteLn('Format:       ', info.Format);    { "lossy", "lossless", "extended" }

WriteLn('libwebp version: ', WebPVersion());
WriteLn('Is WebP: ', IsWebP(ReadFile('image.webp')));

Package Info

Version1.0.0
Typeclib
CategoryMultimedia
Authorgustavo
Native liblibpai_libwebp.so

API

  • Decode(data)
  • DecodeFile(path)
  • DecodeRGB(data)
  • DecodeResized(data,w,h)
  • ReadInfo(data)
  • ReadInfoFile(path)
  • Encode(img,quality)
  • EncodeFile(img,path,q)
  • EncodePreset(img,preset,q)
  • EncodeLossless(img,effort)
  • EncodeLosslessFile(img,p,e)
  • FromJPEG(data,quality)
  • FromPNG(data)
  • ToPNG(data)
  • ToJPEG(data,quality)
  • DecodeFrames(data)
  • EncodeAnimation(frames,q,loop)
  • GetPixel(img,x,y)
  • SetPixel(img,x,y,vals)
  • WebPVersion()
  • IsWebP(data)
Presets

wpDefault • wpPicture (portrait) • wpPhoto (outdoor) • wpDrawing (line art) • wpIcon (small colorful) • wpText (text-heavy images)