OGP画像の動的生成

統一OGP画像を作ったところで、そういえば最近のサービスはどこもOGP画像をダイナミック生成させていて、リッチでちょっと羨しいなと思っていたことに気付く。こんな日記には実装・運用コスト的に、見合う価値があるわけないのだけど、バックエンド置き換えの機会ということでやってみることにした。
使ってるのは golang 標準の image と golang.org/x/image/font/opentype
RGBAで処理しつつ、最終的に16色のパレットに割り当ててサイズを減らしている。一応ファイルキャッシュをしたいが、あまり容量の余裕のあるサーバではないのでできる限りのことをする。
以下のような感じで最適化した。パレット化の効果はすさまじい。
- 初期実装 (RGBA / BestCompression なし): 66KB
- BestCompression 適用後: 64KB
- 256色パレット化 (RGBA → Paletted): 25KB
- 128色パレット化: 23KB
- 64色パレット化: 21KB
- 32色パレット化: 19KB
- 16色パレット化: 15KB
あと速度的にも手元で 1600req/sec ぐらい (静的ファイル 590000req/secに対し) 出るようにまで調整してある (pprof の結果を Gemini CLI に投げつけると割とよくやってくれた)
ggはダメでした
gg で Noto Sans JP を読むと交差部分が正しく描画されなくてだめだった。Gemini CLI が「OGP作るならこれ!」っていうから、とりあえず採用してみたけどかなしい。あきらかにだいぶ古いライブラリっぽいしなあ。
結果的には images で必要十分かつパフォーマンスも満足なのでよかった。
タイトル長いエントリのとき

短くフェードアウトするようにしてみた。最初は「…」で省略してたけどイマイチだったのでこの形に
関連エントリー
- desmos で使う色を増やす方法 みんな大好き Desmos Graphing Calculator の話。 グラフの色に設定できるのが、デフォルトだと6色しかないけど、簡単...
- パフォーマンスチューニング pprof でひたすら潰していった。html/template のリフレクションを丁寧に潰すのが地味に効く (funcMap 呼ぶのが本当に...
- ✖ ogp の画像が自分の写真で、Slack に流れきたのを見てゾっとしたので作りかえた。 HTMLで1200x630指定して作って「ノードのス...
- サーマルカメラ UNI-T UTi260B の画像から文字を消す UTi260B はなぜか表示されている文字を消す機能がない。常に時計やバッテリー表示などを含めてコピーされる。これが邪魔なので消したい。 ス...
- SRAM 使用量のカウント #!/usr/bin/env ruby require 'pp' D = Struct.new(:sec, :size, :name) ta...