Timber Chainsaw — Demo

Drivers: intervention-gd · intervention-imagick · imgproxy · imagor · thumbor · wserv · cloudflare Clear cache & regenerate

Summary

Cells rendered
469
Total generation time
0 ms
Peak memory
12.00 MB

Basic

original

$image
{{ image|img }}
image.jpg1000×667
intervention-gd
original
0 ms 12.00 MB
intervention-imagick
original
0 ms 12.00 MB
imgproxy
original
0 ms 12.00 MB
imagor
original
0 ms 12.00 MB
thumbor
original
0 ms 12.00 MB
wserv
original
0 ms 12.00 MB
cloudflare
original
0 ms 12.00 MB

width(400)

$image->width(400)
{{ image|width(400)|img }}
image.jpg400×267
intervention-gd
width(400)
0 ms 12.00 MB
intervention-imagick
width(400)
0 ms 12.00 MB
imgproxy
width(400)
0 ms 12.00 MB
imagor
width(400)
0 ms 12.00 MB
thumbor
width(400)
0 ms 12.00 MB
wserv
width(400)
0 ms 12.00 MB
cloudflare
width(400)
0 ms 12.00 MB

height(400)

$image->height(400)
{{ image|height(400)|img }}
image.jpg600×400
intervention-gd
height(400)
0 ms 12.00 MB
intervention-imagick
height(400)
0 ms 12.00 MB
imgproxy
height(400)
0 ms 12.00 MB
imagor
height(400)
0 ms 12.00 MB
thumbor
height(400)
0 ms 12.00 MB
wserv
height(400)
0 ms 12.00 MB
cloudflare
height(400)
0 ms 12.00 MB

crop center

$image->crop(800, 300)
{{ image|crop(800, 300)|img }}
landscape/fermin-rodriguez-penelas.jpg800×300
intervention-gd
crop center
0 ms 12.00 MB
intervention-imagick
crop center
0 ms 12.00 MB
imgproxy
crop center
0 ms 12.00 MB
imagor
crop center
0 ms 12.00 MB
thumbor
crop center
0 ms 12.00 MB
wserv
crop center
0 ms 12.00 MB
cloudflare
crop center
0 ms 12.00 MB

crop top

$image->crop(800, 300, CropPosition::Top)
{{ image|crop(800, 300, enum('Timber\\Chainsaw\\Enum\\CropPosition').Top)|img }}
landscape/fermin-rodriguez-penelas.jpg800×300
intervention-gd
crop top
0 ms 12.00 MB
intervention-imagick
crop top
0 ms 12.00 MB
imgproxy
crop top
0 ms 12.00 MB
imagor
crop top
0 ms 12.00 MB
thumbor
crop top
0 ms 12.00 MB
wserv
crop top
0 ms 12.00 MB
cloudflare
crop top
0 ms 12.00 MB

crop bottom

$image->crop(800, 300, CropPosition::Bottom)
{{ image|crop(800, 300, enum('Timber\\Chainsaw\\Enum\\CropPosition').Bottom)|img }}
landscape/fermin-rodriguez-penelas.jpg800×300
intervention-gd
crop bottom
0 ms 12.00 MB
intervention-imagick
crop bottom
0 ms 12.00 MB
imgproxy
crop bottom
0 ms 12.00 MB
imagor
crop bottom
0 ms 12.00 MB
thumbor
crop bottom
0 ms 12.00 MB
wserv
crop bottom
0 ms 12.00 MB
cloudflare
crop bottom
0 ms 12.00 MB

crop left

$image->crop(400, 800, CropPosition::Left)
{{ image|crop(400, 800, enum('Timber\\Chainsaw\\Enum\\CropPosition').Left)|img }}
landscape/fermin-rodriguez-penelas.jpg400×800
intervention-gd
crop left
0 ms 12.00 MB
intervention-imagick
crop left
0 ms 12.00 MB
imgproxy
crop left
0 ms 12.00 MB
imagor
crop left
0 ms 12.00 MB
thumbor
crop left
0 ms 12.00 MB
wserv
crop left
0 ms 12.00 MB
cloudflare
crop left
0 ms 12.00 MB

crop right

$image->crop(400, 800, CropPosition::Right)
{{ image|crop(400, 800, enum('Timber\\Chainsaw\\Enum\\CropPosition').Right)|img }}
landscape/fermin-rodriguez-penelas.jpg400×800
intervention-gd
crop right
0 ms 12.00 MB
intervention-imagick
crop right
0 ms 12.00 MB
imgproxy
crop right
0 ms 12.00 MB
imagor
crop right
0 ms 12.00 MB
thumbor
crop right
0 ms 12.00 MB
wserv
crop right
0 ms 12.00 MB
cloudflare
crop right
0 ms 12.00 MB

