コンタクトシート配置生成
コンタクトシートの設計に、何度もサイズを変えて試す必要はありません。各画像のピクセル幅と高さ、使用できるシートの最大幅を入力すると、統一されたサムネイル枠を持つ実用的なグリッドを算出します。列数、行数、サムネイルの幅と高さ、最終的なシート寸法が返されます。すべての元画像の縦横比に対応し、指定幅を超えず、同じ入力からは常に同じ結果が得られる決定論的な計算です。
無料で実行
画像寸法と幅の上限をご用意ください
コンタクトシートに載せる画像ごとに、1 件のレコードをご用意ください。各レコードにはピクセル単位の幅と高さが必要で、いずれも正の整数でなければなりません。画像ファイル自体をアップロードしたりデコードしたりすることはなく、必要なのは寸法だけです。レコード数によって必要なグリッドセル数が決まり、元画像の最大幅と最大高さによって、コレクション全体を切り抜かずに収められる共通枠の形が決まるため、すべての画像を含めてください。次に、文書、書き出し、ギャラリーパネル、印刷工程などで利用できるピクセル幅を max_sheet_width に設定します。この値は超えることのできない上限として扱われます。外側の余白、キャプション、セル間隔、境界線、印刷の塗り足しは予約されません。別のシステムで後から追加する場合は、必要な幅をあらかじめ差し引いてください。画像が 0 件のリストは、列数、行数、サムネイル寸法に実用的な意味がないためエラーになります。小数、0、負数、無効な寸法も拒否し、自動処理の予測可能性を保ちます。
グリッドの選択方法をご確認ください
計算処理では、1 列から画像総数と同じ列数まで、実現可能なすべての候補を評価します。候補ごとに、切り上げによって必要な行数を求め、シートの最大幅を整数幅の均一なセルに分割し、元画像寸法の外接範囲から対応するサムネイル高さを導きます。これにより、contain 方式の配置に適した統一枠が得られます。レンダラーは各画像の縦横比を維持したまま枠内に収まるまで縮小するため、一方の軸に空きが生じる場合はありますが、切り抜きは不要です。次に、完成するシートの幅と高さの差を比較し、最も正方形に近い候補を選びます。コンパクトで均衡の取れたシートは一覧しやすく、サムネイルの大きさだけを最大化した場合に生じる極端な 1 列の長いシートを避けられます。正方形への近さが同じ場合はサムネイル面積が大きい候補を優先し、それも同じなら列数が少ない候補を選びます。また、サムネイル幅は最も幅広い元画像を超えないため、不必要な拡大もありません。計算には整数ピクセルと決定論的な優先規則を使用します。
レンダラーで計算結果をご利用ください
応答には count、columns、rows、thumbnail_size、sheet_size、max_sheet_width、fit モードが含まれます。sheet_size.width と sheet_size.height の寸法でキャンバスを作成し、インデックス i の要素を i modulo columns の列と、i を columns で割った整数部分の行に配置してください。各セルには返されたサムネイルの幅と高さを使用します。元画像を contain 操作で拡縮し、必要に応じてセル内で中央揃えにして、元の縦横比を維持してください。最終行が埋まらない場合は、残りのセルを空白にするか、その行だけを中央に配置できます。計算されたキャンバスは、扱いやすい長方形のグリッド形状を意図的に維持します。セル間隔やキャプションは含まれません。たとえば 10 ピクセルの間隔を加える場合は、呼び出し前に間隔の合計幅を確保するか、返されたセル寸法を一律に小さくしてください。この機能は対話操作にも反復可能な一括処理にも適しています。同一入力は同一出力となり、ネットワーク要求を行わず、画像内容も調べません。API の利用料金は 1 回あたり $0.002 で、ブラウザーでは同じ純粋な計算をローカル実行できます。
活用例
写真の校正用シートを設計
元写真を読み込んだり縮小したりする前に、固定された書き出し幅へ収まる均衡の取れたグリッドを選べます。
メディアライブラリのプレビューを作成
保存済みの画像メタデータから、ギャラリー用の再現可能な列数、行数、セル寸法を算出できます。
データセットの概要ページを準備
縦長、横長、正方形のサンプルを、切り抜かずに均一な contain 枠へ配置できます。
よくある質問
料金はいくらですか?
API 実行は 1 回あたり $0.002 です。同じ計算をブラウザー内で無料かつローカルに実行することもできます。
画像のサイズ変更や結合も行われますか?
いいえ。返されるのは配置の数値だけです。実際の拡縮と合成はお使いのレンダラーで行ってください。
縦長や横長の画像は切り抜かれますか?
切り抜く必要はありません。サムネイル寸法は、縦横比を保つ contain 配置用の外枠です。
間隔、キャプション、余白も含まれますか?
いいえ。セル間隔、ラベル、境界線、余白、塗り足しに必要な幅は、最大シート幅を指定する前に確保してください。
空の画像リストがエラーになるのはなぜですか?
要素が 0 件のグリッドには、有用な行数やサムネイル寸法を定められないため、明示的に拒否されます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/image/contact-sheet-layout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"images":[{"width":1600,"height":900},{"width":1200,"height":1600},{"width":2048,"height":1365},{"width":800,"height":800},{"width":1920,"height":1080}],"max_sheet_width":1200}'const res = await fetch("https://api.kit.forhosting.com/image/contact-sheet-layout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"images": [
{
"width": 1600,
"height": 900
},
{
"width": 1200,
"height": 1600
},
{
"width": 2048,
"height": 1365
},
{
"width": 800,
"height": 800
},
{
"width": 1920,
"height": 1080
}
],
"max_sheet_width": 1200
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/contact-sheet-layout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"images": [
{
"width": 1600,
"height": 900
},
{
"width": 1200,
"height": 1600
},
{
"width": 2048,
"height": 1365
},
{
"width": 800,
"height": 800
},
{
"width": 1920,
"height": 1080
}
],
"max_sheet_width": 1200
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/contact-sheet-layout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"images":[{"width":1600,"height":900},{"width":1200,"height":1600},{"width":2048,"height":1365},{"width":800,"height":800},{"width":1920,"height":1080}],"max_sheet_width":1200}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"images":[{"width":1600,"height":900},{"width":1200,"height":1600},{"width":2048,"height":1365},{"width":800,"height":800},{"width":1920,"height":1080}],"max_sheet_width":1200}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/contact-sheet-layout", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"images": [
{
"width": 1600,
"height": 900
},
{
"width": 1200,
"height": 1600
},
{
"width": 2048,
"height": 1365
},
{
"width": 800,
"height": 800
},
{
"width": 1920,
"height": 1080
}
],
"max_sheet_width": 1200
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.contact_sheet_layout",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 15 |
max_megapixels | 12 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |