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
June 07, 2024
Programming
0
440
Pure GoでアニメーションGIFのリサイズを実装する
(Unofficial) Go Conference 2024 Pre Partyにて登壇した際の資料です。
logica
June 07, 2024
Tweet
Share
More Decks by logica
See All by logica
外部カンファレンスで登壇しよう! 〜「強い」エンジニアへの一歩を踏み出す〜
logica0419
4
130
kube-vipとkube-proxy置き換えCiliumを積んだ究極のK3sクラスタを建てる
logica0419
4
260
ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
8
1.2k
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
3
550
標準ライブラリの奥深アップデートを掘り下げよう!
logica0419
2
650
超アナログ中心な印刷会社で「エンジニアリング」を見直す
logica0419
4
210
isugata 〜ISUCONベンチマーカーのためのカッコいいHTTPレスポンスバリデーターを作る
logica0419
0
480
開発を愛する人が最高にISUCONを楽しむ方法
logica0419
0
680
DockerでProtobufをコンパイルしたい!
logica0419
13
1.4k
Other Decks in Programming
See All in Programming
学生の時に開催したPerl入学式をきっかけにエンジニアが組織に馴染むために勉強会を主催や仲間と参加して職能間の境界を越えていく
ohmori_yusuke
2
320
Vertical Architectures for Scalable Angular Applications
manfredsteyer
PRO
0
180
2024-10-01 dev2next - Observability for Modern JVM Applications
jonatan_ivanov
1
140
知られざるNaNの世界
hole
3
1k
Subclassing, Composition, Python, and You
hynek
3
190
App Store Connect APIで 作業時間を増やそう
mot_techtalk
3
130
フロントエンドの現在地とこれから
koba04
10
4.6k
Why I Choose NetBeans for Jakarta EE
ivargrimstad
0
740
いかにして不足・不整合なくデータ移行したか
tjmtmmnk
1
570
CSC509 Lecture 04
javiergs
PRO
0
160
Modern Functional Fluent CFML REST by Luis Majano
ortus24
0
160
Scan with Decoupled Look-back and Onesweep Radix Sort
shocker_0x15
0
150
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
231
17k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
26
4.1k
BBQ
matthewcrist
85
9.2k
A designer walks into a library…
pauljervisheath
202
24k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Thoughts on Productivity
jonyablonski
67
4.3k
Documentation Writing (for coders)
carmenintech
65
4.4k
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をリサイズする際は是非お使いください