Sarebbe bello poter creare post per i vari social in pochissimo tempo, partendo semplicemente da un'immagine o dalla foto di un prodotto, e ottenere contenuti pronti, ottimizzati e adattabili a qualunque piattaforma. Il tutto in pochi secondi.
Bello, sì. E da oggi è anche possibile.
Ho sviluppato ImageToPost, un piccolo programma in Python che utilizza Gemini 2.5 Flash Image per generare automaticamente post visivi professionali a partire da un'immagine. In questo articolo ti mostrerò come funziona, come l'ho realizzato e perché ho scelto di integrarlo tramite OpenRouter, così da dare sia una panoramica tecnica per gli sviluppatori, sia qualche spunto utile per chi è solo curioso.
Il problema che volevo risolvere
Chi gestisce un profilo Instagram (o un qualunque social visivo) sa quanto tempo richieda la creazione dei contenuti: anche con ottime foto, serve comunque un lavoro di editing per migliorare illuminazione, composizione, colori, sfondo e atmosfera dell'immagine.
Il flusso tipico
scatto → import → 20–30 minuti di editing → esportazione → upload
moltiplicato per decine di post, significa ore e ore perse ogni mese.
La domanda che mi sono fatto è stata:
E se l'intelligenza artificiale potesse fare tutto questo automaticamente, mantenendo però l'identità del prodotto o dell'oggetto originale?
Come nasce ImageToPost e perché ho scelto OpenRouter
Dopo vari test con diversi modelli di generazione e trasformazione di immagini, la scelta è ricaduta su Gemini 2.5 Flash Image (il modello "Flash" della serie 2.5, conosciuto informalmente anche come Nano Banana). È rapidissimo, ottimizzato per l'editing e capace di generare immagini pubblicitarie pulite e moderne.
Invece di utilizzare direttamente le API Google, ho deciso di passare da OpenRouter, una piattaforma che permette di usare molti modelli AI tramite un'unica API standardizzata. Questo approccio mi ha dato due vantaggi immediati:
- flessibilità: posso cambiare modello quando voglio senza riscrivere tutto il codice
- semplicità: gestione token, routing, versioni e billing molto più lineare
Cosa fa ImageToPost (in breve):
- Prende un'immagine di partenza (JPEG/PNG/WebP/GIF)
- La codifica in Base64 e la invia al modello Gemini 2.5 Flash Image tramite OpenRouter
- Riceve una nuova immagine generata/editata secondo le istruzioni del prompt
- La salva in locale
- Opzionalmente crea più varianti per confrontare i risultati
Come funziona sotto il cofano (versione tecnica)
1) Preparazione e configurazione
Il programma carica le dipendenze, legge la chiave API e converte l'immagine in Base64:
import base64
import requests
import os
from dotenv import load_dotenv
from datetime import datetime
load_dotenv()
def encode_image_to_base64(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
2) Rilevamento automatico del formato immagine
ImageToPost rileva automaticamente il formato e seleziona il MIME type corretto:
image_extension = os.path.splitext(image_path)[1].lower()
mime_type_map = {
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
'.webp': 'image/webp',
'.gif': 'image/gif'
}
mime_type = mime_type_map.get(image_extension, 'image/jpeg')
3) Prompt engineering e chiamata API
Il prompt è studiato appositamente per ottenere immagini pubblicitarie coerenti:
Prompt usato da ImageToPost:
"Crea una nuova immagine professionale per una pubblicità Instagram basata su questa immagine. Mantieni il prodotto principale ma migliorala con: sfondo elegante e moderno, illuminazione professionale, composizione pubblicitaria di alta qualità, colori accattivanti. Nessun testo nell'immagine."
La richiesta utilizza l'ID google/gemini-2.5-flash-image tramite l'API uniforme di OpenRouter.
Nota etica importante:
Le immagini generate/editate con Gemini 2.5 Flash Image includono un watermark digitale invisibile (SynthID) che permette di identificarle come contenuti creati dall'IA. È buona pratica comunicarlo nella descrizione del post.
4) Gestione della risposta e salvataggio
OpenRouter restituisce l'immagine in Base64. Il programma la estrae e la salva:
def save_base64_image(base64_string, output_path):
image_data = base64.b64decode(base64_string)
with open(output_path, "wb") as f:
f.write(image_data)
# Estrazione dai dati di risposta
message = result['choices'][0]['message']
if 'images' in message and len(message['images']) > 0:
image_url = message['images'][0]['image_url']['url']
base64_data = image_url.split(',')[1]
filename = f"posts/post_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
save_base64_image(base64_data, filename)
Codice completo di ImageToPost
Limitazioni e considerazioni etiche
I modelli possono alterare inconsapevolmente dettagli importanti dell'immagine.
Potrebbero introdurre artefatti, modificare loghi o rimuovere elementi essenziali.
Serve sempre un controllo umano prima della pubblicazione.
Conclusione
ImageToPost è un esempio concreto di come l'integrazione tra Python, Gemini 2.5 Flash Image e OpenRouter possa trasformare un processo creativo lento in un workflow immediato e professionale.
