Filters & Effects

blur(int $radius)

Baseline Supported on all 12 providers.
BUCFCNGUIMIMIMIXIPIVTHWS
All providers
Anchored to gaussian σ ≈ radius/2 px: exact on imgproxy, wsrv.nl and Intervention Imagick/vips; tolerance-band on the GD paths and Imagine; imgix, Cloudflare, Cloudinary and ImageKit calibrated empirically against measured output.
Cloudinary
e_blur ceiling (2000) saturates strength at σ 20 above blur(40).

Gaussian blur. Range: 0–100, anchored to σ ≈ radius/2 px across every provider — blur(20) targets a ~10 px sigma everywhere. blur(0) is a no-op on every provider: local backends leave the image untouched and URL providers omit the parameter.

$image->blur(20);

sharpen(int $amount)

Baseline Supported on all 12 providers.
BUCFCNGUIMIMIMIXIPIVTHWS
Cloudflare
Quantized to 11 steps (0..10) — visible banding at small mid-range deltas.
Imagekit
Documented as 0..100; ImageKit's imgix migration guide hints at a ×20 scaling. Empirical calibration deferred; expect output to differ from the documented range until verified.
Imgproxy
Pro tier: ~10 sigma steps.
Thumbor
Quantized to 11 amount steps.
Cloudinary / Imagor / Imgix / Wserv
Full 0..100 precision preserved.

Sharpen. Range: 0–100.

$image->sharpen(50);

brightness(int $amount)

Widely available Unsupported on Imagekit.
BUCFCNGUIMIMIMIXIPIVTHWS
Cloudflare
Multiplier scale (1.0 = no change).
Cloudinary / Imagor / Imgix / Imgproxy / Intervention / Thumbor / Wserv
Standard -100..100 scale.

Adjust brightness. Range: -100 to 100.

$image->brightness(30);  // brighter
$image->brightness(-30); // darker

contrast(int $amount)

Widely available Unsupported on Imagekit and Imagine.
BUCFCNGUIMIMIMIXIPIVTHWS
Cloudflare
Multiplier scale (1.0 = no change).
Cloudinary / Imagor / Imgix / Imgproxy / Intervention / Thumbor / Wserv
Standard -100..100 scale.

Adjust contrast. Range: -100 to 100.

$image->contrast(30);

gamma(float $gamma)

Limited availability Only supported on Bunny, Cloudflare, Cloudinary, Imagine, Imgix, Intervention and Wserv.
BUCFCNGUIMIMIMIXIPIVTHWS
Cloudinary
Translates `pct = round((gamma - 1) × 100)`, clamped to -50..150. Large multipliers saturate.
Imgix
Same translation as Cloudinary, clamped to -100..100.

Gamma correction. Range: 0.1–9.99.

$image->gamma(2.0);

pixelate(int $size)

Limited availability Only supported on Cloudinary, Imagor, Imgix, Imgproxy and Intervention.
BUCFCNGUIMIMIMIXIPIVTHWS

Pixelate with block size. Range: 0–1000.

$image->pixelate(10);

greyscale()

Baseline Supported on all 12 providers.
BUCFCNGUIMIMIMIXIPIVTHWS

Convert to greyscale.

$image->greyscale();
Cloudflare

Emitted as saturation=0.01 (not 0) to preserve alpha on transparent sources; Cloudflare’s saturation=0 codepath forces JPEG output and fills transparency with black. See CloudflareProvider notes. saturation(-100) receives the same rewrite.

sepia()

Limited availability Only supported on Bunny, Cloudinary, Imgix, Imgproxy, Intervention and Wserv.
BUCFCNGUIMIMIMIXIPIVTHWS
All providers
Filter curve varies; no cross-provider reference implementation.

Apply sepia tone.

$image->sepia();

saturation(int $amount)

Widely available Unsupported on Imagekit.
BUCFCNGUIMIMIMIXIPIVTHWS
Cloudflare
Multiplier scale (1.0 = no change). `saturation=0` codepath emits `saturation=0.01` to preserve alpha (forces JPEG otherwise).
Cloudinary / Imagor / Imgix / Imgproxy / Intervention / Thumbor / Wserv
Standard -100..100 scale.

