コンテンツにスキップ
APIリファレンスFunctionsgenerateImageMetadata

generateImageMetadata

generateImageMetadata を使用すると、1つの画像の異なるバージョンを生成したり、1つのルートセグメントに対して複数の画像を返したりできます。これは、アイコンなどのメタデータ値をハードコーディングすることを避けたい場合に便利です。

Parameters

generateImageMetadata 関数は、以下のパラメーターを受け取ります。

params (オプション)

generateImageMetadata が呼び出されるセグメントまで、ルートセグメントから取得した動的ルートパラメーターオブジェクトを含むオブジェクト。

icon.tsx
export function generateImageMetadata({
  params,
}: {
  params: { slug: string }
}) {
  // ...
}
RouteURLparams
app/shop/icon.js/shopundefined
app/shop/[slug]/icon.js/shop/1{ slug: '1' }
app/shop/[tag]/[item]/icon.js/shop/1/2{ tag: '1', item: '2' }

戻り値

generateImageMetadata 関数は、画像のメタデータ(altsize など)を含むオブジェクトのarrayを返す必要があります。さらに、各要素には、画像生成関数のプロパティとして渡されるPromiseであるid値が必須で含まれている必要があります。

Image Metadata Objectタイプ
idstring (required)
altstring
size{ width: number; height: number }
contentTypestring
icon.tsx
import { ImageResponse } from 'next/og'
 
export function generateImageMetadata() {
  return [
    {
      contentType: 'image/png',
      size: { width: 48, height: 48 },
      id: 'small',
    },
    {
      contentType: 'image/png',
      size: { width: 72, height: 72 },
      id: 'medium',
    },
  ]
}
 
export default async function Icon({ id }: { id: Promise<string | number> }) {
  const iconId = await id
  return new ImageResponse(
    (
      <div
        style={{
          width: '100%',
          height: '100%',
          display: 'flex',
          alignItems: 'center',
          justifyContent: 'center',
          fontSize: 88,
          background: '#000',
          color: '#fafafa',
        }}
      >
        Icon {iconId}
      </div>
    )
  )
}

画像生成関数のプロパティ

generateImageMetadata を使用する場合、デフォルトエクスポートされた画像生成関数は以下のプロパティを受け取ります。

id

generateImageMetadata から返された要素の id 値に解決される Promise。id は、generateImageMetadata から返されたものに応じて、string または number になります。

icon.tsx
export default async function Icon({ id }: { id: Promise<string | number> }) {
  const iconId = await id
  // Use iconId to generate the image
}

params (オプション)

画像が配置されているセグメントまで、ルートセグメントからの動的ルートパラメーターを含むオブジェクトに解決される Promise。

icon.tsx
export default async function Icon({
  params,
}: {
  params: Promise<{ slug: string }>
}) {
  const { slug } = await params
  // Use slug to generate the image
}

外部データの使用

この例では、params オブジェクトと外部データを使用して、ルートセグメントの複数のOpen Graph 画像を生成します。

app/products/[id]/opengraph-image.tsx
import { ImageResponse } from 'next/og'
import { getCaptionForImage, getOGImages } from '@/app/utils/images'
 
export async function generateImageMetadata({
  params,
}: {
  params: { id: string }
}) {
  const images = await getOGImages(params.id)
 
  return images.map((image, idx) => ({
    id: idx,
    size: { width: 1200, height: 600 },
    alt: image.text,
    contentType: 'image/png',
  }))
}
 
export default async function Image({
  params,
  id,
}: {
  params: Promise<{ id: string }>
  id: Promise<number>
}) {
  const productId = (await params).id
  const imageId = await id
  const text = await getCaptionForImage(productId, imageId)
 
  return new ImageResponse(
    (
      <div
        style={
          {
            // ...
          }
        }
      >
        {text}
      </div>
    )
  )
}

バージョン履歴

バージョン変更履歴
v16.0.0画像生成関数に渡されるidは、stringまたはnumberに解決されるPromiseになりました。
v16.0.0画像生成関数に渡されるparamsは、オブジェクトに解決されるPromiseになりました。
v13.3.0generateImageMetadata が導入されました。

次のステップ

すべてのメタデータAPIオプションを表示します。