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
470
Pure GoでアニメーションGIFのリサイズを実装する
(Unofficial) Go Conference 2024 Pre Partyにて登壇した際の資料です。
logica
June 07, 2024
Tweet
Share
More Decks by logica
See All by logica
Resizing Animated GIFs Without CGO or Third-Party Libraries
logica0419
2
15
徹底比較!HA Kubernetes ClusterにおけるControl Plane LoadBalancerの選択肢
logica0419
2
160
外部カンファレンスで登壇しよう! 〜「強い」エンジニアへの一歩を踏み出す〜
logica0419
4
160
kube-vipとkube-proxy置き換えCiliumを積んだ究極のK3sクラスタを建てる
logica0419
4
390
ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
9
1.3k
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
3
610
標準ライブラリの奥深アップデートを掘り下げよう!
logica0419
2
690
超アナログ中心な印刷会社で「エンジニアリング」を見直す
logica0419
4
220
isugata 〜ISUCONベンチマーカーのためのカッコいいHTTPレスポンスバリデーターを作る
logica0419
0
560
Other Decks in Programming
See All in Programming
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.1k
Arm移行タイムアタック
qnighy
0
320
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
1
100
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
890
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
距離関数を極める! / SESSIONS 2024
gam0022
0
280
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
330
イベント駆動で成長して委員会
happymana
1
320
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
2
1.1k
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Language of Interfaces
destraynor
154
24k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
GraphQLとの向き合い方2022年版
quramy
43
13k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Being A Developer After 40
akosma
86
590k
The Pragmatic Product Professional
lauravandoore
31
6.3k
The Invisible Side of Design
smashingmag
298
50k
Designing the Hi-DPI Web
ddemaree
280
34k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
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をリサイズする際は是非お使いください