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 [FSTO]
Search
newtron
April 08, 2015
Technology
480
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Using ImageMagick to resize your Images [FSTO]
Full Stack Toronto,
2015-04-08
https://github.com/nwtn/pres-imagemagick-fsto
newtron
April 08, 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
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
AIによるクリエイティブ生成を行う上での試行錯誤
plaidtech
PRO
0
160
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
230
人間はどの意思決定を手放せるのか
kawasima
15
7.3k
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
130
LTのテーマ どうきめてる?〜5つの型と私のやり方〜
yama3133
1
110
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
AI に書かせたその API、 “信頼” できますか?
nagix
0
130
Railsのように考える: See through the Master
snoozer05
PRO
4
1.1k
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.2k
SREへの勘違いに気づいた後の話
tomodakengo
0
110
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
3
1.7k
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
260
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
We Have a Design System, Now What?
morganepeng
55
8.3k
Utilizing Notion as your number one productivity tool
mfonobong
4
590
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Chasing Engaging Ingredients in Design
codingconduct
0
310
Building an army of robots
kneath
307
46k
Fireside Chat
paigeccino
43
4k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Google's AI Overviews - The New Search
badams
0
1.6k
Transcript
David Newton, St. Michael’s Hospital 1 1 Using ImageMagick to
resize your Images Full Stack Toronto, 2015-04-08 Twitter: @newtron Github: @nwtn Email:
[email protected]
Slides + image credits: https://github.com/nwtn/pres-imagemagick-fsto
2
3 Responsive images are a pain in the butt
4
5
6
7 ImageMagick, y’all
8
9 $ brew install imagemagick
10 Condition (unoptimized input) File size: mean File size: %
difference Photoshop CC, with optimization 260,305 bytes ImageMagick `-resize` 385,795 bytes 48.21%
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 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 INPUT_PATH With optimization:
33 https://github.com/toy/image_optim https://github.com/ajslater/picopt https://imageoptim.com/
34 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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 vs. convert
36
37 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
38 resampling filter
39 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
40 Adaptive resize Distort resize Geometry Interpolative resize Liquid rescale
Resize Sample Scale Thumbnail
41 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
42
43
44 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
45
46 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
47 Fancy
48 sharpening
49 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
50 -unsharp 0.25x0.25+8+0.045 radius sigma gain threshold
51 -unsharp 0.25x0.25+8+0.045 radius sigma gain threshold
52 colour reduction
53 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
54
55
56
57
58
59 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -quality 82 -colors NUMBER_OF_COLORS -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 If output file size is larger than input:
60 7 colours 1,146 colours
61 7 colours 7 colours
62 quality and compression
63 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
64 quality 10 quality 40 quality 70 quality 100
65 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
66 metadata
67 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
68 progressive rendering
69 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
70
71
Progressive JPEGs Good? Evil? 72
73 colour space
74 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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
75
76 The best* settings for ImageMagick
77 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 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 INPUT_PATH With optimization:
78 mogrify -path OUTPUT_PATH -filter Triangle - define filter:support=2.0 -thumbnail
OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None - posterize 136 -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:
79 Why even bother?
80 Condition (unoptimized input) File size: mean File size: %
difference My settings, optimization 218,274 bytes My settings, no optimization 259,852 bytes 19.05%
81 Condition (unoptimized input) File size: mean File size: %
difference My settings, optimization 218,274 bytes My settings, no optimization 259,852 bytes 19.05% Photoshop CC, optimization 260,305 bytes 19.28% Photoshop CC, no optimization 299,710 bytes 35.26%
82 Condition (unoptimized input) File size: mean File size: %
difference My settings, optimization 218,274 bytes My settings, no optimization 259,852 bytes 19.05% Photoshop CC, optimization 260,305 bytes 19.28% Photoshop CC, no optimization 299,710 bytes 35.26% basic `-resize` / WordPress* 385,795 bytes 76.75%
83 Condition (unoptimized input) File size: mean File size: %
difference My settings, optimization 218,274 bytes My settings, no optimization 259,852 bytes 19.05% Photoshop CC, optimization 260,305 bytes 19.28% Photoshop CC, no optimization 299,710 bytes 35.26% CodeIgniter / ExpressionEngine 340,461 bytes 55.98% TYPO3.CMS* 359,112 bytes 64.52% basic `-resize` / WordPress* 385,795 bytes 76.75% Drupal* 397,588 bytes 82.15% Perch* 416,790 bytes 90.95% Craft CMS* 425,259 bytes 94.83% grunt-responsive-images* 500,273 bytes 129.20%
84 PHP Imagick
85
86
87 CLI Imagick DSSIM File Size -filter N/A N/A N/A
-define filter:support setOption() ? ? -thumbnail thumbnailImage() ✗ ✗ -unsharp unsharpMaskImage() ✔ ✔ -dither & -posterize posterizeImage() ✔ ✔ -quality setImageCompressionQuality() ✔ ✗ -define jpeg:fancy-upsampling setOption() ✔ ✔ -define png:compression-filter setOption() ✔ ✔ -define png:compression-level setOption() ✔ ✔ -define png:compression-strategy setOption() ✔ ✔ -define png:exclude-chunk setOption() ✔ ✔ -interlace setInterlaceScheme() ✔ ✔ -colorspace setColorspace() ✔ ✔ -strip stripImage() ✔ ✔
88
89 CLI Imagick DSSIM File Size -filter custom ✔ ✗
-define filter:support setOption() ✔ ✗ -thumbnail custom ✔ ✗ -unsharp unsharpMaskImage() ✔ ✔ -dither & -posterize posterizeImage() ✔ ✔ -quality setImageCompressionQuality() ✔ ✔ -define jpeg:fancy-upsampling setOption() ✔ ✔ -define png:compression-filter setOption() ✔ ✔ -define png:compression-level setOption() ✔ ✔ -define png:compression-strategy setOption() ✔ ✔ -define png:exclude-chunk setOption() ✔ ✔ -interlace setInterlaceScheme() ✔ ✔ -colorspace setColorspace() ✔ ✔ -strip stripImage() ✔ ✔
90 OK… but it’s still a pain in the butt
91 https://github.com/nwtn/php-respimg/ Resizing with smart defaults + more coming soon?
92 $ composer require nwtn/php-respimg
93
94 https://www.npmjs.com/package/grunt-respimg Resizing with smart defaults SVG to PNG rasterization
Optimization
95 $ npm install grunt-respimg --save-dev
96
97
David Newton, St. Michael’s Hospital 98 Using ImageMagick to resize
your Images Full Stack Toronto, 2015-04-08 Twitter: @newtron Github: @nwtn Email:
[email protected]
Slides + image credits: https://github.com/nwtn/pres-imagemagick-fsto