zpaper-draft

Type to search...

to open search from anywhere

サムネイルとOGP

kumiko-genによるサムネイル生成と、svg-to-pngによるOGP画像変換の仕組み

ブログ記事のサムネイル画像とOGP(Open Graph Protocol)画像の生成・管理について説明します。

概要

各ブログ記事には、記事ヘッダーに表示されるサムネイル画像と、SNSでシェアされた際に表示されるOGP画像があります。サムネイルはkumiko-genで生成されるSVG、OGP画像はそのSVGから変換されるPNGです。

ファイル構成

サムネイルとOGP画像はblog/public/thumbnails/ディレクトリに配置されます。

  • {slug}.svg — 記事ヘッダーに表示されるサムネイル(kumiko-genで生成)
  • {slug}.png — OGPメタタグ用の画像(svg-to-pngで変換、1200x630px)

slugは記事のMDXファイル名(拡張子なし)と一致します。

kumiko-gen: サムネイルSVG生成

kumiko-gen (@takazudo/kumiko-gen) は、記事のslug文字列をシードとして組子模様のSVGサムネイルを生成するツールです。同じslugからは常に同一のSVGが生成されます。pnpm dlx経由で実行されるため、インストール不要です。

slug文字列からFNV-1aハッシュを生成し、決定的な疑似乱数(Mulberry32 PRNG)でパターン・配色・レイヤー構成を決定します。9種類のパターン(asanoha、mitsukude、goma、shippoなど)を複数レイヤーで重ね合わせ、36種類の組み込み配色スキーム(Dracula、Nord、Catppuccin、Gruvbox、TokyoNightなど)から選択されます。

ルートのスクリプトには--color-scheme random --zoom 5がデフォルトで含まれており、各slugに対して決定的にユニークな配色とズームビューが適用されます。

pnpm kumiko-gen <slug>

出力先: blog/public/thumbnails/{slug}.svg

主なオプション

オプション説明
--size <number>SVGサイズ(デフォルト: 800)
--zoom <number>ズームレベル(デフォルト: 1、推奨: 5)
--color-scheme <name>配色名、またはrandomでslugごとの決定的選択
--list-color-schemes利用可能な配色名を一覧表示
--fg "<color>"全レイヤーのストロークカラーを上書き
--bg "<color>"背景色
--stroke-width <n>ストローク幅の上書き
--divisions <n>グリッドの分割数

svg-to-png: OGP画像変換

svg-to-png は、kumiko-genで生成したSVGサムネイルをOGP用のPNG画像(1200x630px)に変換するツールです。本リポジトリのsub-packages/svg-to-png/に配置されており、sharpライブラリでSVGをラスタライズします。

変換パイプラインは以下の通りです。

  1. blog/public/thumbnails/{slug}.svgを読み込み
  2. 1200x1200でSVGをラスタライズ
  3. 上下を285pxずつセンタークロップして1200x630にリサイズ
  4. PNGとしてエンコード・書き出し
pnpm svg-to-png <slug>

出力先: blog/public/thumbnails/{slug}.png

一括変換

--allオプションでサムネイルディレクトリ内の全SVGを一括変換できます。

pnpm svg-to-png --all

新規記事のワークフロー

新しい記事を作成する際は、以下の手順でサムネイルとOGP画像を準備します。

  1. 記事のMDXファイルを作成
  2. kumiko-genでサムネイルSVGを生成
  3. svg-to-pngでOGP用PNGに変換
pnpm kumiko-gen my-article-slug
pnpm svg-to-png my-article-slug

ルートスクリプトには--color-scheme random --zoom 5が含まれているため、追加のフラグは不要です。

OGPメタタグ

ブログのNext.js側では、記事ページのgenerateMetadataがOGPメタタグを出力します。OGP画像にはblog/public/thumbnails/{slug}.pngが使用されます。

SNSでシェアされた際に、記事のタイトル・説明文・サムネイル画像がプレビューとして表示されます。

ツールの詳細仕様

各ツールの詳細な仕様については、それぞれのリポジトリ・パッケージを参照してください。