contain

$image->contain(500, 200)
{{ image|manipulate({contain: [500, 200]})|img }}
image.jpg300×200
intervention-gd
contain
0 ms 12.00 MB
intervention-imagick
contain
0 ms 12.00 MB
imgproxy
contain
0 ms 12.00 MB
imagor
contain
0 ms 12.00 MB
thumbor
contain
0 ms 12.00 MB
wserv
contain
0 ms 12.00 MB
cloudflare
contain
0 ms 12.00 MB

pad

$image->pad(400, 400, '#3b82f6')
{{ image|manipulate({pad: [400, 400, '#3b82f6']})|img }}
image.jpg400×400
intervention-gd
pad
0 ms 12.00 MB
intervention-imagick
pad
0 ms 12.00 MB
imgproxy
pad
0 ms 12.00 MB
imagor
pad
0 ms 12.00 MB
thumbor
pad
0 ms 12.00 MB
wserv
pad
0 ms 12.00 MB
cloudflare
pad
0 ms 12.00 MB

stretch

$image->stretch(300, 300)
{{ image|manipulate({stretch: [300, 300]})|img }}
image.jpg300×300
intervention-gd
stretch
0 ms 12.00 MB
intervention-imagick
stretch
0 ms 12.00 MB
imgproxy
stretch
0 ms 12.00 MB
imagor
stretch
0 ms 12.00 MB
thumbor
stretch
0 ms 12.00 MB
wserv
stretch
0 ms 12.00 MB
cloudflare
Unsupported

scaleDown

$image->scaleDown(width: 400)
{{ image|manipulate({scaleDown: {width: 400}})|img }}
image.jpg400×267
intervention-gd
scaleDown
0 ms 12.00 MB
intervention-imagick
scaleDown
0 ms 12.00 MB
imgproxy
scaleDown
0 ms 12.00 MB
imagor
scaleDown
0 ms 12.00 MB
thumbor
scaleDown
0 ms 12.00 MB
wserv
scaleDown
0 ms 12.00 MB
cloudflare
scaleDown
0 ms 12.00 MB

focalCrop

$image->focalCrop(400, 300, 0.3, 0.2)
{{ image|manipulate({focalCrop: [400, 300, 0.3, 0.2]})|img }}
image.jpg400×300
intervention-gd
focalCrop
0 ms 12.00 MB
intervention-imagick
focalCrop
0 ms 12.00 MB
imgproxy
focalCrop
0 ms 12.00 MB
imagor
focalCrop
0 ms 12.00 MB
thumbor
Unsupported
wserv
focalCrop
0 ms 12.00 MB
cloudflare
focalCrop
0 ms 12.00 MB

cropAt

$image->cropAt(100, 50, 400, 300)
{{ image|manipulate({cropAt: [100, 50, 400, 300]})|img }}
image.jpg400×300
intervention-gd
cropAt
0 ms 12.00 MB
intervention-imagick
cropAt
0 ms 12.00 MB
imgproxy
cropAt
0 ms 12.00 MB
imagor
cropAt
0 ms 12.00 MB
thumbor
cropAt
0 ms 12.00 MB
wserv
cropAt
0 ms 12.00 MB
cloudflare
Unsupported

orientation

$image->orientation(Orientation::Rotate90)
{{ image|manipulate({orientation: enum('Timber\\Chainsaw\\Enum\\Orientation').Rotate90})|img }}
image.jpg667×1000
intervention-gd
orientation
0 ms 12.00 MB
intervention-imagick
orientation
0 ms 12.00 MB
imgproxy
orientation
0 ms 12.00 MB
imagor
orientation
0 ms 12.00 MB
thumbor
orientation
0 ms 12.00 MB
wserv
orientation
0 ms 12.00 MB
cloudflare
orientation
0 ms 12.00 MB

Effects

blur(20)

$image->crop(400, 300)->blur(20)
{{ image|crop(400, 300)|blur(20)|img }}
image.jpg400×300
intervention-gd
blur(20)
0 ms 12.00 MB
intervention-imagick
blur(20)
0 ms 12.00 MB
imgproxy
blur(20)
0 ms 12.00 MB
imagor
blur(20)
0 ms 12.00 MB
thumbor
blur(20)
0 ms 12.00 MB
wserv
blur(20)
0 ms 12.00 MB
cloudflare
blur(20)
0 ms 12.00 MB

