Estimez la largeur de votre panorama à partir de photos
Avant d'assembler un panorama, il est utile de connaître la largeur du canevas final.
Lancer gratuitement
Ce calculateur gratuit prend les dimensions en pixels de chaque cliché qui se chevauche et le recouvrement horizontal estimé entre images consécutives, puis renvoie la largeur du panorama, le recouvrement total en pixels et la hauteur du panorama lorsque chaque image en déclare une. Tout s'exécute dans votre navigateur, l'usage interactif ne coûte rien, et le même calcul est disponible via l'API à $0.002 par requête pour vos pipelines.
Comment la largeur du panorama est estimée
Un panorama assemblé n'est pas simplement la somme des largeurs des photos, car les images consécutives se chevauchent. Cet outil parcourt votre liste d'images de gauche à droite, exactement dans l'ordre d'assemblage. Pour chaque paire adjacente, il calcule la zone commune : le pourcentage de recouvrement que vous indiquez, appliqué à la plus étroite des deux largeurs. Choisir la largeur la plus étroite est l'option prudente et physiquement sensée — la bande commune ne peut jamais dépasser l'une des deux images qu'elle relie. Ce recouvrement en pixels est ensuite soustrait lorsque l'image suivante est posée, de sorte que le total n'augmente que de la bande nouvelle et non dupliquée de chaque photo. Le résultat est la largeur estimée du canevas final en pixels. Le calcul étant une simple somme de produits, l'estimation est exacte pour les pourcentages fournis ; la seule incertitude tient à la fidélité de vos estimations de recouvrement par rapport à ce que l'appareil a réellement capturé. En prise de vue à main levée, des recouvrements de 20 % à 40 % sont typiques, tandis qu'une tête panoramique sur trépied permet de planifier des valeurs plus serrées et prévisibles.
Ce qu'il faut saisir et ce que vous obtenez
L'entrée est une liste de fiches d'images dans l'ordre d'assemblage. Chaque fiche requiert une largeur en pixels ; la hauteur est facultative, et overlap_pct est le recouvrement horizontal que cette image partage avec la suivante, exprimé en pourcentage de 0 inclus à 100 exclu. La dernière image n'a pas de voisine, donc sa valeur de recouvrement est ignorée. La sortie vous donne image_count, l'estimation panorama_width, total_overlap_px (le nombre de pixels dupliqués sur tous les raccords), sum_widths_px (le total naïf si l'on ignorait le recouvrement) et panorama_height dès que chaque fiche déclare une hauteur — prise comme le maximum, car le canevas doit contenir l'image la plus haute. Un recouvrement de 100 % ou plus est rejeté avec une erreur claire, car deux images qui se recouvrent entièrement n'apportent aucune information nouvelle et signalent généralement une erreur de saisie. Toutes les valeurs sont arrondies à six décimales pour des résultats stables et comparables d'une exécution à l'autre.
Conseils de planification pour de meilleurs assemblages
Utilisez cette estimation avant de photographier ou avant de réserver de l'espace disque pour un énorme canevas. Si vous connaissez votre objectif, la taille du capteur et l'angle de rotation entre les clichés, vous pouvez déduire le pourcentage de recouvrement du champ de vision horizontal : la fraction répétée de l'image vaut un moins le pas angulaire divisé par le champ de vision. Appliquez ce même pourcentage à chaque raccord pour un balayage uniforme, ou faites-le varier par paire si vous avez changé de pas en cours de séquence. Gardez au moins 15 % de recouvrement pour que le logiciel d'assemblage dispose d'assez de points communs, et visez 30 % ou plus dans les scènes pauvres en texture comme le ciel ou l'eau. Si l'estimation dépasse largement ce que votre éditeur ou votre imprimante accepte, réduisez le nombre d'images, augmentez le recouvrement pour que chaque cliché apporte moins de surface nouvelle, ou prévoyez de réduire le canevas final. Ce calculateur étant déterministe et instantané, vous pouvez ajuster librement le nombre d'images et les recouvrements jusqu'à ce que la taille projetée convienne à votre objectif.
Cas d’usage
Planification préalable pour les panoramas de paysages
Un photographe qui prépare un balayage de cinq images d'un horizon urbain saisit la largeur de chaque cliché et le recouvrement prévu de 30 % pour vérifier que le canevas final sera assez large pour un tirage grand format avant de quitter la maison.
Dimensionnement du canevas et du stockage pour le travail gigapixel
Un studio qui construit une mosaïque gigapixel de dizaines de clichés au téléobjectif estime la largeur assemblée pour vérifier la mémoire, le disque de travail et les limites d'export de son logiciel d'assemblage avant la séance.
Vérification de cohérence d'un pipeline d'assemblage
Un développeur qui traite par lots des séquences de photos de drone appelle l'API à $0.002 par requête pour prédire les dimensions de sortie et repérer les séquences dont les recouvrements produiraient un résultat anormalement étroit ou large.
Questions fréquentes
Pourquoi mon panorama n'est-il pas simplement la somme des largeurs des images ?
Parce que les images consécutives se chevauchent. La bande dupliquée entre chaque paire est soustraite, donc la largeur finale est la somme des largeurs moins le recouvrement en pixels de chaque raccord.
Comment le recouvrement entre deux images est-il calculé ?
Votre pourcentage de recouvrement est appliqué à la plus étroite des deux largeurs de chaque paire adjacente, car la zone commune ne peut pas dépasser l'une ou l'autre image. Cette valeur en pixels est ensuite soustraite lorsque l'image suivante est ajoutée.
Que se passe-t-il si je saisis un recouvrement de 100 % ou plus ?
La requête est rejetée comme entrée invalide. Un recouvrement complet signifie que la deuxième image n'apporte aucune surface nouvelle, ce qui contredit le principe de l'assemblage et indique presque toujours une erreur de saisie.
L'ordre des images a-t-il de l'importance ?
Oui. Les fiches sont traitées dans l'ordre d'assemblage, de gauche à droite, et chaque overlap_pct décrit le raccord entre cette image et la suivante. La valeur de recouvrement de la dernière image est ignorée.
Puis-je aussi estimer la hauteur du panorama ?
Oui. Lorsque chaque fiche d'image inclut une hauteur, le résultat comprend panorama_height, pris comme la hauteur maximale pour que le canevas contienne l'image la plus haute. Si une hauteur manque, le champ est omis.
L'outil est-il gratuit et fonctionne-t-il en ligne ?
L'usage interactif s'exécute entièrement dans votre navigateur, gratuitement — rien n'est téléversé. Le même calcul est également proposé via l'API à $0.002 par requête pour les pipelines automatisés.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/image/stitch-panorama-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"images":[{"width":4000,"height":3000,"overlap_pct":30},{"width":4000,"height":3000,"overlap_pct":25},{"width":4000,"height":3000}]}'const res = await fetch("https://api.kit.forhosting.com/image/stitch-panorama-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"images": [
{
"width": 4000,
"height": 3000,
"overlap_pct": 30
},
{
"width": 4000,
"height": 3000,
"overlap_pct": 25
},
{
"width": 4000,
"height": 3000
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/stitch-panorama-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"images": [
{
"width": 4000,
"height": 3000,
"overlap_pct": 30
},
{
"width": 4000,
"height": 3000,
"overlap_pct": 25
},
{
"width": 4000,
"height": 3000
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/stitch-panorama-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"images":[{"width":4000,"height":3000,"overlap_pct":30},{"width":4000,"height":3000,"overlap_pct":25},{"width":4000,"height":3000}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"images":[{"width":4000,"height":3000,"overlap_pct":30},{"width":4000,"height":3000,"overlap_pct":25},{"width":4000,"height":3000}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/stitch-panorama-estimate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"images": [
{
"width": 4000,
"height": 3000,
"overlap_pct": 30
},
{
"width": 4000,
"height": 3000,
"overlap_pct": 25
},
{
"width": 4000,
"height": 3000
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.stitch_panorama_estimate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_items | 200 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |