Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
go-thumber-imagick
Search
yoya
March 14, 2017
Technology
1
180
go-thumber-imagick
Go-Thumber に ImageMagick をつなげた話
yoya
March 14, 2017
Tweet
Share
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
160
ImageFluxBinary
yoya
2
2.8k
HEIF-kaisetsu
yoya
4
3.5k
chokaizomae
yoya
2
590
wildimagebinary
yoya
1
220
goimagicksyokai
yoya
2
1.1k
GoImagickThumbnail
yoya
0
1.6k
sushigazou
yoya
0
12k
twitterimgupload
yoya
0
390
Other Decks in Technology
See All in Technology
Amazon Bedrock Knowledge Bases × メタデータ活用で実現する検証可能な RAG 設計
tomoaki25
2
200
Python 3.14 Overview
lycorptech_jp
PRO
1
120
【U/day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
2
710
AI 駆動開発勉強会 フロントエンド支部 #1 w/あずもば
1ftseabass
PRO
0
400
Oracle Cloud Infrastructure IaaS 新機能アップデート 2025/09 - 2025/11
oracle4engineer
PRO
0
160
CARTAのAI CoE が挑む「事業を進化させる AI エンジニアリング」 / carta ai coe evolution business ai engineering
carta_engineering
0
2k
[デモです] NotebookLM で作ったスライドの例
kongmingstrap
0
160
Strands AgentsとNova 2 SonicでS2Sを実践してみた
yama3133
0
290
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
160
SREには開発組織全体で向き合う
koh_naga
0
380
初めてのDatabricks AI/BI Genie
taka_aki
0
210
生成AI時代におけるグローバル戦略思考
taka_aki
0
200
Featured
See All Featured
Docker and Python
trallard
47
3.7k
Visualization
eitanlees
150
16k
Prompt Engineering for Job Search
mfonobong
0
110
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
The Cult of Friendly URLs
andyhume
79
6.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
Context Engineering - Making Every Token Count
addyosmani
9
540
Faster Mobile Websites
deanohume
310
31k
A designer walks into a library…
pauljervisheath
210
24k
Tell your own story through comics
letsgokoyo
0
740
The Invisible Side of Design
smashingmag
302
51k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
0
57
Transcript
pixiv/go-thumber に ImageMagickをつなげた話 2017/03/14(Tue) “よや” <
[email protected]
> Go言語 GoImagick ImageMagick
はじめに pixiv/go-thumber をネタにした Go言語 と ImageMagick の話 ◦ Pixiv
さんの業務と直接関係ない話でごめ んなさい
もくじ pixiv/go-thumber について go-thumber + ImageMagick GoImagick
について ImageMagick 使用上の注意 画像プロキシ使用上の注意
pixiv/go-thumber とは https://github.com/pixiv/go-thumber by Google翻訳
go-thumber 資料 by pixiv サムネイルマスタとgo-thumber ◦ https://speakerdeck.com/harukasan/use- thumbnail-master-with-go-thumber
go-thumber の使い所 端末によって解像密度が違う (retina とか) ◦ Storage に全サイズの画像を置きたいか? Storage
に(大きめの) 画像がひとつあれば User の欲しいサイズ の画像を都度作る
go-thumber の構造 go の net/http + swscale(ffmpeg) + libjpeg
go-thumber thumberd go package net/http ffmpeg libswscale thumbnail libjpeg jpeg swscale mkthum cgo cgo HTTPプロキシ 縮小/拡大 JPEG入出力
go-thumber で物足りないとこ 案件によっては機能が足りない ◦ JPEGのみで、PNG, GIFが使えない ◦ 画像合成とかできない (ロゴとか)
◦ 文字入れできない (著作権表示とか) Gopher
go-thumber 改造案 辛い! (YUV とか JPEG 決め打ちの作りなので尚更) go-thumber thumberd
go package net/http ffmpeg libswscale thumbnail libjpeg jpeg swscale mkthum png gif libpng giflib libavfilter avfilter cgo cgo cgo cgo cgo 画像合成, 文字入れ 縮小/拡大
ImageMagick でOK (1/2) 画像を処理したいメソッドが大体揃っ ている ◦ リサイズ ◦ フィルタ
◦ 画像合成 ◦ 文字入れ Gopher
ImageMagick で OK (2/2) メジャーな画像フォーマットからマイ ナーなものまで100種類以上に対応して る http://www.imagemagick.org/script/
formats.php png jpeg gif inline sixel webp svg pdf 超メジャー 最近の キワモノ系 (Webの base64画像と か) ベクター画像 dcm 医療系 (DICOM等) 古いの sun
Go で ImageMagick を使うには 公式サイトを見る ◦ http://imagemagick.org/script/api.php#go MagickWand
と MagickCore の Go バ インディング ◦ GoImagick はMagickCore の定義を取り入 れるけど、関数は MagickWand だけ使う
GoImagick とは https://github.com/gographics/imagick MagickWand API (C言語)の Go バイン
ディング (thin ラッパー) ◦ Go 言語で ImageMagick の機能が大体使える
go-thumber + ImageMagick GoImagick でつなげる yoya-thumber thumberd go package net/http
GoImagick imagick thumbnail ImageMagick MagickWand cgo
yoya-thumber https://github.com/smartnews/yoya- thumber Yoya-thumberのOSS公開に寄せて ◦ http://developer.smartnews.com/blog/ 2016/12/19/yoya-thumber/
yoya-thumber と go-thumber ◦ http://blog.awm.jp/2017/01/01/yoya-thumber/
動作サンプル go-thumber と同じよ うなパラメータ
ImageMagick の注意点 沢山の画像形式に対応しすぎ ◦ 脆弱性が入り易い (マイナーな形式は危険 ◦ 形式を絞る必要がある
処理が重たい ◦ 画像データ全部をメモリ展開する ◦ 文字入れはじめの1回目がめっちゃ重たい
ImageMagick security policy Policy.xml で拒否する形式を指定 ◦ ブラックリスト形式でした (過去形)
漏れがあるかも。。 バージョンアップで新しい形式が増え たら? <policymap> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern=”GIF" /> </policymnap>
Yoya-thumber では バイナリみて知らない形式を排除 https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L182
ImageMagick security policy改良 ◦ ImageMagick 6.9.7-7 で仕様追加 ホワイトリスト形式 <policymap>
<policy domain=”delegate” rights=“none” pattern=“*” /> <policy domain="coder" rights=”none" pattern=”*" /> <policy domain="coder" rights=”all" pattern=”{PNG,JPEG,GIF,WEBP}" /> </policymnap>
GIF アニメ辛い ImageMagick は全コマをメモリに展開 するので、すぐメモリ不足になる 仕方ないので、ImageMagick に GIF
バ イナリを渡す前に、バイナリを編集し て1コマのGIFアニメにする。
GIFアニメは1枚のみ(力づく) https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L232
画像 Proxy の注意点 サーバを素のまま晒すと危険 というか、F5 しなくても普通に死ぬ。 thumberd Client
F5連打 CPU が死ぬ!
Reverse proxy キャッシュを仕込む (F5 耐性) サーバ nginx thumberd reverse
proxy 8000 80 80,443 upstream Client
更に forward proxy サイズ違いでアクセスし直さない サーバ nginx thumberd reverse proxy
nginx forward proxy 8000 80 80,443 3128 upstream Client
はじめの一歩が辛い問題 URL 公開した時の①発めは cache が 効かない問題 サーバ nginx thumberd
Client 絶賛 処理中 やっぱり CPU が死ぬ!
Nginx proxy_cache_lock 処理中の URL アクセスは待たせる! サーバ nginx thumberd Client
絶賛 処理中
ImageProxy as A Service 画像プロキシのクラウドサービス ◦ 面倒ならそういうのを使った方が楽 https://www.sakura.ad.jp/services/
imageflux/
ImageFlux
まとめ go-thumber 改造楽しい GoImagick 結構いいよ Reverse proxy
大事 Nginx proxy_cache_lock すごい ImageFlux みたいなクラウドサービス もあるよ