sharpen(50)

$image->crop(400, 300)->sharpen(50)
{{ image|crop(400, 300)|sharpen(50)|img }}
image.jpg400×300
intervention-gd
sharpen(50)
0 ms 12.00 MB
intervention-imagick
sharpen(50)
0 ms 12.00 MB
imgproxy
sharpen(50)
0 ms 12.00 MB
imagor
sharpen(50)
0 ms 12.00 MB
thumbor
sharpen(50)
0 ms 12.00 MB
wserv
sharpen(50)
0 ms 12.00 MB
cloudflare
sharpen(50)
0 ms 12.00 MB

greyscale

$image->crop(400, 300)->greyscale()
{{ image|crop(400, 300)|greyscale|img }}
image.jpg400×300
intervention-gd
greyscale
0 ms 12.00 MB
intervention-imagick
greyscale
0 ms 12.00 MB
imgproxy
Unsupported
imagor
greyscale
0 ms 12.00 MB
thumbor
greyscale
0 ms 12.00 MB
wserv
greyscale
0 ms 12.00 MB
cloudflare
greyscale
0 ms 12.00 MB

sepia

$image->crop(400, 300)->sepia()
{{ image|crop(400, 300)|sepia|img }}
image.jpg400×300
intervention-gd
sepia
0 ms 12.00 MB
intervention-imagick
sepia
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
sepia
0 ms 12.00 MB
cloudflare
sepia
0 ms 12.00 MB

brightness +30

$image->crop(400, 300)->brightness(30)
{{ image|crop(400, 300)|brightness(30)|img }}
image.jpg400×300
intervention-gd
brightness +30
0 ms 12.00 MB
intervention-imagick
brightness +30
0 ms 12.00 MB
imgproxy
Unsupported
imagor
brightness +30
0 ms 12.00 MB
thumbor
brightness +30
0 ms 12.00 MB
wserv
brightness +30
0 ms 12.00 MB
cloudflare
brightness +30
0 ms 12.00 MB

brightness -30

$image->crop(400, 300)->brightness(-30)
{{ image|crop(400, 300)|brightness(-30)|img }}
image.jpg400×300
intervention-gd
brightness -30
0 ms 12.00 MB
intervention-imagick
brightness -30
0 ms 12.00 MB
imgproxy
Unsupported
imagor
brightness -30
0 ms 12.00 MB
thumbor
brightness -30
0 ms 12.00 MB
wserv
brightness -30
0 ms 12.00 MB
cloudflare
brightness -30
0 ms 12.00 MB

contrast(30)

$image->crop(400, 300)->contrast(30)
{{ image|crop(400, 300)|contrast(30)|img }}
image.jpg400×300
intervention-gd
contrast(30)
0 ms 12.00 MB
intervention-imagick
contrast(30)
0 ms 12.00 MB
imgproxy
Unsupported
imagor
contrast(30)
0 ms 12.00 MB
thumbor
contrast(30)
0 ms 12.00 MB
wserv
contrast(30)
0 ms 12.00 MB
cloudflare
contrast(30)
0 ms 12.00 MB

gamma(2.0)

$image->crop(400, 300)->gamma(2)
{{ image|crop(400, 300)|gamma(2)|img }}
image.jpg400×300
intervention-gd
gamma(2.0)
0 ms 12.00 MB
intervention-imagick
gamma(2.0)
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
gamma(2.0)
0 ms 12.00 MB
cloudflare
gamma(2.0)
0 ms 12.00 MB

pixelate(10)

$image->crop(400, 300)->pixelate(10)
{{ image|crop(400, 300)|pixelate(10)|img }}
image.jpg400×300
intervention-gd
pixelate(10)
0 ms 12.00 MB
intervention-imagick
pixelate(10)
0 ms 12.00 MB
imgproxy
Unsupported
imagor
pixelate(10)
0 ms 12.00 MB
thumbor
Unsupported
wserv
Unsupported
cloudflare
pixelate(10)
0 ms 12.00 MB

border overlay

$image->crop(400, 300)->border(10, color: '#ff0000')
{{ image|manipulate({crop: [400, 300], border: {0: 10, color: '#ff0000'}})|img }}
image.jpg400×300
intervention-gd
border overlay
0 ms 12.00 MB
intervention-imagick
border overlay
0 ms 12.00 MB
imgproxy
border overlay
0 ms 12.00 MB
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
border overlay
0 ms 12.00 MB

border expand

