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)