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
Pure GoでアニメーションGIFのリサイズを実装する
Search
logica / Takuto Nagami
June 07, 2024
Programming
0
540
Pure GoでアニメーションGIFのリサイズを実装する
(Unofficial) Go Conference 2024 Pre Partyにて登壇した際の資料です。
logica / Takuto Nagami
June 07, 2024
Tweet
Share
More Decks by logica / Takuto Nagami
See All by logica / Takuto Nagami
Kubernetesを知る
logica0419
19
6.1k
Resizing Animated GIFs Without CGO or Third-Party Libraries
logica0419
2
39
徹底比較!HA Kubernetes ClusterにおけるControl Plane LoadBalancerの選択肢
logica0419
2
310
外部カンファレンスで登壇しよう! 〜「強い」エンジニアへの一歩を踏み出す〜
logica0419
4
200
kube-vipとkube-proxy置き換えCiliumを積んだ究極のK3sクラスタを建てる
logica0419
4
560
ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
10
1.5k
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
5
670
標準ライブラリの奥深アップデートを掘り下げよう!
logica0419
2
740
超アナログ中心な印刷会社で「エンジニアリング」を見直す
logica0419
4
250
Other Decks in Programming
See All in Programming
Amazon Nova Reelの可能性
hideg
0
190
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
3
2.1k
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
140
VisionProで部屋の明るさを反映させるシェーダーを作った話
segur
0
100
AHC041解説
terryu16
0
340
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
1.3k
Flatt Security XSS Challenge 解答・解説
flatt_security
0
720
ChatGPT とつくる PHP で OS 実装
memory1994
PRO
3
190
php-conference-japan-2024
tasuku43
0
430
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
140
為你自己學 Python
eddie
0
520
rails newと同時に型を書く
aki19035vc
5
710
Featured
See All Featured
For a Future-Friendly Web
brad_frost
176
9.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
We Have a Design System, Now What?
morganepeng
51
7.3k
KATA
mclloyd
29
14k
Become a Pro
speakerdeck
PRO
26
5.1k
Building Applications with DynamoDB
mza
93
6.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
19
2.3k
Optimising Largest Contentful Paint
csswizardry
33
3k
A designer walks into a library…
pauljervisheath
205
24k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Transcript
logica X: @logica0419 GitHub: @logica0419 Pure Goで アニメーションGIFの リサイズを実装する logica
X: @logica0419 GitHub: @logica0419
自己紹介 • logica (ろじか) • 千葉工業大学 情報科学部情報ネットワーク学科 • ネットワークコンテンツ研究会 所属
◦ 数人の自宅サーバーをVPNで繋いでクラウド基盤 作ろうとしてます • (元 東京工業大学) • (元 traP)
このLTは今年の GopherCon 及び Go Conference に 応募して どちらも不採択となった プロポーザルを 超超圧縮した
バージョンです
アニメーションGIFの リサイズ (拡縮) を アプリに組み込んだことが ある人?
アニメーションGIFの リサイズ (拡縮) を 仕事で使ったことが ある人?
プロポーザルが不採択に なった理由が わかりましたね! 正直あまりに需要が少なかったと思う
なぜアニメーションGIFリサイズなのか • https://github.com/traPtitech/traQ ◦ 昨年度までメンテしてたプライベートSNS • アニメーション付きアイコン・スタンプの作成機能 ◦ 容量削減のため アップロード
された画像を リサイズする 必要があった
GoでのGIFリサイズの現状 • Pure Go実装だと、まともな情報が少ない ◦ 出回っている情報だけでは特定タイプのGIFしか 正確に処理できない ▪ GIFの仕様が複雑なせい ▪
Goのライブラリでデコードされた形が ちょっと扱いづらいせい ◦ サードパーティーライブラリも似たような感じ
GoでのGIFリサイズの現状 • ImageMagickや、Cライブラリのラッパーライブラリ ◦ 割と主流 ◦ かなり正確に処理できる ◦ 容量がデカい ▪
画像処理全般が一緒になっている事が多い ◦ Distrolessイメージに積みづらい ▪ Distroless化に挑戦してみたかったのでネック
頑張ってPure Goでまともな GIFのリサイズを実装したい! 出来れば 標準 + golang.org/x ライブラリ だけでやりたい
GoでGIFを扱う • 標準ライブラリ image/gif ◦ https://pkg.go.dev/image/gif • gif.DecodeAll() して、*gif.GIF 構造体で扱える
type GIF struct { Image []*image.Paletted ← 1枚1枚のフレーム Delay []int LoopCount int Disposal []byte ← 激ヤバポイント① Config image.Config ← GIFのメタデータ類 BackgroundIndex byte ← 激ヤバポイント② }
GIFリサイズの沼 • 大抵の記事は、ここから Image 配列の中のフレームを 1つずつリサイズするところまでしか書いてない • それだけでは対応できない部分がたくさんある! 今回は紹介したかった沼ポイントの うち1つを抜粋して説明します
差分最適化
GIFがあります • 初音ミクですね • 瞬きしてますね
リサイズすると • 違いが分かりやすいよう 「同じサイズにリサイズ」 してみた
Long_Miku.gif になってしまった
なぜ縦長になってしまったのか • 差分最適化 ◦ アニメーションで動かない部分は 次以降のフレームに含めない手法 ◦ 上から重ねて描画していく • 例えば今回のだと、各フレームのデータは
◦ 1枚目: 全体の画像 ◦ 2枚目以降: 赤枠部分の画像とその位置情報のみ • 情報量を削減できる
なぜ縦長になってしまったのか • 全てのフレームを指定されたサイズに合わせる実装だと ◦ 1枚目: 問題なし ◦ 2枚目以降: 引き伸ば されてしまう
という理由でLongになってしまう
解決策 • 全フレームでリサイズ後のサイズを計算する ◦ 指定されたリサイズ後のサイズと 元々のGIFのサイズから、拡縮比率を計算 ◦ それぞれのフレームの大きさに比率をかけて 適切なリサイズ後のサイズを計算する
すなわち • 全フレームでリサイズ後のサイズを計算する実装だと ◦ 1枚目: 問題なし ◦ 2枚目以降: 問題なし
解決! Happy!!!
まだ道のりは長い • 透明ピクセルに起因する謎ノイズ • Disposalというめんどくさい仕様 • 背景色がきちんと設定されていないGIF (!!!???????) • リサイジングの高速化
◦ 並列処理 ◦ リサイズする関数の入れ替えを可能に • リサイズ時のオプションをリッチに
最終的に、これらをまとめて github.com/logica0419/resigif を作りました
ありがとう ございました GIFをリサイズする際は是非お使いください