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
Pure GoでアニメーションGIFのリサイズを実装する
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Takuto Nagami
June 07, 2024
Programming
860
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Pure GoでアニメーションGIFのリサイズを実装する
(Unofficial) Go Conference 2024 Pre Partyにて登壇した際の資料です。
Takuto Nagami
June 07, 2024
More Decks by Takuto Nagami
See All by Takuto Nagami
GopherCon @シアトル に行ってきました
logica0419
0
780
型落ちシンクライアント端末のPoEモジュールを自作したかった話
logica0419
0
720
The Journey of Connecting Japan to the Global Go Community
logica0419
1
170
Discovering Cilium: What eBPF Enabled in K8s Networking
logica0419
0
220
Do Gophers Dream of Stack Overflow?
logica0419
0
70
今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話
logica0419
10
1.8k
キャリア科目では教えてくれない、就活を生き抜く法則
logica0419
2
360
歴史から学ぶ、Goのメモリ管理基礎
logica0419
18
5.4k
【2025改訂版】ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
2
530
Other Decks in Programming
See All in Programming
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
14
11k
Seven New Principles of Software Engineering
yegor256
0
440
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
400
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
280
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
380
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
320
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
140
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
570
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
Spec-driven Development with AI
simas
PRO
0
2.2k
TS 7.0 で baseUrl が使えなくなった今、パスエイリアスをどうするか
bicstone
2
480
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
What's in a price? How to price your products and services
michaelherold
247
13k
Designing Powerful Visuals for Engaging Learning
tmiket
1
630
From π to Pie charts
rasagy
1
430
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.5k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
540
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
520
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
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をリサイズする際は是非お使いください