$image->crop(400, 300)->border(20, color: '#22c55e', type: BorderType::Expand)
{{ image|manipulate({crop: [400, 300], border: {0: 20, color: '#22c55e', type: enum('Timber\\Chainsaw\\Enum\\BorderType').Expand}})|img }}
image.jpg440×340
intervention-gd
border expand
0 ms 12.00 MB
intervention-imagick
border expand
0 ms 12.00 MB
imgproxy
border expand
0 ms 12.00 MB
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
border expand
0 ms 12.00 MB

flip H

$image->crop(400, 300)->flip(FlipDirection::Horizontal)
{{ image|manipulate({crop: [400, 300], flip: enum('Timber\\Chainsaw\\Enum\\FlipDirection').Horizontal})|img }}
image.jpg400×300
intervention-gd
flip H
0 ms 12.00 MB
intervention-imagick
flip H
0 ms 12.00 MB
imgproxy
Unsupported
imagor
flip H
0 ms 12.00 MB
thumbor
flip H
0 ms 12.00 MB
wserv
flip H
0 ms 12.00 MB
cloudflare
flip H
0 ms 12.00 MB

Encoding

webp

$image->crop(400, 300)->format(Format::Webp)
{{ image|crop(400, 300)|format(enum('Timber\\Chainsaw\\Enum\\Format').Webp)|img }}
image.jpg400×300
intervention-gd
webp
0 ms 12.00 MB
intervention-imagick
webp
0 ms 12.00 MB
imgproxy
webp
0 ms 12.00 MB
imagor
webp
0 ms 12.00 MB
thumbor
webp
0 ms 12.00 MB
wserv
webp
0 ms 12.00 MB
cloudflare
webp
0 ms 12.00 MB

quality 20

$image->crop(400, 300)->quality(20)
{{ image|crop(400, 300)|quality(20)|img }}
image.jpg400×300
intervention-gd
quality 20
0 ms 12.00 MB
intervention-imagick
quality 20
0 ms 12.00 MB
imgproxy
quality 20
0 ms 12.00 MB
imagor
quality 20
0 ms 12.00 MB
thumbor
quality 20
0 ms 12.00 MB
wserv
quality 20
0 ms 12.00 MB
cloudflare
quality 20
0 ms 12.00 MB

quality 95

$image->crop(400, 300)->quality(95)
{{ image|crop(400, 300)|quality(95)|img }}
image.jpg400×300
intervention-gd
quality 95
0 ms 12.00 MB
intervention-imagick
quality 95
0 ms 12.00 MB
imgproxy
quality 95
0 ms 12.00 MB
imagor
quality 95
0 ms 12.00 MB
thumbor
quality 95
0 ms 12.00 MB
wserv
quality 95
0 ms 12.00 MB
cloudflare
quality 95
0 ms 12.00 MB

optimize

$image->crop(400, 300)->optimize(true)
{{ image|crop(400, 300)|optimize(true)|img }}
image.jpg400×300
intervention-gd
optimize
0 ms 12.00 MB
intervention-imagick
optimize
0 ms 12.00 MB
imgproxy
optimize
0 ms 12.00 MB
imagor
optimize
0 ms 12.00 MB
thumbor
optimize
0 ms 12.00 MB
wserv
optimize
0 ms 12.00 MB
cloudflare
optimize
0 ms 12.00 MB

Presets

thumbnail

$image->preset('thumbnail')
{{ image|preset('thumbnail')|img }}
image.jpg200×200
intervention-gd
thumbnail
0 ms 12.00 MB
intervention-imagick
thumbnail
0 ms 12.00 MB
imgproxy
thumbnail
0 ms 12.00 MB
imagor
thumbnail
0 ms 12.00 MB
thumbor
thumbnail
0 ms 12.00 MB
wserv
thumbnail
0 ms 12.00 MB
cloudflare
thumbnail
0 ms 12.00 MB

hero

$image->preset('hero')
{{ image|preset('hero')|img }}
image.jpg800×400
intervention-gd
hero
0 ms 12.00 MB
intervention-imagick
hero
0 ms 12.00 MB
imgproxy
hero
0 ms 12.00 MB
imagor
hero
0 ms 12.00 MB
thumbor
hero
0 ms 12.00 MB
wserv
hero
0 ms 12.00 MB
cloudflare
hero
0 ms 12.00 MB

PNG

PNG crop

