Overview
libjpeg-turbo is 2–6x faster than classic libjpeg, using SIMD instructions for optimized JPEG encode/decode. It is the JPEG backend for browsers, FFmpeg, OpenCV, Qt, and Android. Raw pixel format is packed RGB (3 bytes/pixel) or RGBA (4 bytes/pixel).
CLib package
Ubuntu/Debian: sudo apt install libjpeg-turbo8-dev
Decode & Encode
uses libjpeg;
{ decode JPEG file to raw pixels }
var img := DecodeFile('/path/to/photo.jpg');
WriteLn('Size: ', img.Width, 'x', img.Height, ' ch=', img.Channels);
{ encode back to JPEG bytes at quality 85 }
var data := Encode(img, 85);
WriteLn('JPEG size: ', Length(data), ' bytes');
{ save to file }
EncodeFile(img, '/tmp/output.jpg', 85);
Quality & Progressive
uses libjpeg;
var img := DecodeFile('photo.jpg');
{ standard quality encode: 1 (worst) .. 95 (best) }
var standard := Encode(img, 75); { typical web quality }
var highQuality := Encode(img, 92); { near-lossless }
{ progressive JPEG: loads incrementally in browsers }
var progressive := EncodeProgressive(img, 80);
WriteLn('Standard: ', Length(standard), ' bytes');
WriteLn('High: ', Length(highQuality), ' bytes');
WriteLn('Progressive: ', Length(progressive), ' bytes');
Lossless Transform
uses libjpeg;
var data := ReadFile('photo.jpg'); { uses stdlib }
{ rotate without pixel decode/re-encode (no quality loss) }
var rotated := RotateLossless(data, 90); { 90, 180, or 270 }
{ flip losslessly }
var flipped := FlipLossless(data, 'h'); { 'h' or 'v' }
WriteFile('rotated.jpg', rotated);
WriteFile('flipped.jpg', flipped);
Resize & Re-compress
uses libjpeg;
{ decode and resize in a single efficient pass }
var img := DecodeResized(ReadFile('large.jpg'), 320, 240);
{ re-compress at different quality (optimize for web) }
var smaller := Recompress(ReadFile('photo.jpg'), 70);
{ optimize a file in-place (remove metadata, optimize Huffman tables) }
OptimizeFile('/var/www/images/photo.jpg');
Metadata & EXIF
uses libjpeg;
var data := ReadFile('photo.jpg');
{ read all EXIF tags as key=value pairs }
var exif := ReadEXIF(data);
WriteLn(exif); { Camera: Canon EOS R6\nISO: 400\n... }
{ strip EXIF for privacy }
var clean := StripEXIF(data);
WriteLn('With EXIF: ', Length(data), ' bytes');
WriteLn('Without EXIF: ', Length(clean), ' bytes');
{ read image info without decoding pixels }
var info := ReadInfoFile('photo.jpg');
WriteLn('Color space: ', info.ColorSpace);
WriteLn('Progressive: ', info.Progressive);
Pixel Access
uses libjpeg;
var img := DecodeFile('photo.jpg');
{ get pixel RGB at position (100, 50) }
var px := GetPixel(img, 100, 50);
WriteLn('R=', px[0], ' G=', px[1], ' B=', px[2]);
{ set pixel to red }
SetPixel(img, 100, 50, [255, 0, 0]);
Package Info
Version1.0.0
Typeclib
CategoryMultimedia
Authorgustavo
Native liblibpai_libjpeg.so
API
- Decode(data)
- DecodeFile(path)
- DecodeGray(data)
- DecodeResized(data,w,h)
- ReadInfo(data)
- ReadInfoFile(path)
- Encode(img,quality)
- EncodeFile(img,path,q)
- EncodeProgressive(img,q)
- RotateLossless(data,deg)
- FlipLossless(data,dir)
- Recompress(data,q)
- OptimizeFile(path)
- GetPixel(img,x,y)
- SetPixel(img,x,y,vals)
- ReadEXIF(data)
- StripEXIF(data)
- JPEGVersion()
- IsJPEG(data)
- RawSize(w,h,ch)
Quality guide
60–75: web thumbnails • 75–85: standard web • 85–92: high quality • 92–95: near-lossless. Avoid 95+ (file size explodes with negligible gain).