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
Takuto Nagami
June 07, 2024
Programming
0
760
Pure GoでアニメーションGIFのリサイズを実装する
(Unofficial) Go Conference 2024 Pre Partyにて登壇した際の資料です。
Takuto Nagami
June 07, 2024
Tweet
Share
More Decks by Takuto Nagami
See All by Takuto Nagami
GopherCon Tourのつくりかた
logica0419
1
17
Go言語はstack overflowの夢を見るか?
logica0419
0
340
あなたの言葉に力を与える、演繹的なアプローチ
logica0419
1
190
GC25 Recap+: Advancing Go Garbage Collection with Green Tea
logica0419
1
600
GopherCon Tour 概略
logica0419
2
210
言葉の壁を越えて ~Gophers EXと歩む海外登壇への道~
logica0419
1
50
Maintainer Meetupで「生の声」を聞く ~講演だけじゃないKubeCon
logica0419
1
510
理想の英語力に一直線!最高効率な英語学習のすゝめ
logica0419
6
430
Gophers EX: What We’ve Been Up To in Feb–May 2025 / 2025年2~5月 Gophers EX活動報告書
logica0419
0
84
Other Decks in Programming
See All in Programming
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
170
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
590
Claude CodeによるAI駆動開発の実践 〜そこから見えてきたこれからのプログラミング〜
iriikeita
0
250
私達はmodernize packageに夢を見るか feat. go/analysis, go/ast / Go Conference 2025
kaorumuta
2
570
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
450
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
11
6.7k
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
190
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
5k
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
510
技術的負債の正体を知って向き合う / Facing Technical Debt
irof
0
170
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
340
CSC305 Lecture 06
javiergs
PRO
0
240
Featured
See All Featured
Producing Creativity
orderedlist
PRO
347
40k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Context Engineering - Making Every Token Count
addyosmani
6
250
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
189
55k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Faster Mobile Websites
deanohume
310
31k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Thoughts on Productivity
jonyablonski
70
4.9k
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をリサイズする際は是非お使いください