
統一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 で必要十分かつパフォーマンスも満足なのでよかった。
タイトル長いエントリのとき

短くフェードアウトするようにしてみた。最初は「…」で省略してたけどイマイチだったのでこの形に