$image->crop(200, 200)
{{ image|crop(200, 200)|img }}
timber-tree-green.png200×200
intervention-gd
PNG crop
0 ms 12.00 MB
intervention-imagick
PNG crop
0 ms 12.00 MB
imgproxy
PNG crop
0 ms 12.00 MB
imagor
PNG crop
0 ms 12.00 MB
thumbor
PNG crop
0 ms 12.00 MB
wserv
PNG crop
0 ms 12.00 MB
cloudflare
PNG crop
0 ms 12.00 MB

PNG → WebP

$image->crop(200, 200)->format(Format::Webp)
{{ image|crop(200, 200)|format(enum('Timber\\Chainsaw\\Enum\\Format').Webp)|img }}
timber-tree-green.png200×200
intervention-gd
PNG → WebP
0 ms 12.00 MB
intervention-imagick
PNG → WebP
0 ms 12.00 MB
imgproxy
PNG → WebP
0 ms 12.00 MB
imagor
PNG → WebP
0 ms 12.00 MB
thumbor
PNG → WebP
0 ms 12.00 MB
wserv
PNG → WebP
0 ms 12.00 MB
cloudflare
PNG → WebP
0 ms 12.00 MB

PNG + bg

$image->crop(200, 200)->background('#ff6600')
{{ image|crop(200, 200)|background('#ff6600')|img }}
timber-tree-green.png200×200
intervention-gd
PNG + bg
0 ms 12.00 MB
intervention-imagick
PNG + bg
0 ms 12.00 MB
imgproxy
PNG + bg
0 ms 12.00 MB
imagor
PNG + bg
0 ms 12.00 MB
thumbor
PNG + bg
0 ms 12.00 MB
wserv
PNG + bg
0 ms 12.00 MB
cloudflare
PNG + bg
0 ms 12.00 MB

GIF

static GIF crop

$image->crop(300, 300)
{{ image|crop(300, 300)|img }}
github.gif300×300
intervention-gd
static GIF crop
0 ms 12.00 MB
intervention-imagick
static GIF crop
0 ms 12.00 MB
imgproxy
static GIF crop
0 ms 12.00 MB
imagor
static GIF crop
0 ms 12.00 MB
thumbor
static GIF crop
0 ms 12.00 MB
wserv
static GIF crop
0 ms 12.00 MB
cloudflare
static GIF crop
0 ms 12.00 MB

static GIF → WebP

$image->crop(300, 300)->format(Format::Webp)
{{ image|crop(300, 300)|format(enum('Timber\\Chainsaw\\Enum\\Format').Webp)|img }}
github.gif300×300
intervention-gd
static GIF → WebP
0 ms 12.00 MB
intervention-imagick
static GIF → WebP
0 ms 12.00 MB
imgproxy
static GIF → WebP
0 ms 12.00 MB
imagor
static GIF → WebP
0 ms 12.00 MB
thumbor
static GIF → WebP
0 ms 12.00 MB
wserv
static GIF → WebP
0 ms 12.00 MB
cloudflare
static GIF → WebP
0 ms 12.00 MB

animated GIF

$image
{{ image|img }}
timber.gif480×480
intervention-gd
animated GIF
0 ms 12.00 MB
intervention-imagick
animated GIF
0 ms 12.00 MB
imgproxy
animated GIF
0 ms 12.00 MB
imagor
animated GIF
0 ms 12.00 MB
thumbor
animated GIF
0 ms 12.00 MB
wserv
animated GIF
0 ms 12.00 MB
cloudflare
animated GIF
0 ms 12.00 MB

animated GIF resize

$image->width(240)
{{ image|width(240)|img }}
timber.gif240×240
intervention-gd
animated GIF resize
0 ms 12.00 MB
intervention-imagick
animated GIF resize
0 ms 12.00 MB
imgproxy
animated GIF resize
0 ms 12.00 MB
imagor
animated GIF resize
0 ms 12.00 MB
thumbor
animated GIF resize
0 ms 12.00 MB
wserv
animated GIF resize
0 ms 12.00 MB
cloudflare
animated GIF resize
0 ms 12.00 MB

animated GIF crop

$image->crop(240, 240)
{{ image|crop(240, 240)|img }}
timber.gif240×240
intervention-gd
animated GIF crop
0 ms 12.00 MB
intervention-imagick
animated GIF crop
0 ms 12.00 MB
imgproxy
animated GIF crop
0 ms 12.00 MB
imagor
animated GIF crop
0 ms 12.00 MB
thumbor
animated GIF crop
0 ms 12.00 MB
wserv
animated GIF crop
0 ms 12.00 MB
cloudflare
animated GIF crop
0 ms 12.00 MB

animated GIF → GIF

