libjpeg clib Multimedia

libjpeg-turbo JPEG codec. Encode, Decode, quality control, progressive, resize, metadata.

ppm install libjpeg

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).