Adjust color saturation. Range: -100 to 100 (-100 = greyscale, 0 = unchanged, 100 = max).

$image->saturation(50);   // more vibrant
$image->saturation(-100); // greyscale equivalent
Cloudflare

saturation(-100) is emitted as saturation=0.01 (not 0) to preserve alpha on transparent sources. See greyscale() above.

hue(int $angle)

Widely available Unsupported on Cloudflare, Imagekit, Imgproxy and Thumbor.
BUCFCNGUIMIMIMIXIPIVTHWS

Rotate the hue around the color wheel. Range: 0 to 360 degrees.

$image->hue(180); // invert complementary colors

negate()

Limited availability Only supported on Cloudinary, Gumlet, Imagine, Imgix, Intervention and Wserv.
BUCFCNGUIMIMIMIXIPIVTHWS

Invert all colors (photographic negative).

$image->negate();

flip(FlipDirection $direction)

Baseline Supported on all 12 providers.
BUCFCNGUIMIMIMIXIPIVTHWS

Mirror the image.

use Timber\Chainsaw\Enum\FlipDirection;

$image->flip(FlipDirection::Horizontal);
$image->flip(FlipDirection::Vertical);

rotate(int $degrees, ?string $background = null)

Baseline Supported on all 12 providers.
BUCFCNGUIMIMIMIXIPIVTHWS
All providers
Quarter-turns are byte-rotations and consistent across all providers.
Cloudflare / Cloudinary / Imagekit / Imagor / Imgix / Imgproxy / Intervention / Thumbor / Wserv
Arbitrary angles use different resampling algorithms and background-fill defaults; output dimensions and edge handling vary subtly.
Imagekit
No dedicated rotation-background param; Rotate's `$background` is emitted as the page-level `bg-`, sharing the key with the Background manipulator (last-write wins when both are stacked).

Rotate the image clockwise by $degrees. Quarter-turns (90 / 180 / 270) are portable across all providers; arbitrary angles are only supported by Cloudinary, ImageKit, wsrv.nl, and the local providers (Intervention, Imagine) — others throw UnsupportedManipulator. Negative angles rotate counter-clockwise. The clockwise convention matches CSS transform: rotate() and most CDN URL APIs; Imagor, Thumbor, and Intervention natively rotate counter-clockwise but Chainsaw normalises this so visual output matches across every backend.

$background is the fill colour for revealed corners on non-quarter rotations (e.g. '#ffffff'). Quarter-turns ignore it.

$image->rotate(90);
$image->rotate(180);
$image->rotate(45);                          // arbitrary, non-portable
$image->rotate(45, background: '#3b82f6');   // with bg fill

autoOrient()

Baseline Supported on all 12 providers.
BUCFCNGUIMIMIMIXIPIVTHWS

Apply the EXIF orientation tag to the pixel data and strip the tag. Most CDN providers (Cloudflare, Cloudinary, Imagor, imgix, wsrv) auto-orient by default, so this is effectively a no-op there. Imgproxy and Intervention require it to be explicit.

$image->autoOrient();

background(string $color)

Widely available Unsupported on Bunny.
BUCFCNGUIMIMIMIXIPIVTHWS

Set a background color (visible when the source has transparency).

$image->background('#ff6600');

border(int $width, ...)

Limited availability Only supported on Cloudinary, Imagekit, Imagine, Imgix, Imgproxy and Intervention.
BUCFCNGUIMIMIMIXIPIVTHWS

Add a border around the image.

use Timber\Chainsaw\Enum\BorderType;
use Timber\Chainsaw\Enum\Unit;

// Overlay (no size change)
$image->border(10, color: '#ff0000');

// Expand canvas
$image->border(20, color: '#1a1a1a', type: BorderType::Expand);

// Shrink image to fit border
$image->border(10, type: BorderType::Shrink);

// Percentage-based
$image->border(5, unit: Unit::Percent);