$image->width(240)->format(Format::Gif)
{{ image|width(240)|format(enum('Timber\\Chainsaw\\Enum\\Format').Gif)|img }}
timber.gif240×240
intervention-gd
animated GIF → GIF
0 ms 12.00 MB
intervention-imagick
animated GIF → GIF
0 ms 12.00 MB
imgproxy
animated GIF → GIF
0 ms 12.00 MB
imagor
animated GIF → GIF
0 ms 12.00 MB
thumbor
animated GIF → GIF
0 ms 12.00 MB
wserv
animated GIF → GIF
0 ms 12.00 MB
cloudflare
animated GIF → GIF
0 ms 12.00 MB

animated GIF → WebP

$image->width(240)->format(Format::Webp)
{{ image|width(240)|format(enum('Timber\\Chainsaw\\Enum\\Format').Webp)|img }}
timber.gif240×240
intervention-gd
animated GIF → WebP
0 ms 12.00 MB
intervention-imagick
animated GIF → WebP
0 ms 12.00 MB
imgproxy
animated GIF → WebP
0 ms 12.00 MB
imagor
animated GIF → WebP
0 ms 12.00 MB
thumbor
animated GIF → WebP
0 ms 12.00 MB
wserv
animated GIF → WebP
0 ms 12.00 MB
cloudflare
animated GIF → WebP
0 ms 12.00 MB

animated GIF → AVIF

$image->width(240)->format(Format::Avif)
{{ image|width(240)|format(enum('Timber\\Chainsaw\\Enum\\Format').Avif)|img }}
timber.gif240×240
intervention-gd
animated GIF → AVIF
0 ms 12.00 MB
intervention-imagick
Errored: ImagickException: Failed to get the image contents (empty or invalid image?)
imgproxy
animated GIF → AVIF
0 ms 12.00 MB
imagor
animated GIF → AVIF
0 ms 12.00 MB
thumbor
animated GIF → AVIF
0 ms 12.00 MB
wserv
animated GIF → AVIF
0 ms 12.00 MB
cloudflare
animated GIF → AVIF
0 ms 12.00 MB

Watermark

bottom-right

$image->crop(600, 400)->watermark('timber-tree-green.png', Position::BottomRight, paddingX: 10, paddingY: 10, width: 80)
{{ image|manipulate({crop: [600, 400], watermark: {0: 'timber-tree-green.png', 1: enum('Timber\\Chainsaw\\Enum\\Position').BottomRight, paddingX: 10, paddingY: 10, width: 80}})|img }}
image.jpg600×400
intervention-gd
bottom-right
0 ms 12.00 MB
intervention-imagick
bottom-right
0 ms 12.00 MB
imgproxy
bottom-right
0 ms 12.00 MB
imagor
bottom-right
0 ms 12.00 MB
thumbor
bottom-right
0 ms 12.00 MB
wserv
Unsupported
cloudflare
Unsupported

center 40%

$image->crop(600, 400)->watermark('timber-tree-green.png', Position::Center, width: 150, alpha: 40)
{{ image|manipulate({crop: [600, 400], watermark: {0: 'timber-tree-green.png', 1: enum('Timber\\Chainsaw\\Enum\\Position').Center, width: 150, alpha: 40}})|img }}
image.jpg600×400
intervention-gd
center 40%
0 ms 12.00 MB
intervention-imagick
center 40%
0 ms 12.00 MB
imgproxy
center 40%
0 ms 12.00 MB
imagor
center 40%
0 ms 12.00 MB
thumbor
center 40%
0 ms 12.00 MB
wserv
Unsupported
cloudflare
Unsupported

top-left

$image->crop(600, 400)->watermark('timber-tree-green.png', Position::TopLeft, paddingX: 10, paddingY: 10, width: 60)
{{ image|manipulate({crop: [600, 400], watermark: {0: 'timber-tree-green.png', 1: enum('Timber\\Chainsaw\\Enum\\Position').TopLeft, paddingX: 10, paddingY: 10, width: 60}})|img }}
image.jpg600×400
intervention-gd
top-left
0 ms 12.00 MB
intervention-imagick
top-left
0 ms 12.00 MB
imgproxy
top-left
0 ms 12.00 MB
imagor
top-left
0 ms 12.00 MB
thumbor
top-left
0 ms 12.00 MB
wserv
Unsupported
cloudflare
Unsupported

without(Watermark)

