Generatore di provini fotografici
La pianificazione di un provino fotografico non dovrebbe richiedere ripetuti tentativi di ridimensionamento.
Esegui gratis nel browser
Inserisca larghezza e altezza in pixel di ogni immagine, insieme alla massima larghezza disponibile: il calcolatore restituisce una griglia pratica con un riquadro uniforme per le miniature. Il risultato indica colonne, righe, dimensioni delle miniature e dimensioni finali del foglio. Il layout accoglie tutte le proporzioni originali, rispetta il limite di larghezza e usa calcoli deterministici che producono sempre lo stesso risultato.
Prepari le dimensioni e il limite di larghezza
Inizi con un record per ciascuna immagine che dovrà comparire nel provino. Ogni record richiede larghezza e altezza in pixel, entrambe espresse come numeri interi positivi. I file non vengono caricati né decodificati: servono soltanto le loro dimensioni. Includa tutte le immagini, perché il numero di record stabilisce quante celle debba avere la griglia, mentre la larghezza e l’altezza massime delle sorgenti definiscono un riquadro comune capace di contenere l’intera raccolta senza ritagli. Imposti quindi max_sheet_width sulla larghezza in pixel disponibile nel documento, nell’esportazione, nel pannello della galleria o nel flusso di stampa. Il calcolatore considera tale valore un limite invalicabile. Non riserva spazio per margini esterni, didascalie, spaziature, bordi o abbondanze di stampa; sottragga prima tali aree se verranno aggiunte da un altro sistema. Un elenco vuoto viene rifiutato, poiché colonne, righe e dimensioni delle miniature non hanno significato senza elementi. Anche misure frazionarie, nulle, negative o non valide vengono respinte, mantenendo prevedibili le pipeline automatiche.
Comprenda come viene scelta la griglia
Il risolutore valuta ogni numero possibile di colonne, da una fino al totale delle immagini. Per ogni candidato calcola le righe necessarie arrotondando per eccesso, divide la larghezza massima del foglio in celle uniformi con larghezza intera e ricava l’altezza corrispondente dall’inviluppo delle dimensioni originali. Si ottiene così un riquadro omogeneo adatto al posizionamento contain: il renderer scala proporzionalmente ogni immagine finché entra nella cella, eventualmente lasciando spazio libero su un asse, ma senza richiedere ritagli. Il risolutore confronta poi larghezza e altezza del foglio risultante e sceglie il candidato più vicino a un quadrato. Un foglio compatto ed equilibrato è di solito più facile da consultare ed evita la striscia estrema a colonna singola prodotta dalla sola massimizzazione delle miniature. Se due candidati sono ugualmente quadrati, prevale quello con una maggiore area della miniatura; in caso di ulteriore parità, vince quello con meno colonne. La larghezza della miniatura non supera quella della sorgente più ampia, evitando ingrandimenti inutili. Tutti i calcoli adottano pixel interi e criteri di spareggio deterministici.
Utilizzi il risultato in un renderer
La risposta contiene count, columns, rows, thumbnail_size, sheet_size, max_sheet_width e la modalità fit. Crei una tela con sheet_size.width e sheet_size.height, quindi collochi l’elemento di indice i nella colonna corrispondente a i modulo columns e nella riga pari alla parte intera di i diviso columns. Ogni cella usa la larghezza e l’altezza restituite per la miniatura. Scali la sorgente con un’operazione contain, la centri nella cella se opportuno e ne conservi le proporzioni originali. Poiché l’ultima riga può essere incompleta, il renderer può lasciare vuote le celle finali oppure centrare tale riga; la tela calcolata mantiene intenzionalmente una geometria rettangolare semplice. Il risultato esclude spaziature e didascalie. Per aggiungere, ad esempio, dieci pixel tra le celle, riservi prima la larghezza complessiva degli spazi oppure riduca uniformemente le dimensioni restituite. L’endpoint è adatto sia all’uso interattivo sia ai processi ripetibili: lo stesso input produce lo stesso output, non vengono effettuate richieste di rete e il contenuto visivo non viene esaminato. L’uso tramite API costa $0.002 per richiesta, mentre il browser può eseguire localmente lo stesso calcolo puro.
Casi d'uso
Pianificare un foglio di prove fotografiche
Scelga una griglia equilibrata entro una larghezza fissa prima di caricare o ridimensionare le fotografie originali.
Creare l’anteprima di una raccolta multimediale
Trasformi i metadati salvati in colonne, righe e dimensioni di cella deterministiche per una galleria.
Preparare pagine riepilogative di dataset
Disponga campioni verticali, orizzontali e quadrati in riquadri contain uniformi senza ritagli.
Domande frequenti
Quanto costa?
L’esecuzione tramite API costa $0.002 per richiesta. Il calcolo può anche essere svolto gratuitamente e in locale nel browser.
Le immagini vengono ridimensionate o unite?
No. Vengono restituiti soltanto i valori del layout; il renderer esegue il ridimensionamento e la composizione effettivi.
Le immagini verticali e orizzontali verranno ritagliate?
Non occorre ritagliarle. La dimensione della miniatura è un riquadro pensato per il posizionamento contain proporzionale.
Spaziature, didascalie e margini sono inclusi?
No. Riservi lo spazio per distanze, etichette, bordi, margini o abbondanze prima di indicare la larghezza massima.
Perché un elenco di immagini vuoto produce un errore?
Una griglia senza elementi non ha un numero utile di righe né una dimensione utile delle miniature, quindi viene rifiutata esplicitamente.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo stack
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)Esempio di richiesta
{
"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
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.contact_sheet_layout",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_mb | 15 |
max_megapixels | 12 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |