Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Using ImageMagick to resize your Images [WebPer...
Search
newtron
March 18, 2015
Technology
840
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Using ImageMagick to resize your Images [WebPerfTO]
Toronto Web Performance Group,
2015-03-17
https://github.com/nwtn/pres-imagemagick-webperfto
newtron
March 18, 2015
More Decks by newtron
See All by newtron
Universal web design [Accessibility Camp Toronto]
newtron
0
250
Universal web design [HackerYou a11y club]
newtron
0
240
Universal web design [Full Stack Toronto]
newtron
0
280
Information architecture as knowledge translation [World IA Day]
newtron
0
320
Improving performance with responsive (and responsible!) images [CSSDay.io]
newtron
1
410
Universal Web Design: How to create an awesome experience for every user [Open Source Bridge]
newtron
0
300
Improving performance with responsive (and responsible!) images [CSSConf]
newtron
6
740
Universal Web Design: How to create an awesome experience for every user [OpenWest]
newtron
0
320
Improving performance with responsive (and responsible!) images [OpenWest]
newtron
2
400
Other Decks in Technology
See All in Technology
日経電子版を支えていく Kasane Design System/fec_fukuoka
nikkei_engineer_recruiting
0
1.5k
Minecraft JavaのMODをSwiftで作る
1mash0
0
160
AIネイティブプロダクトで顧客価値を最大化するプロダクトエンジニアとFDEの協働
righttouch
PRO
0
310
20260912_スクフェス三河
kgnkhkr
0
380
積み重なった技術負債への挑戦 〜初手としての全社ゴト化〜
techtekt
PRO
0
1.2k
GoにおけるFFIのこれまでとこれから
goccy
5
3.4k
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
510
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
130
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
220
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
3
570
2026_devsumi_ozono.pdf
o3
3
510
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
800
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
330
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
280
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
How to train your dragon (web standard)
notwaldorf
97
6.8k
Deep Space Network (abreviated)
tonyrice
0
310
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
It's Worth the Effort
3n
188
29k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
570
Transcript
David Newton, St. Michael’s Hospital 1 1 Using ImageMagick to
resize your Images Toronto Web Performance Group, 2015-03-17 Twitter: @newtron Github: @nwtn Email:
[email protected]
Slides + image credits: https://github.com/nwtn/pres-imagemagick-webperfto
2
3 Responsive images are a pain in the butt
4
5
6
7 ImageMagick, y’all
8
9 $ brew install imagemagick
10 Condition File size: mean File size: % difference Photoshop
CC, with optimization 260,304.70 KB ImageMagick `-resize` 337,665.98 KB 52.39%
11 How does image resizing work?
12 685,936 pixels 189,739 pixels
13 …to 64 pixels? How do we get from 16
pixels…
14 != resampling
15 …to 64 pixels? How do we get from 16
pixels…
16 …to 64 pixels? How do we get from 16
pixels… Background interpolation
17 …to 64 pixels? How do we get from 16
pixels… Nearest-neighbour interpolation
18 Nearest-neighbour interpolation
19 Bicubic interpolation
20 Nearest-neighbour vs. bicubic interpolation
21 7 colours 1,146 colours
22
More colours = More bytes* 23
24 https://github.com/nwtn/image-resize-tests/
25 How do we know which options are best?
Quality objective: measured with DSSIM 26
27 Control Test Difference
28
Quality subjective: from me 29
Test a variety of images 30
31 The best* settings for ImageMagick
32 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH With optimization:
33 https://imageoptim.com/
34 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH Without optimization:
35 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
36 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
37 Adaptive resize Distort resize Geometry Interpolative resize Liquid rescale
Resize Sample Scale Thumbnail
38 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
39 (x1 ,y2 ) (x2 ,y2 ) (x1 ,y1 )
(x2 ,y1 ) (x,y) = + + +
40 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
41
42 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH
43 Fancy
43 Fancy
44 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
45 -unsharp 0.25x0.08+8.3+0.045 radius sigma gain threshold
46 -unsharp 0.25x0.08+8.3+0.045 radius sigma gain threshold
47 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
48
49
50
51
52 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH
53
More colours = More bytes* 54
55
56 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
57 quality 10 quality 40 quality 70 quality 100
58 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH
59 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
60 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH
61
62 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH
63
63
64
64
65 Progressive JPEGs Good? Evil?
66 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH
67
68 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2.0 -thumbnail OUTPUT_WIDTH
-unsharp 0.25x0.08+8.3+0.045 -dither None - posterize 136 -quality 82 -define png:preserve-colormap=true - interlace none INPUT_PATH With optimization:
69 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8.00+0.065 - dither None -posterize 136 -background Black - alpha Background -quality 82 -define jpeg:fancy- upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude- chunk=all -interlace none -colorspace sRGB - strip INPUT_PATH Without optimization:
70 Why even bother?
71 Condition File size: mean File size: % difference My
settings, optimization 221,583.36 KB My settings, no optimization 260,250.18 KB 17.45% Photoshop CC, optimization 260,304.70 KB 17.48% CodeIgniter / ExpressionEngine 276,112.95 KB 24.61% Photoshop CC, no optimization 299,709.70 KB 35.26% TYPO3.CMS 321,602.95 KB 45.14% WordPress 337,665.98 KB 52.39% Drupal 344,246.42 KB 55.36% Perch 348,735.82 KB 57.38% Craft CMS 372,055.63 KB 67.91% grunt-responsive-images 426,623.28 KB 92.36%
72 OK… but it’s still a pain in the butt
73 https://www.npmjs.com/package/grunt-respimg
74 Resizing with smart defaults SVG to PNG rasterization Optimization
75 npm install grunt-respimg --save-dev
76
77
David Newton, St. Michael’s Hospital 78 1 Using ImageMagick to
resize your Images Toronto Web Performance Group, 2015-03-17 Twitter: @newtron Github: @nwtn Email:
[email protected]
Slides + image credits: https://github.com/nwtn/pres-imagemagick-webperfto