$image->crop(400, 300)->watermark('timber-tree-green.png', Position::BottomRight, paddingX: 10, paddingY: 10, width: 60)->without(Watermark::class)
{{ image|manipulate({crop: [400, 300], watermark: {0: 'timber-tree-green.png', 1: enum('Timber\\Chainsaw\\Enum\\Position').BottomRight, paddingX: 10, paddingY: 10, width: 60}, without: 'Timber\\Chainsaw\\Manipulator\\Watermark'})|img }}
image.jpg400×300
intervention-gd
without(Watermark)
0 ms 12.00 MB
intervention-imagick
without(Watermark)
0 ms 12.00 MB
imgproxy
without(Watermark)
0 ms 12.00 MB
imagor
without(Watermark)
0 ms 12.00 MB
thumbor
without(Watermark)
0 ms 12.00 MB
wserv
without(Watermark)
0 ms 12.00 MB
cloudflare
without(Watermark)
0 ms 12.00 MB

Dithering

Atkinson 200

$image->crop(200, 150)->dither()
{{ image|manipulate({crop: [200, 150], dither: []})|img }}
image.jpg200×150
intervention-gd
Atkinson 200
0 ms 12.00 MB
intervention-imagick
Atkinson 200
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

Floyd-Steinberg 200

$image->crop(200, 150)->dither(DitherAlgorithm::FloydSteinberg)
{{ image|manipulate({crop: [200, 150], dither: enum('Timber\\Chainsaw\\Enum\\DitherAlgorithm').FloydSteinberg})|img }}
image.jpg200×150
intervention-gd
Floyd-Steinberg 200
0 ms 12.00 MB
intervention-imagick
Floyd-Steinberg 200
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

Atkinson 400

$image->crop(400, 300)->dither()
{{ image|manipulate({crop: [400, 300], dither: []})|img }}
image.jpg400×300
intervention-gd
Atkinson 400
0 ms 12.00 MB
intervention-imagick
Atkinson 400
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

Floyd-Steinberg 400

$image->crop(400, 300)->dither(DitherAlgorithm::FloydSteinberg)
{{ image|manipulate({crop: [400, 300], dither: enum('Timber\\Chainsaw\\Enum\\DitherAlgorithm').FloydSteinberg})|img }}
image.jpg400×300
intervention-gd
Floyd-Steinberg 400
0 ms 12.00 MB
intervention-imagick
Floyd-Steinberg 400
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

BlurHash

BlurHash 32×32

$image->blurhash()
{{ image|manipulate({blurhash: []})|img }}
image.jpg32×32
intervention-gd
BlurHash 32×32
0 ms 12.00 MB
intervention-imagick
BlurHash 32×32
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

BlurHash 64×64

$image->blurhash(width: 64, height: 64)
{{ image|manipulate({blurhash: {width: 64, height: 64}})|img }}
image.jpg64×64
intervention-gd
BlurHash 64×64
0 ms 12.00 MB
intervention-imagick
BlurHash 64×64
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

BlurHash 4×3

$image->blurhash(width: 4, height: 3)
{{ image|manipulate({blurhash: {width: 4, height: 3}})|img }}
image.jpg4×3
intervention-gd
BlurHash 4×3
0 ms 12.00 MB
intervention-imagick
BlurHash 4×3
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

BlurHash 6×4 comps

$image->blurhash(componentsX: 6, componentsY: 4)
{{ image|manipulate({blurhash: {componentsX: 6, componentsY: 4}})|img }}
image.jpg32×32
intervention-gd
BlurHash 6×4 comps
0 ms 12.00 MB
intervention-imagick
BlurHash 6×4 comps
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

PNG BlurHash

$image->blurhash()
{{ image|manipulate({blurhash: []})|img }}
timber-tree-green.png32×32
intervention-gd
PNG BlurHash
0 ms 12.00 MB
intervention-imagick
PNG BlurHash
0 ms 12.00 MB
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

Responsive

widths 200/400/800

$image->crop(400, 300)->widths(200, 400, 800)
{{ image|crop(400, 300)|widths(200, 400, 800)|img({sizes: '(min-width: 800px) 800px, 100vw'}) }}
image.jpg
intervention-gd
widths 200/400/800
0 ms 12.00 MB
intervention-imagick
widths 200/400/800
0 ms 12.00 MB
imgproxy
widths 200/400/800
0 ms 12.00 MB
imagor
widths 200/400/800
0 ms 12.00 MB
thumbor
widths 200/400/800
0 ms 12.00 MB
wserv
widths 200/400/800
0 ms 12.00 MB
cloudflare
widths 200/400/800
0 ms 12.00 MB

widthsBetween 200–800 step 200

$image->crop(400, 300)->widthsBetween(200, 800, 200)
{{ image|manipulate({crop: [400, 300], widthsBetween: [200, 800, 200]})|img }}
image.jpg
intervention-gd
widthsBetween 200–800 step 200
0 ms 12.00 MB
intervention-imagick
widthsBetween 200–800 step 200
0 ms 12.00 MB
imgproxy
widthsBetween 200–800 step 200
0 ms 12.00 MB
imagor
widthsBetween 200–800 step 200
0 ms 12.00 MB
thumbor
widthsBetween 200–800 step 200
0 ms 12.00 MB
wserv
widthsBetween 200–800 step 200
0 ms 12.00 MB
cloudflare
widthsBetween 200–800 step 200
0 ms 12.00 MB

dpr 2×

$image->crop(400, 300)->dpr(2)
{{ image|manipulate({crop: [400, 300], dpr: 2})|img }}
image.jpg
intervention-gd
Unsupported
intervention-imagick
Unsupported
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

autoDpr

$image->crop(400, 300)->autoDpr()
{{ image|manipulate({crop: [400, 300], autoDpr: []})|img }}
image.jpg
intervention-gd
Unsupported
intervention-imagick
Unsupported
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

autoWidth

$image->crop(400, 300)->autoWidth()
{{ image|manipulate({crop: [400, 300], autoWidth: []})|img }}
image.jpg
intervention-gd
Unsupported
intervention-imagick
Unsupported
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

saveData

$image->crop(400, 300)->saveData()
{{ image|manipulate({crop: [400, 300], saveData: []})|img }}
image.jpg
intervention-gd
Unsupported
intervention-imagick
Unsupported
imgproxy
Unsupported
imagor
Unsupported
thumbor
Unsupported
wserv
Unsupported
cloudflare
Unsupported

art direction

Picture::fallback($image->crop(400, 400))
  ->at('(min-width: 768px)', $image->crop(800, 300))
  ->formats(Format::Webp)
{{ image|picture({'(min-width: 768px)': {crop: [800, 300]}}, [enum('Timber\\Chainsaw\\Enum\\Format').Webp])|img }}
image.jpg
intervention-gd
art direction
0 ms 12.00 MB
intervention-imagick
art direction
0 ms 12.00 MB
imgproxy
art direction
0 ms 12.00 MB
imagor
art direction
0 ms 12.00 MB
thumbor
art direction
0 ms 12.00 MB
wserv
art direction
0 ms 12.00 MB
cloudflare
art direction
0 ms 12.00 MB

Data URI

inline 100×100

$image->crop(100, 100)->toDataUri()
{{ image|crop(100, 100)|toDataUri }}
image.jpg
intervention-gd
inline 100×100
0 ms 12.00 MB
intervention-imagick
inline 100×100
0 ms 12.00 MB
imgproxy
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
imagor
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
thumbor
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
wserv
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
cloudflare
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.

inline blurhash

$image->blurhash()->toDataUri()
{{ image|manipulate({blurhash: []})|toDataUri }}
image.jpg
intervention-gd
inline blurhash
0 ms 12.00 MB
intervention-imagick
inline blurhash
0 ms 12.00 MB
imgproxy
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
imagor
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
thumbor
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
wserv
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.
cloudflare
Errored: Timber\Chainsaw\Exception\DriverException: toDataUri() requires a local driver (e.g., InterventionDriver). URL-grammar drivers cannot generate image bytes.

Complex

grey+contrast+sharpen+WM+webp+q90

$image->crop(600, 400)->greyscale()->contrast(20)->sharpen(30)->watermark('timber-tree-green.png', Position::BottomRight, paddingX: 10, paddingY: 10, width: 80, alpha: 70)->format(Format::Webp)->quality(90)
{{ image|manipulate({crop: [600, 400], greyscale: [], contrast: 20, sharpen: 30, watermark: {0: 'timber-tree-green.png', 1: enum('Timber\\Chainsaw\\Enum\\Position').BottomRight, paddingX: 10, paddingY: 10, width: 80, alpha: 70}, format: enum('Timber\\Chainsaw\\Enum\\Format').Webp, quality: 90})|img }}
image.jpg600×400
intervention-gd
grey+contrast+sharpen+WM+webp+q90
0 ms 12.00 MB
intervention-imagick
grey+contrast+sharpen+WM+webp+q90
0 ms 12.00 MB
imgproxy
Unsupported
imagor
grey+contrast+sharpen+WM+webp+q90
0 ms 12.00 MB
thumbor
grey+contrast+sharpen+WM+webp+q90
0 ms 12.00 MB
wserv
Unsupported
cloudflare
Unsupported