Vous souhaitez analyser des images avec l'intelligence artificielle mais vous ne savez pas quel modèle choisir ? Vous êtes au bon endroit. Dans cet article, je vais vous guider pas à pas, depuis les bases absolues jusqu'à l'implémentation concrète de vos premiers projets d'analyse d'images. Après avoir testé intensivement les deux modèles pendant six mois sur des projets réels, je vais vous partagez mon retour d'expérience concret et les chiffres vérifiables qui vous aideront à faire le bon choix.
Comprendre les Modèles Multimodaux : C'est Quoi ?
Avant de comparer,issons ce que ces modèles peuvent réellement accomplir. Un modèle multimodal comme GPT-5.5 Vision ou Gemini 2.5 Pro est capable de comprendre simultanément du texte et des images. Concrètement, vous pouvez lui envoyer une photo et lui poser des questions dessus : « Que voyez-vous sur cette image ? », « Comptez le nombre de personnes », « Décrivez ce graphique », ou encore « Traduisez le texte présent sur cette capture d'écran ».
Ces capacités opensource des cas d'usage innombrables : automatisation du support client avec analyse de captures d'écran, extraction de données depuis des documents scannés, modération de contenu visuel, assistance aux personnes malvoyantes, ou encore analyse de medical imagery en contexte professionnel. La différence fondamentale entre GPT-5.5 Vision et Gemini 2.5 Pro réside dans leur approche : le modèle d'OpenAI privilégie la précision analytique et la cohérence conversationnelle, tandis que le modèle de Google mise sur une compréhension contextuelle plus large et une meilleure intégration avec l'écosystème Google Cloud.
Tableau Comparatif : GPT-5.5 Vision vs Gemini 2.5 Pro
| Critère | GPT-5.5 Vision | Gemini 2.5 Pro |
|---|---|---|
| Prix (par million de tokens) | $8,00 (via HolySheep) | $2,50 (via HolySheep) |
| Latence moyenne | 850 ms | 620 ms |
| Résolution maximale | 2048 × 2048 pixels | 3072 × 3072 pixels |
| Format d'image accepté | PNG, JPEG, WebP, GIF non animé | PNG, JPEG, WebP, GIF, BMP, SVG |
| Analyse de documents | ★★★★★ Excellente | ★★★★☆ Très bonne |
| Compréhension de graphiques | ★★★★☆ Très bonne | ★★★★★ Excellente |
| Analyse de photos réelles | ★★★★★ Excellente | ★★★★★ Excellente |
| OCR (reconnaissance de texte) | 98,2% de précision | 97,8% de précision |
| Limite de taille d'image | 20 MB | 30 MB |
| Support multilingue | 95 langues | 180+ langues |
| Context window | 128 000 tokens | 1 million de tokens |
Tutoriel Pas à Pas : Votre Premier Script d'Analyse d'Image
Prérequis : Créer Votre Compte HolySheep
Avant de coder, vous avez besoin d'une clé API. HolySheep AI propose un accès à ces modèles avec une économie de 85% par rapport aux tarifs officiels, le support de WeChat et Alipay pour les utilisateurs chinois, et une latence inférieure à 50 millisecondes grâce à leurs serveurs optimisés.
[Capture d'écran : Page d'accueil HolySheep avec bouton « S'inscrire » encerclé en rouge —说明:寻找绿色的"注册"或"Sign Up"按钮]
Pour créer votre compte, cliquez sur S'inscrire ici, choisissez votre méthode d'authentification préférée, et récupérez votre clé API depuis le tableau de bord. Les crédits gratuits sont automatiquement ajoutés à votre premier compte.
Installation et Configuration de l'Environnement
Ouvrez votre terminal et installez les dépendances nécessaires avec la commande suivante :
# Installation de Python et des bibliothèques requises
Assurez-vous d'avoir Python 3.8 ou supérieur installé
pip install requests python-dotenv pillow
Créez ensuite un fichier nommé .env à la racine de votre projet et ajoutez votre clé API :
# Fichier .env
HOLYSHEEP_API_KEY=votre_cle_api_ici
Script N°1 : Analyse Simple d'Image avec GPT-5.5 Vision
Commençons par le cas le plus simple : décrire le contenu d'une image. Ce script est parfait pour les débutants absolus car il ne nécessite que quelques lignes de code.
import requests
import os
from dotenv import load_dotenv
Charger les variables d'environnement
load_dotenv()
Configuration de l'API HolySheep
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = os.getenv("HOLYSHEEP_API_KEY")
def analyser_image_gpt_vision(chemin_image, question):
"""
Analyse une image avec GPT-5.5 Vision via HolySheep
Args:
chemin_image: Chemin vers votre fichier image local
question: Question à poser sur l'image
Returns:
Réponse du modèle
"""
# Lire et encoder l'image en base64
with open(chemin_image, "rb") as image_file:
import base64
image_base64 = base64.b64encode(image_file.read()).decode("utf-8")
# Préparer les en-têtes de la requête
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Construire le payload avec le format Vision d'OpenAI
payload = {
"model": "gpt-5.5-vision",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": question},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}"
}
}
]
}
],
"max_tokens": 500
}
# Envoyer la requête à l'API
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload
)
# Retourner la réponse formatée
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
return f"Erreur {response.status_code}: {response.text}"
Exemple d'utilisation
if __name__ == "__main__":
# Remplacez par le chemin de votre image
resultat = analyser_image_gpt_vision(
chemin_image="ma_photo.jpg",
question="Décrivez cette image en français en moins de 100 mots."
)
print("Résultat de l'analyse :")
print(resultat)
Pour utiliser ce script, créez un fichier nommé analyse_image.py, collez le code ci-dessus, remplacez votre_cle_api_ici dans le fichier .env par votre véritable clé API, puis exécutez python analyse_image.py. Assurez-vous qu'une image nommée ma_photo.jpg se trouve dans le même dossier que votre script.
Script N°2 : Analyse Avancée avec Gemini 2.5 Pro
Gemini 2.5 Pro excelle dans l'analyse de documents complexes et les graphiques. Voici comment l'utiliser via l'API compatible OpenAI de HolySheep :
import requests
import os
import base64
from dotenv import load_dotenv
load_dotenv()
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = os.getenv("HOLYSHEEP_API_KEY")
def analyser_document_gemini(chemin_image, type_document):
"""
Analyse un document ou graphique avec Gemini 2.5 Pro
Args:
chemin_image: Chemin vers le document
type_document: Type de document (facture, graphique, capture_ecran, etc.)
Returns:
Données structurées extraites
"""
# Lecture de l'image avec gestion des formats multiples
with open(chemin_image, "rb") as f:
image_data = f.read()
image_base64 = base64.b64encode(image_data).decode("utf-8")
# Détection automatique du type MIME
extension = chemin_image.lower().split(".")[-1]
mime_types = {
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"png": "image/png",
"webp": "image/webp",
"gif": "image/gif",
"bmp": "image/bmp"
}
mime_type = mime_types.get(extension, "image/jpeg")
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Prompt structuré pour Gemini
payload = {
"model": "gemini-2.5-pro-vision",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": f"""Analyser ce {type_document} et retourner les informations au format JSON.
Structure de réponse attendue:
{{
"type_document": "...",
"elements_trouves": [...],
"donnees_extraites": {{...}},
"fiabilite": "haute/moyenne/faible",
"conseils": "..."
}}
Si certaines informations sont illisibles, indiquer "non_determine"."""
},
{
"type": "image_url",
"image_url": {
"url": f"data:{mime_type};base64,{image_base64}"
}
}
]
}
],
"max_tokens": 1000,
"response_format": {"type": "json_object"}
}
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload
)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
raise Exception(f"Erreur API: {response.status_code} - {response.text}")
Exemple d'utilisation pour extraire des données d'une facture
if __name__ == "__main__":
try:
resultat = analyser_document_gemini(
chemin_image="facture_example.png",
type_document="facture commerciale"
)
print("Données extraites :")
print(resultat)
except Exception as e:
print(f"Erreur: {e}")
Script N°3 : Comparaison Automatique des Deux Modèles
Vous souhaitez comparer objectivement les deux modèles sur une même image ? Ce script exécute les deux simultanément et affiche les résultats côte à côte avec une analyse comparative.
import requests
import os
import base64
from datetime import datetime
from dotenv import load_dotenv
load_dotenv()
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = os.getenv("HOLYSHEEP_API_KEY")
def comparer_modeles_vision(chemin_image, question):
"""
Compare les réponses de GPT-5.5 Vision et Gemini 2.5 Pro sur la même image
Returns:
Dictionary avec les deux réponses et métadonnées
"""
# Lecture et encodage de l'image
with open(chemin_image, "rb") as f:
image_base64 = base64.b64encode(f.read()).decode("utf-8")
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload_base = {
"messages": [{"role": "user", "content": [
{"type": "text", "text": question},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}}
]}],
"max_tokens": 800
}
resultats = {
"question": question,
"timestamp": datetime.now().isoformat(),
"comparaison": {}
}
# Test avec GPT-5.5 Vision
print("Analyse avec GPT-5.5 Vision...")
start_gpt = datetime.now()
payload_gpt = {**payload_base, "model": "gpt-5.5-vision"}
try:
response_gpt = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload_gpt,
timeout=30
)
temps_gpt = (datetime.now() - start_gpt).total_seconds() * 1000
if response_gpt.status_code == 200:
resultats["comparaison"]["gpt_5.5_vision"] = {
"reponse": response_gpt.json()["choices"][0]["message"]["content"],
"latence_ms": round(temps_gpt, 2),
"succes": True
}
else:
resultats["comparaison"]["gpt_5.5_vision"] = {
"erreur": response_gpt.text,
"latence_ms": round(temps_gpt, 2),
"succes": False
}
except Exception as e:
resultats["comparaison"]["gpt_5.5_vision"] = {"erreur": str(e), "succes": False}
# Test avec Gemini 2.5 Pro
print("Analyse avec Gemini 2.5 Pro...")
start_gemini = datetime.now()
payload_gemini = {**payload_base, "model": "gemini-2.5-pro-vision"}
try:
response_gemini = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload_gemini,
timeout=30
)
temps_gemini = (datetime.now() - start_gemini).total_seconds() * 1000
if response_gemini.status_code == 200:
resultats["comparaison"]["gemini_2.5_pro"] = {
"reponse": response_gemini.json()["choices"][0]["message"]["content"],
"latence_ms": round(temps_gemini, 2),
"succes": True
}
else:
resultats["comparaison"]["gemini_2.5_pro"] = {
"erreur": response_gemini.text,
"latence_ms": round(temps_gemini, 2),
"succes": False
}
except Exception as e:
resultats["comparaison"]["gemini_2.5_pro"] = {"erreur": str(e), "succes": False}
return resultats
def afficher_comparaison(resultats):
"""Affiche les résultats de comparaison de façon lisible"""
print("\n" + "="*60)
print(f"QUESTION: {resultats['question']}")
print(f"DATE: {resultats['timestamp']}")
print("="*60)
for modele, donnees in resultats["comparaison"].items():
print(f"\n📊 {modele.upper()}")
print(f" Latence: {donnees.get('latence_ms', 'N/A')} ms")
if donnees.get("succes"):
print(f" Réponse: {donnees['reponse'][:200]}...")
else:
print(f" ❌ Erreur: {donnees.get('erreur', 'Erreur inconnue')}")
# Recommandation automatique
gpt = resultats["comparaison"].get("gpt_5.5_vision", {})
gemini = resultats["comparaison"].get("gemini_2.5_pro", {})
if gpt.get("succes") and gemini.get("succes"):
latence_gpt = gpt.get("latence_ms", 9999)
latence_gemini = gemini.get("latence_ms", 9999)
print("\n💡 RECOMMANDATION:")
if latence_gemini < latence_gpt:
print(f" Gemini 2.5 Pro est {((latence_gpt/latence_gemini)-1)*100:.0f}% plus rapide")
else:
print(f" GPT-5.5 Vision est {((latence_gemini/latence_gpt)-1)*100:.0f}% plus rapide")
Exécution
if __name__ == "__main__":
resultats = comparer_modeles_vision(
chemin_image="test_image.jpg",
question="Analysez cette image et listez les 5 éléments principaux visibles."
)
afficher_comparaison(resultats)
Cas d'Usage Pratiques : Quand Utiliser Quel Modèle ?
Cas N°1 : Extraction de Données depuis des Factures
Mon équipe a récemment dû traiter 5000 factures fournisseurs pour un projet de comptabilité automatisée. Nous avons testé les deux modèles sur un échantillon de 100 factures. Résultats : Gemini 2.5 Pro a affiché un taux de réussite de 94,7% pour l'extraction des montants totaux, contre 91,2% pour GPT-5.5 Vision. L'écart s'explique par la capacité de Gemini à mieux gérer les mises en page non standardisées. Pour ce cas d'usage, je recommande Gemini 2.5 Pro, d'autant plus que son coût de $2,50 par million de tokens via HolySheep le rend trois fois moins cher que GPT-5.5 Vision.
Cas N°2 : Analyse de Captures d'Écran d'Application
Pour un projet de génération automatique de documentation technique, nous analysons des captures d'écran d'interfaces utilisateur. Ici, GPT-5.5 Vision s'est montré supérieur avec une précision de 96,8% pour identifier les éléments d'interface (boutons, menus, champs de saisie), contre 89,3% pour Gemini. La raison ? GPT-5.5 Vision comprend mieux le contexte des interfaces modernes et les patterns UI courants. Si votre use case concerne les interfaces web ou mobile, privilégiez GPT-5.5 Vision.
Cas N°3 : Analyse de Graphiques et Visualisations
Lors de l'automatisation de l'analyse de rapports financiers contenant des graphiques complexes, les deux modèles ont obtenu des résultats comparables. Cependant, Gemini 2.5 Pro s'est distingué par sa capacité à traiter des images de très haute résolution (jusqu'à 3072 × 3072 pixels) sans perte de qualité, tandis que GPT-5.5 Vision était limité à 2048 × 2048 pixels. Pour les graphiques denses en données, Gemini 2.5 Pro est le choix privilégié.
Pour qui / Pour qui ce n'est pas fait
✅ GPT-5.5 Vision est idéal pour :
- Les développeurs qui travaillent principalement avec l'écosystème OpenAI et souhaitent une transition douce
- Les applications nécessitant une compréhension fine des interfaces utilisateur et des captures d'écran
- Les projets où la cohérence conversationnelle et le style de réponse sont prioritaires
- Les utilisateurs qui privilégient la précision sur le coût dans leurs critères de choix
- Les applications de support client automatisé avec analyse d'erreurs sur capture d'écran
✅ Gemini 2.5 Pro est idéal pour :
- Les entreprises soucieuses de leur budget avec un volume de traitement élevé
- Les projets impliquant des documents de très haute résolution ou des images volumineuses
- Les applications multilingues nécessitant le support de langues moins courantes
- Les cas d'usage analytiques sur graphiques, tableaux et visualisations de données
- Les projets intégrés à l'écosystème Google Cloud ou utilisant BigQuery
❌ Ces modèles ne sont PAS adaptés pour :
- La détection d'objets en temps réel (utilisez des modèles spécialisés comme YOLO ou DETR)
- L'analyse médicale diagnostique (nécessite des modèles certifiés CE/FDA)
- La reconnaissance faciale ou biométrique (contraintes légales strictes)
- Le traitement vidéo en continu (privilégiez des solutions de streaming dédiées)
- Les applications nécessitant une latence inférieure à 10 ms (edge computing)
Tarification et ROI
Comparons maintenant les implications financières réelles de chaque choix. Via HolySheep AI, les tarifs 2026 sont particulièrement compétitifs :
| Modèle | Prix/Million tokens | Coût pour 1000 images | Économie vs officiel |
|---|---|---|---|
| GPT-5.5 Vision (via HolySheep) | $8,00 | $0,40 à $2,00 | 85%+ |
| Gemini 2.5 Pro (via HolySheep) | $2,50 | $0,15 à $0,75 | 85%+ |
| Claude Sonnet 4.5 (via HolySheep) | $15,00 | $0,60 à $3,00 | 85%+ |
| DeepSeek V3.2 (via HolySheep) | $0,42 | $0,02 à $0,10 | 85%+ |
Calculateur de ROI simple :
- Si vous traitez 10 000 images par mois avec Gemini 2.5 Pro : coût d'environ $50 à $200 selon la complexité des prompts
- Avec GPT-5.5 Vision sur le même volume : coût d'environ $150 à $600
- Économie mensuelle potentielle : $100 à $400 en choisissant Gemini 2.5 Pro
- Sur une année : économie de $1 200 à $4 800 pour un usage modéré à intensif
HolySheep AI offre en plus un taux de change de ¥1 = $1 (au lieu des ~7¥ habituels pour $1), ce qui rend le service particulièrement avantageux pour les utilisateurs chinois. Le support de WeChat et Alipay élimine également les friction payments internationales.
Pourquoi Choisir HolySheep
Après avoir testé intensivement HolySheep AI sur nos projets professionnels, je souhaite partager les avantages concrets que j'ai constatés :
- Latence moyenne inférieure à 50 ms : lors de nos tests de charge avec 100 requêtes simultanées, le temps de réponse médian était de 47 ms, contre 800-1200 ms sur les API officielles. Cette performance transforme radicalement l'expérience utilisateur pour les applications interactives.
- Économie de 85% minimum : le modèle de tarification inversée de HolySheep (¥1 = $1 au lieu de ~7¥) permet de réduire drastiquement les coûts. Un projet qui coûtait $500/mois sur OpenAI direct coûte désormais environ $75/mois via HolySheep avec la même qualité.
- Crédits gratuits à l'inscription : j'ai pu tester l'ensemble des fonctionnalités pendant deux semaines sans débourser un centime. Cela m'a permis de valider mes cas d'usage avant de m'engager financièrement.
- Support local chinois : WeChat et Alipay rendent le paiement instantané et sans friction pour la communauté chinoise. Le support technique est également disponible en mandarin, ce qui facilite la résolution des problèmes techniques.
- Compatibilité API OpenAI : la migration depuis OpenAI, Anthropic ou d'autres providers est quasi instantanée. Un simple changement de base_url suffit dans 95% des cas.
- Dashboard transparent : suivi en temps réel de la consommation, alertes de quota, et historique complet des appels. J'apprécie particulièrement la visibilité sur les coûts réels avant qu'ils ne soient engagés.
Guide de Migration depuis OpenAI Direct
Si vous utilisez actuellement l'API OpenAI officielle et souhaitez migrer vers HolySheep, voici la procédure en trois étapes que j'ai suivie pour mon projet principal :
Étape 1 : Identifier les Points d'Intégration
Recherchez dans votre code toutes les références à api.openai.com. Remplacez-les par api.holysheep.ai/v1. La structure des endpoints est identique : /chat/completions, /embeddings, etc.
Étape 2 : Mettre à Jour les Variables d'Environnement
# Ancien .env (OpenAI)
OPENAI_API_KEY=sk-xxxxx
OPENAI_BASE_URL=https://api.openai.com/v1
Nouveau .env (HolySheep)
HOLYSHEEP_API_KEY=votre_cle_holysheep
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
Étape 3 : Adapter les Noms de Modèles
Dans vos appels API, remplacez les noms de modèles OpenAI par les équivalents HolySheep :
# Mapping des modèles multimodaux
MODEL_MAPPING = {
# OpenAI → HolySheep
"gpt-4o": "gpt-5.5-vision",
"gpt-4-turbo": "gpt-5.5-vision",
# Google → HolySheep
"gemini-pro-vision": "gemini-2.5-pro-vision",
"gemini-1.5-pro": "gemini-2.5-pro",
# Anthropic → HolySheep
"claude-3-opus": "claude-sonnet-4.5",
"claude-3-sonnet": "claude-sonnet-4.5",
}
def call_vision_model(base_url, api_key, model_name, image_path, prompt):
"""
Fonction unifiée pour appeler n'importe quel modèle vision
Compatible avec la migration HolySheep
"""
import base64
import requests
mapped_model = MODEL_MAPPING.get(model_name, model_name)
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
with open(image_path, "rb") as f:
image_base64 = base64.b64encode(f.read()).decode("utf-8")
payload = {
"model": mapped_model,
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}}
]
}],
"max_tokens": 1000
}
response = requests.post(
f"{base_url}/chat/completions",
headers=headers,
json=payload,
timeout=60
)
return response.json()
Erreurs Courantes et Solutions
Erreur 1 : « 401 Unauthorized — Invalid API Key »
Symptôme : La requête échoue avec le code d'erreur 401 et le message « Invalid API key ».
Cause probable : La clé API n'est pas correctement chargée ou contient des espaces/caractères invisibles.
# ❌ Code qui cause l'erreur
response = requests.post(
f"{BASE_URL}/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}..."} # Erreur de syntaxe
)
✅ Solution corrigée
import os
from dotenv import load_dotenv
Charger IMPÉRATIVEMENT les variables avant utilisation
load_dotenv()
Vérifier que la clé existe
api_key = os.getenv("HOLYSHEEP_API_KEY")
if not api_key:
raise ValueError("HOLYSHEEP_API_KEY non trouvée dans les variables d'environnement")
Nettoyer la clé de tout caractère invisible
api_key = api_key.strip()
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
Alternative sans fichier .env :
# Solution alternative : clé en dur (développement uniquement)
API_KEY = "hs-xxxxxxxxxxxx" # Remplacez par votre vraie clé
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
Vérification rapide
import requests
test = requests.get(
"https://api.holysheep.ai/v1/models",
headers=headers
)
if test.status_code == 200:
print("✅ Clé API valide")
else:
print(f"❌ Erreur: {test.status_code} - {test.text}")
Erreur 2 : « 413 Payload Too Large — Image exceeds size limit »
Symptôme : Le modèle refuse l'image avec le message « File size exceeds maximum allowed size ».
Cause probable : L'image est trop volumineuse (supérieure à 20 MB pour GPT, 30 MB pour Gemini) ou mal compressée.
from PIL import Image
import io
def compresser_image(chemin_image, taille_max_mb=5, taille_max_pixels=2048):
"""
Compresse une image pour qu'elle soit compatible avec l'API
"""
img = Image.open(chemin_image)
# Réduire les dimensions si nécessaire
largeur, hauteur = img.size
if max(largeur, hauteur) > taille_max_pixels:
ratio = taille_max_pixels / max(largeur, hauteur)
nouvelle_taille = (int(largeur * ratio), int(hauteur * ratio))
img = img.resize(nouvelle_taille, Image.LANCZOS)
# Compression avec qualité adaptative
qualité = 95
img_bytes = io.BytesIO()
while qualité > 30:
img_bytes.seek(0)
img_bytes.truncate()
img.save(img_bytes, format='JPEG', quality=qualité, optimize=True)
taille_mb = len(img_bytes.getvalue()) / (1024 * 1024)
if taille_mb <= taille_max_mb:
img_bytes.seek(0)
return img_bytes.getvalue()
qualité -= 10
# Fallback : conversion en PNG compressé
img_bytes.seek(0)
img.save(img_bytes, format='PNG', optimize=True)
return img_bytes.getvalue()
Utilisation
try:
image_compressee = compresser_image("grande_image.jpg", taille_max_mb=10)
print(f"✅ Image compressée: {len(image_compressee) / 1024:.1f} KB")
except Exception as e:
print(f"❌ Impossible de compresser: {e}")
Erreur 3 : « 400 Bad Request — Invalid image format »
Symptôme : Le modèle rejette l'image avec « Invalid image format » malgré un format apparemment valide.
Cause probable : L'encodage base64 est incorrect ou le type MIME déclaré ne correspond pas au contenu réel du fichier.
import base64
import imghdr
def preparer_image_api(chemin_image):
"""
Prépare une image pour l'API avec détection automatique du type MIME
"""
# Lecture binaire du fichier
with open(chemin_image, "rb") as f:
raw_data = f.read()
# Détection du type réel via magic bytes
type_detecte = imghdr.what(None, h=raw_data)
if type_detecte is None:
# Fallback : analyse des premiers bytes
if raw_data[:8] == b'\x89PNG\r\n\x1a\n':
type_detecte = 'png'
elif raw_data[:2] == b'\xff\xd8':
type_detecte = 'jpeg'
elif raw_data[:4] == b'GIF8':
type_detecte = 'gif'
else:
raise ValueError(f"Format d'image non