Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ImageMagick実践入門 画像加工サーバを作ってみよう / ImageMagick an...
Search
Hiroshi Shimoju
October 29, 2017
Technology
0
3.5k
ImageMagick実践入門 画像加工サーバを作ってみよう / ImageMagick and image server
新卒エンジニア研修の座学でImageMagickの話をしました。
Hiroshi Shimoju
October 29, 2017
Tweet
Share
More Decks by Hiroshi Shimoju
See All by Hiroshi Shimoju
プロダクト開発エンジニアからSREへの挑戦 / backend-engineer-and-sre
shimoju
0
1.2k
実践 Heroku Enterprise / Unite Heroku Enterprise
shimoju
0
140
Herokuで本番運用する技術 / Heroku production
shimoju
2
6.1k
Web開発研修 イントロダクション / Web development training introduction
shimoju
0
11k
データ分析その前に〜Redashでデータ可視化からはじめよう / Data visualization by Redash
shimoju
1
1.9k
iOSアプリのテストをやってみて考えたこと / Testing iOS app
shimoju
1
150
Other Decks in Technology
See All in Technology
17年のQA経験が導いたスクラムマスターへの道 / 17 Years in QA to Scrum Master
toma_sm
0
370
ISUCONにPHPで挑み続けてできるようになっ(てき)たこと / phperkaigi2025
blue_goheimochi
0
130
20250326_管理ツールの権限管理で改善したこと
sasata299
1
330
OPENLOGI Company Profile for engineer
hr01
1
22k
大規模プロジェクトにおける 品質管理の要点と実践 / 20250327 Suguru Ishii
shift_evolve
0
270
AWS CDK コントリビュート はじめの一歩
yendoooo
1
120
Multitenant 23ai の全貌 - 機能・設計・実装・運用からマイクロサービスまで
oracle4engineer
PRO
2
110
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
20k
React Server Componentは 何を解決し何を解決しないのか / What do React Server Components solve, and what do they not solve?
kaminashi
6
1.2k
Road to SRE NEXT@仙台 IVRyの組織の形とSLO運用の現状
abnoumaru
0
380
Amazon EKS Auto ModeでKubernetesの運用をシンプルにする
sshota0809
0
110
移行できそうでやりきれなかった 10年超えのシステムを葬るための戦略 / phper-kaigi-2025-ryu
carta_engineering
0
680
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
118
51k
Agile that works and the tools we love
rasmusluckow
328
21k
KATA
mclloyd
29
14k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
A better future with KSS
kneath
238
17k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7.1k
Done Done
chrislema
183
16k
Optimising Largest Contentful Paint
csswizardry
35
3.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
Testing 201, or: Great Expectations
jmmastey
42
7.4k
Transcript
ը૾ՃαʔόΛ࡞ͬͯΈΑ͏ Լॏതࢿ(.01FQBCP *OD ৽ଔΤϯδχΞݚम࠲ֶ *NBHF.BHJDL࣮ફೖ
ΤϯδχΞ ೖࣾɾ৽ଔظ Լॏതࢿ!TIJNPKV@ &$ࣄۀ෦46;63*νʔϜ TIJNPKVPSH
None
None
͓͠ͳ͕͖ wࠓͷΰʔϧ w46;63*ͱը૾ॲཧ w*NBHF.BHJDLΛ৮ͬͯΈΑ͏ wը૾ՃαʔόΛ࡞ͬͯΈΑ͏
ࠓͷΰʔϧ w*NBHF.BHJDLΛ༻ͨ͠ը૾ՃΛͬͯΈͯɺ wը૾ॲཧͨͷͦ͠͏ʂͬͯͳΔ͜ͱ wഎޙʹ͋ΔࣜɺମܥతͳཧղͷͨΊͷཧʹ͍ͭ ͯ ൃදऀͷࣝෆʹΑΓ ѻ͍·ͤΜ
46;63*ͱը૾ॲཧ
46;63*ͱը૾ॲཧ wΞοϓ͞Εͨը૾ΛΞΠςϜը૾ ͱ߹ͯ͠αϜωΠϧΛ࡞Δ w5γϟπͷγϫʹ߹Θͤͯը૾Λ มܗ σΟεϓϨΠεϝϯτϚο ϐϯά ͤͨ͞Γ wӨΛ͚ͭͨΓ৭Λมͨ͠Γ
46;63*ͱը૾ॲཧ wΞοϓ͞Εͨը૾ΛΞΠςϜը૾ ͱ߹ͯ͠αϜωΠϧΛ࡞Δ w5γϟπͷγϫʹ߹Θͤͯը૾Λ มܗ σΟεϓϨΠεϝϯτϚο ϐϯά ͤͨ͞Γ wӨΛ͚ͭͨΓ৭Λมͨ͠Γ
*NBHF.BHJDLΛ ৮ͬͯΈΑ͏
ͱΓ͋͑ͣΠϯετʔϧ $ brew install imagemagick OR $ sudo apt-get install
-y imagemagick OR $ sudo yum -y install ImageMagick
*NBHF.BHJDL wը૾Ճͱ͍͑͜Εͱ͍͏༗໊ϥΠϒϥϦ wϝδϟʔ͔ΒϚΠφʔ·Ͱ͞·͟·ͳը૾ܗࣜʹରԠ wػೳ͕ଟ͗ͯ͢੬ऑੑͨͼͨͼൃݟ͞ΕΔ͘Β͍ʜ w$Ͱ࣮͞Εɺଟ͘ͷݴޠͰόΠϯσΟϯά͕͋Δ w3VCZɿSNBHJDL NJOJ@NBHJDLHFN w1)1ɿ*NBHJDL֦ுϥΠϒϥϦͳͲ
ίϚϯυ wJNBHFNBHJDLͱ͍͏ίϚϯυͳ͍ wػೳ͝ͱʹDPOWFSUJEFOUJGZͳͲͷίϚϯυʹΘ͔Ε͍ͯΔ wͨͩ͠ɺ*NBHF.BHJDL͔Βͯ͢NBHJDLίϚϯυͷγϯϘ ϦοΫϦϯΫʹͳ͍ͬͯΔ
*NBHF.BHJDL 6CVOUV $ ls -Alh /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/bin-Q16 total 88K -rwxr-xr-x 1
root root 6.3K Jul 31 13:22 animate -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 compare -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 composite -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 conjure -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 convert -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 display -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 identify -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 import -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 mogrify -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 montage -rwxr-xr-x 1 root root 6.3K Jul 31 13:22 stream
*NBHF.BHJDL .BD)PNFCSFX $ ls -Alh /usr/local/Cellar/imagemagick/7.0.7-7/bin | grep -v config
total 64 lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 animate -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 compare -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 composite -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 conjure -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 convert -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 display -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 identify -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 import -> magick -r-xr-xr-x 1 shimoju admin 18K 10 9 18:25 magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 magick-script -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 mogrify -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 montage -> magick lrwxr-xr-x 1 shimoju admin 6B 10 7 21:02 stream -> magick
JEFOUJGZ wը૾ͷใΛग़ྗͰ͖Δ wαΠζΛͬ͞ͱΓ͍ͨͱ͖ͱ͔ɺ wେྔͷը૾ͷத͔ΒαΠζ͕ҧ͏ͷΛ୳ͨ͠Γͱ͔
JEFOUJGZ $ identify *.jpg original.jpg JPEG 800x533 800x533+0+0 8-bit sRGB
104823B 0.000u 0:00.000 resize.jpg JPEG 400x267 400x267+0+0 8-bit sRGB 37116B 0.000u 0:00.000 ϑΥʔϚοτจࣈྻ͜͜ΒΜࢀরɿhttps://www.imagemagick.org/script/escape.php $ identify -format '{"width": %w, "height": %h}' *.jpg | jq { "width": 800, "height": 533 } $ identify -format '%wx%h %f\n' *.jpg | grep -v 800x533 200x200 crop.jpg
DPOWFSU w͞·͟·ͳը૾ՃΛߦ͑Δɺ*NBHF.BHJDLͷϝΠϯίϚϯυ wҎ߱ͯ͢DPOWFSUίϚϯυΛѻ͍͖ͬͯ·͢
దͳը૾Λ༻ҙ͠·͢ ਖ਼ํܗ͡Όͳ͍΄͏͕͍͍Ͱ͢ɻ͜ͷը૾YQY ग़యɿIUUQTXXXQBLVUBTPDPNQPTUIUNM
ճస SPUBUF ճస $ convert -rotate 90 original.jpg rotate.jpg ্Լస
$ convert -flip original.jpg flip.jpg ࠨӈస $ convert -flop original.jpg flop.jpg ্Լࠨӈస $ convert -flip -flop original.jpg flipflop.jpg
None
αϯϓϧ TBNQMF ϐΫηϧΛؒҾ͘ $ convert -sample 10% original.jpg sample.jpg 10%ʹͳΔΑ͏ʹϐΫηϧΛؒҾ͍ͨ͋ͱɺ1000%ʹͳΔΑ͏ʹ֦େ
→ݩը૾ͱಉ͡αΠζͰϞβΠΫ͕͔͔Δ $ convert -sample 10% -sample 1000% original.jpg sample.jpg
None
ϦαΠζ SFTJ[F σϑΥϧτͰΞεϖΫτൺΛม͑ͳ͍ɿࢦఆͨ͠෯ɾߴ͞ʹऩ·ΔΑ͏ʹϦαΠζ͞ΕΔ $ convert -resize 400x400 original.jpg resize.jpg $
identify resize.jpg resize.jpg JPEG 400x267 400x267+0+0 8-bit sRGB 37116B 0.000u 0:00.000 !Λ͚ͭΔͱΞεϖΫτൺΛແࢹͯ͠ࢦఆͨ͠ʹϦαΠζ͢Δ $ convert -resize 400x400! original.jpg resize2.jpg ෯·ͨߴ͞ͷΈࢦఆͰ͖Δ $ convert -resize 400x original.jpg resize3.jpg
None
Τοδݕग़ FEHF ෆ࿈ଓʹมԽ͍ͯ͠ΔՕॴΛݕग़͢Δ $ convert -edge 5 original.jpg edge.jpg ΛมԽͤͯ͞ΈΑ͏
$ convert -edge 10 original.jpg edge.jpg $ convert -edge 1 original.jpg edge.jpg
None
Γൈ͖ DSPQ -gravityͰج४Λࢦఆ -crop widthxheightͰΓൈ͘αΠζΛࢦఆ +/-Ͱج४͔Βͷx,y࠲ඪΛࢦఆ $ convert -gravity center
-crop 200x200+0+0 original.jpg crop.jpg ը૾ӈ্Λج४ʹɺxʹ140px,yʹ50pxҠಈ͠ɺͦͷ͔Β200x200pxΓൈ͘ $ convert -gravity northeast -crop 200x200+140+50 original.jpg crop.jpg
None
ృΓ͠ FYUFOU ࢦఆͨ͠αΠζʹͳΔΑ͏ʹ༨നΛՃ͢Δ ༨നͷ৭-backgroundͰࢦఆͰ͖Δ ਖ਼ํܗͷαΠζ͕ඞཁͳͷʹ4:3ͷը૾͔͠ͳ͍ͱ͔ʹศར $ convert -background black -gravity
center \ -extent 800x800 original.jpg extent.jpg PNG(ಁա͕ѻ͑ΔϑΥʔϚοτ)Ͱ͋ΕtransparentͰಁաͰ͖Δ $ convert -background transparent -gravity north \ -extent 1000x1000 original.jpg extent.png
None
ͦΖͦΖ߹ͨ͘͠ ͳ͖ͬͯͨΑͶʁ
ͦͷલʹจࣈͷը૾Λ࡞͓ͬͯ͜͏ $ convert -background transparent \ -fill '#ff6060' -font Arial
-pointsize 128 label:LGTM lgtm.png ࢦఆαΠζͰ࡞ $ convert -size 400x200 -gravity center -background transparent \ -fill '#ff6060' -font Arial -pointsize 128 label:LGTM lgtm.png
߹ DPNQPTJUF original.jpgͷ্ʹlgtm.pngΛ߹ͯ͠ɺcompose-over.jpgͱͯ͠ग़ྗ $ convert original.jpg lgtm.png -gravity center \
-compose over -composite compose-over.jpg -geometryͰج४͔ΒҠಈ $ convert original.jpg lgtm.png -gravity center -geometry +150+50 \ -compose over -composite compose-over.jpg
None
ඳըϞʔυ CMFOENPEF -composeͰඳըϞʔυΛࢦఆ͢Δ ࢉ (multiply) $ convert original.jpg lgtm.png -gravity
center -geometry +150+50 \ -compose multiply -composite compose-multiply.jpg ΦʔόʔϨΠ (overlay) $ convert original.jpg lgtm.png -gravity center -geometry +150+50 \ -compose overlay -composite compose-overlay.jpg ݮࢉ (subtract) $ convert original.jpg lgtm.png -gravity center -geometry +150+50 \ -compose subtract -composite compose-subtract.jpg
None
None
None
ඳըϞʔυ CMFOENPEF wॏͶΒΕͨը૾ΛͲͷΑ͏ʹ߹͢Δ͔ΛࢦఆͰ͖Δ w IUUQJNBHFNBHJDLSVMF[KQBSDIJWFT w1IPUPTIPQͳͲͷը૾ฤूιϑτʹ͋Δͷͱಉ༷ w࣮ࡍͲΜͳܭࢉͰࢉग़͞ΕΔ͔ιʔεΛಡΊΘ͔Δʜ͕ɺײ֮Λ ͔ͭΉʹ(*.1ͷυΩϡϝϯτ͕Θ͔Γ͍͢ w IUUQTEPDTHJNQPSHKBHJNQDPODFQUTMBZFSNPEFTIUNM
wྫʣࢉɿ߹ը૾ͷ৭্ଆͷ৭ Լଆͷ৭
ը૾ՃαʔόΛ ࡞ͬͯΈΑ͏
-FOTɿ46;63*ͷը૾Ճαʔό w46;63*Ͱ͍ͬͯΔը૾ՃαʔόΛʮ-FOTʯͱݺΜͰ͍Δ wը૾ॲཧʹ*NBHF.BHJDLΛ༻ w5γϟπͷαϜωΠϧը૾ੜॲཧ͜͜ΒΜ w ࣾϦϙδτϦͷ63-ͷͨΊলུ
-(5.(FOFSBUPS ͯ͠ͳ͍ wͦͷ໊ʮ:04"406ʯ wIUUQTHJUIVCDPNTIJNPKVZPTBTPV w3&"%.&ΛಡΜͰΠϯετʔϧ͍ͯͩ͘͠͞ wॳճͷϏϧυͪΐͬͱ͕͔͔࣌ؒΓ·͢ʜʜ wϦϙδτϦԼʹదͳը૾Λஔ͍ͯɺ IUUQMPDBMIPTUJNBHFTJNBHFKQHʹΞΫηεͯ͠ΈΔ
(Pݴޠ w(PPHMF͕։ൃͨ͠ɺ͍ΖΜͳͷ͕ͳ͍ݴޠ ౖΒΕͦ͏ wΫϥε͕ͳ͍ɺΑͬͯܧঝͳ͍ wྫ֎͕ͳ͍ wδΣωϦΫε͕ͳ͍ wؔܕ༝དྷͷύϥμΠϜͳ͍ wෆมม0QUJPOBMɺNBQpMUFSͳͲͷίϨΫγϣϯૢ࡞
(Pݴޠ wݴޠ༷Λখ͘͢͞Δ͜ͱͰɺίϯύΠϧ͕ߴͰशಘ༰қ w͔ͳ͍ྖҬ͋Δ͕ɺదͨ͠ྖҬͰҖྗΛൃش͢Δ wόΠφϦ͕ੜ͞ΕΔͨΊɺ$-*πʔϧϛυϧΣΞʹศར w੩తܕͷԸܙΛड͚ͳ͕ΒɺܕਪͰܕΛ໌ࣔͤͣʹ։ൃͰ͖Δ wฒߦॲཧΛߦ͏ͨΊͷݴޠ༷ HPSPVUJOF ͕͋Γɺൺֱత؆୯ʹฒ ߦϓϩάϥϛϯά͕Ͱ͖Δ
දతͳιϑτΣΞ wίϚϯυϥΠϯπʔϧ wHIRɺQUɺIVHPɺOZBIDMJ wϛυϧΣΞɾαʔό w%PDLFSɺDPOTVMɺ%SPOFɺ45/4 wൺֱతখ͞ͳ ϚΠΫϩαʔϏεࢦͳ "1*αʔό wϩϦϙοϓʂϚωʔδυΫϥυͷ"1*αʔό wը૾Ճɾ৴αʔϏε*NBHF'MVY
ίʔυΛಡΜͰΈΑ͏ wNBJOHP wΤϯτϦϙΠϯτɻϦΫΤετϧʔλʔ ίϯτϩʔϥʔ w4JOBUSBͳͲͷΑ͏ͳϚΠΫϩϑϨʔϜϫʔΫελΠϧ wDPOWFSUFSJNBHFHP wը૾ՃΛநԽͨ͠ύοέʔδɻ͜͜Ͱ*NBHF.BHJDLΛར༻
ίʔυΛ͍ͬͯ͡ΈΑ͏ wυΩϡϝϯτΛಡΈͳ͕Β wJNBHJDLɿDPOWFSUFSJNBHFHPͰར༻ wIUUQTHPEPDPSHHPQLHJOHPHSBQIJDTJNBHJDLWJNBHJDL wHJOɿNBJOHPͰར༻ wIUUQTHPEPDPSHHJUIVCDPNHJOHPOJDHJO
·ͱΊ w46;63*Ͱը૾ॲཧ͕Ͳ͏ΘΕ͍ͯΔ͔Λͬͨ w*NBHF.BHJDLΛͬͨ؆୯ͳը૾ՃΛͬͯΈͨ wը૾ՃαʔόΛ͍ͬͯ͡Έͨ w(Pݴޠʹ৮ΕͯΈͨ
·ͱΊ wΰʔϧୡͰ͖·͔ͨ͠ʁ w*NBHF.BHJDLΛ༻ͨ͠ը૾ՃΛͬͯΈͯɺ wը૾ॲཧͨͷͦ͠͏ʂͬͯͳΔ͜ͱ
͜ΕͰ܅ -(5.ը૾࡞Γ์ͩʂ