EXIFの向き補正を計算
1から8までのEXIFの向きの値ごとに、必要な補正が正確に分かります。向き6なら時計回りに90度回転し、反転は不要です。鏡像の値には正しい反転も示します。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 向き
- 6
- 回転角度 (度)
- 90
- 操作の順序
- flip_then_rotate
EXIFのOrientationタグは、保存された画素をどのように変換すれば画像が正しい向きで表示されるかをソフトウェアへ伝えます。この機能は、1から8までの有効な値を、実装にそのまま使える指示へ変換します。結果には時計回りの回転、水平・垂直反転のフラグ、適用順序が含まれます。一般的なカメラの回転だけでなく、実装を誤りやすい鏡像の向きにも対応しています。独自の対応表を管理せず、画像処理パイプライン、サムネイルサービス、アップロード検証、メタデータ検査にご利用いただけます。
正立した写真でも画素が横向きに保存される理由
多くのカメラやスマートフォンは、端末を回したときに全画素を並べ替えません。センサーに都合のよい向きで画素を保存し、表示方法を示すEXIFのOrientationタグを書き込みます。タグを解釈するソフトウェアでは正立して見えますが、無視するソフトウェアでは同じファイルが横向き、上下逆、または鏡像になる場合があります。
このタグは単なる4つの回転角ではなく、8つの値を定義しています。1、3、6、8は通常、半回転、四分の一回転を表します。2、4、5、7には反射が含まれるため、回転だけで処理すると、一部のスキャナー、前面カメラ、編集済みファイルで誤った結果になります。
本機能はメタデータから読み取った数値を受け取り、正確な補正を返します。画像のデコードや画素変更は行わず、画像処理ソフトが適用できる確実な変換指示だけを提供します。
返された変換を適用する方法
反射と回転は順序を交換できないため、5と7では特に重要です。順序を逆にすると別の鏡像になることがあります。標準対応では4を、水平反転後に180度回転する操作として表します。
これは幾何学的には垂直反転と等価です。反射軸を統一すると後続コードが簡潔になり、明示的な垂直フラグによって応答構造も安定します。1では回転も反転も不要です。
画像処理パイプラインへ組み込む位置
EXIF解析器がOrientationタグを読み取った直後、サイズ変更、切り抜き、OCR、顔検出、サムネイル生成より前に本計算をご利用ください。先に正規化すれば、後続の座標は正立表示を基準にできるため、誤った辺の切り抜きや横向き文字への認識処理を防げます。デコーダーがEXIFの向きを自動補正している場合は、変換を二重に適用しないでください。
自動処理を無効にするか、応答を検査と計画だけにお使いください。画素を物理的に変換した後は、通常Orientationを1に設定するか古いタグを削除します。残すと対応ビューアーが補正を繰り返す可能性があります。
本機能は決定論的で、画像データ、ネットワーク、端末固有の推測を使いません。同じタグから常に同じ指示を返すため、一般の写真では見つけにくい鏡像テストファイルを用いたライブラリ監査にも適しています。
活用例
アップロード写真の向きを正規化
サムネイル生成前に各ファイルのOrientationタグを変換し、すべての派生画像を実際に正立した画素へ統一します。
OCR用スキャン画像の準備
文字認識、レイアウト解析、座標抽出を始める前に、回転または反転した画素を補正します。
画像処理ライブラリの検証
8つのEXIF値すべてについて、ライブラリの動作を安定した標準の回転・反転対応と比較します。
よくある質問
どの値を指定できますか?
1から8までの整数のEXIF Orientation値だけを指定できます。
この機能が画像そのものを回転しますか?
いいえ。 保存画素を正立表示するための変換を返します。実際の適用はご利用の画像処理ライブラリで行ってください。
なぜ反転処理が必要なのですか?
4つのEXIF向きには反射が含まれます。回転だけでは、鏡像となる2、4、5、7を正しく表現できません。
反転と回転はどちらを先に行いますか?
先に反転し、そのあと時計回りに回転します。向き5と7では、反転と回転の順番を入れ替えると別の画像になってしまうため、順番が重要です。
写真ソフトがすでに向きを自動補正している場合は?
その場合は補正を二重にかけないでください。二度回転した写真になってしまいます。自動補正を止めるか、結果を確認用だけに使います。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/image/exif-orientation-fix \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"orientation":6}'const res = await fetch("https://api.kit.forhosting.com/image/exif-orientation-fix", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"orientation": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/exif-orientation-fix",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"orientation": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/exif-orientation-fix", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"orientation":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"orientation":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/exif-orientation-fix", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"orientation": 6
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.exif_orientation_fix",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
返された変換を適用する方法
orientationフィールドへ整数を指定してください。応答ではその値を再掲し、rotation_degreesを時計回りの0、90、180、270のいずれかで返します。さらにflip_horizontalとflip_verticalの真偽値を返します。operation_orderはflip_then_rotateですので、保存画素へ反転を適用してから時計回りに回転してください。1から8の範囲外、少数、数値文字列、欠落したフィールド、その他の型は推測せず、無効入力エラーとして返します。
技術的な質問
反転と回転はどの順序で適用しますか?
operation_orderの指定どおり、保存画素へ示された反転を先に適用し、その後rotation_degreesだけ時計回りに回転してください。
APIの利用料金はいくらですか?
APIリクエスト1件あたり$0.002です。アップロードやネットワークを使わないため、無料のブラウザ実行機能でも計算できます。