角度付きの繰り返し透かしタイル配置を作成
300×200の画像に100×50のタイルを間隔20と10、角度30°で並べると、端の欠けたタイルも含めて15か所になります。キャンバス、タイル、間隔、角度を入れると、回転した各タイルの中心が決まった順番で分かります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- キャンバスの幅
- 300
- キャンバスの高さ
- 200
- タイルの幅
- 100
- タイルの高さ
- 50
- 間隔 X
- 20
- 間隔 Y
- 10
- 数量
- 15
見える端の外側に何個のコピーが必要かを推測せず、繰り返し透かしの完全なグリッドを作成できます。画像キャンバスと透かしタイルの寸法、横と縦の間隔、回転角度をご指定ください。計算ツールは、境界で一部だけ見えるタイルも含め、キャンバスに接するすべての回転済みタイルについて安定した中心座標を返します。配置はキャンバス中央を基準とし、一貫した行番号と列番号を使用するため、画像、SVG、PDF、Canvasの描画処理へ直接渡せます。
キャンバスと透かしタイルを指定します
最初に出力先キャンバスの幅と高さを入力し、続いて回転前の透かしタイルの幅と高さを入力してください。すべての寸法には同じ単位を使用します。通常はピクセルですが、描画エンジンが別の座標体系を使う場合は、ポイントなどの単位でも構いません。
タイルは幅と高さの両方でキャンバス内に収まる必要があります。この検証により、幅と高さの取り違え、誤った単位変換、繰り返し模様ではなく一つの巨大な印を作ってしまう指定を検出できます。次に横方向と縦方向の間隔を設定してください。
これは回転後の画面上の絶対距離ではなく、グリッド固有の軸に沿ったタイル端同士の隙間です。ゼロにするとタイルの端が接し、大きな値にすると余白の多い軽やかな模様になります。返される原点はキャンバスの中心です。
行0、列0はその原点に中心を置くタイルを表すため、キャンバス寸法、間隔、角度を変更しても後続処理で安定した基準として利用できます。
回転と端の範囲をご理解ください
角度はキャンバスの中心を軸として、格子全体を時計回りに回転させます。有限の度数であればどの値も受け付け、1回転の範囲へ正規化します。そのため、マイナス30度と330度は同じ配置になります。
回転するとグリッドが覆うべき領域が広がります。中心が画像外にあるタイルでも、角が画像内に見える場合があるためです。そこで本ツールは、キャンバスを回転済みグリッドの軸へ投影し、候補となる行と列を有限の範囲で作成してから、回転した各タイルの長方形とキャンバスの長方形を比較します。
両者が接するか重なる場合だけ位置を返します。この正確な交差判定により、角のタイルが欠けることを防ぎ、単純に大きな境界箱を使った場合に含まれる遠いタイルも除外できます。座標はタイルの中心です。
境界の部分タイルは意図された結果ですので、出力先の描画処理でキャンバスに合わせて切り抜いてください。
配置を描画して再現します
返された順序のまま位置を処理してください。行番号は小さいものから大きいものへ進み、各行の中では列番号が小さいものから大きいものへ進みます。行番号と列番号はデバッグ、不透明度の交互切り替え、一つおきのタイル選択に便利ですが、座標の代わりにはなりません。
数値座標は小数点以下6桁へ丸められるため、シリアル化した結果の安定性を保ちながら、高解像度出力に必要なサブピクセル精度も維持できます。アルゴリズムはランダムなずれ、時計、保存済み状態、ネットワーク資源を一切使いません。
レンガ状のずらし、ランダムな揺らぎ、印ごとの回転、文字計測が必要な場合は、通常グリッドを受け取った後で変換を加えるか、専用の合成処理をご利用ください。
活用例
プレビュー画像を保護
商品、校正、作品集のプレビュー全体へロゴを繰り返し配置し、一度の切り抜きですべての印が消えないようにします。
描画指示を生成
配置計算を各レンダラーへ重複実装せず、Canvas、SVG、PDF、サーバー画像処理向けの安定した中心座標を作成します。
書き出し結果を統一
複数のキャンバス寸法で同じ角度と間隔の規則を再利用し、中央基準の決定的な模様を維持します。
よくある質問
x座標とy座標は角ですか、中心ですか?
タイルの中心です。 返された角度を使い、その点を軸として各透かしを回転、描画してください。
一部の中心がキャンバス外にあるのはなぜですか?
中心が外でも回転タイルがキャンバスと交差する場合があります。端と角を覆うための位置ですので、描画時に切り抜いてください。
角度はどちら向きに適用されますか?
通常の画像座標系、つまりxが右へ、yが下へ増える座標系で、正の角度は時計回りに回転します。
間隔をゼロにできますか?
はい。 ゼロにすると、そのグリッド軸で隣接するタイルの端同士が接します。負の間隔は指定できません。
タイルを画像より大きくできますか?
できません。タイルは縦横どちらもキャンバスに収まる必要があります。この決まりで、幅と高さの入れ違い、単位の換算ミス、繰り返し模様ではなく大きな判が1つだけになる指定を防げます。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/image/watermark-tile-repeat-layout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"canvas_width":800,"canvas_height":600,"tile_width":160,"tile_height":80,"spacing_x":40,"spacing_y":30,"angle_deg":-30}'const res = await fetch("https://api.kit.forhosting.com/image/watermark-tile-repeat-layout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"canvas_width": 800,
"canvas_height": 600,
"tile_width": 160,
"tile_height": 80,
"spacing_x": 40,
"spacing_y": 30,
"angle_deg": -30
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/watermark-tile-repeat-layout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"canvas_width": 800,
"canvas_height": 600,
"tile_width": 160,
"tile_height": 80,
"spacing_x": 40,
"spacing_y": 30,
"angle_deg": -30
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/watermark-tile-repeat-layout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"canvas_width":800,"canvas_height":600,"tile_width":160,"tile_height":80,"spacing_x":40,"spacing_y":30,"angle_deg":-30}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"canvas_width":800,"canvas_height":600,"tile_width":160,"tile_height":80,"spacing_x":40,"spacing_y":30,"angle_deg":-30}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/watermark-tile-repeat-layout", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"canvas_width": 800,
"canvas_height": 600,
"tile_width": 160,
"tile_height": 80,
"spacing_x": 40,
"spacing_y": 30,
"angle_deg": -30
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.watermark_tile_repeat_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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
回転と端の範囲をご理解ください
ラスターライブラリ、SVGやCSSの変換、Canvas APIでは、中心を軸にした回転を一貫して扱えるためです。
配置を描画して再現します
各レコードについて、透かしの中心をcenter_xとcenter_yへ置き、その中心の周囲でangle_degだけ回転させ、指定された幅と高さで描画します。同じ入力からは必ず同じJSONが返ります。API料金は、安全上の上限内であれば位置数にかかわらず1計算あたり$0.002です。
技術的な質問
API呼び出しの料金はいくらですか。
1回の計算は$0.002です。文書化された安全上の上限内で、結果には完全な位置一覧が含まれます。
タイルがキャンバスより大きい場合はどうなりますか。
繰り返しタイルはキャンバスの幅または高さを超えられないため、invalid_inputエラーを返します。