# Modification d’images

Modifiez une image par instruction ou par zone, remplacez son fond, changez son rapport largeur/hauteur ou ses couleurs, ou remplacez son texte.

Source : https://scifig.ai/fr/docs/api/image-edits

## Opérations

`POST /images/edits` avec un corps JSON. Portée requise : `figures:generate`. `image` est un `file_id` issu d’une importation ou d’un résultat antérieur ; `operation` choisit la modification et vaut `instruct` par défaut. Les mêmes outils figurent dans la barre des résultats du site.

| operation | Fonction | Champs | Crédits |
| --- | --- | --- | --- |
| instruct | Modifie toute l’image selon l’instruction ; avec un masque, redessine uniquement la zone masquée | `instruction` de 1 à 2 000 caractères, `mask` facultatif, `quality` | 50 / 75 / 100 selon la qualité ; avec un masque 100 |
| white_background | Remplace le fond par un blanc uni, sans transparence | `quality` | 50 / 75 / 100 |
| aspect_ratio | Recadre l’ensemble de la figure à un nouveau rapport largeur/hauteur en étendant le fond | `aspect_ratio` (`1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9`), `quality` | 50 / 75 / 100 |
| recolor | Applique une palette à l’illustration en conservant les couleurs des libellés | `palette` facultative de 1 à 8 couleurs `#RRGGBB` ; une palette est choisie si omise ; `quality` | 50 / 75 / 100 |
| replace_text | Modifie les libellés sur place en conservant leur police et leur position | `text_detection`, `replacements` | 100 |

Un masque est un PNG importé avec l’usage `mask`, de la même taille que l’image, blanc aux endroits où l’image peut changer. Une modification de zone utilise toujours le modèle `premium`, quelle que soit la valeur de `quality`. `replace_text` n’accepte pas `quality` : il utilise toujours le modèle de modification de texte au tarif `premium`.

## Remplacer du texte

- Appelez [`POST /images/text-detections`](/fr/docs/api/text-detections) sur la même image. Cet appel gratuit renvoie un `id` et les `texts` avec leur `index`.
- Envoyez `operation: "replace_text"`, `text_detection: <id>` et `replacements: [{"index": 0, "text": "Figure 1"}]`. Les textes non répertoriés restent inchangés.
- Un index absent de la détection renvoie `400 INVALID_REQUEST` avec `details.reason = TEXT_INDEX_OUT_OF_RANGE`, sans facturation.

## Crédits

Les crédits sont réservés à la création de la tâche, facturés une seule fois en cas de réussite et intégralement rendus en cas d’échec. La réponse est une tâche ; consultez [Tâches et attente limitée](/fr/docs/api/jobs) pour ses champs et ses statuts. Les erreurs sont répertoriées sous [Erreurs](/fr/docs/api/errors).

## cURL

```bash
curl -X POST https://scifig.ai/api/v1/images/edits \
  -H "Authorization: Bearer $SCIFIG_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Prefer: wait=25" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "<file_id>",
    "operation": "aspect_ratio",
    "aspect_ratio": "16:9"
  }'
```

## JavaScript

```javascript
const response = await fetch('https://scifig.ai/api/v1/images/edits', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SCIFIG_API_KEY}`,
    'Idempotency-Key': crypto.randomUUID(),
    Prefer: 'wait=25',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "image": "<file_id>",
    "operation": "aspect_ratio",
    "aspect_ratio": "16:9"
  }),
});
const result = await response.json();
console.log(response.status, result);
```

## Python

```python
import os
import uuid

import requests

headers = {
    "Authorization": f"Bearer {os.environ['SCIFIG_API_KEY']}",
    "Idempotency-Key": str(uuid.uuid4()),
    "Prefer": "wait=25",
}
response = requests.post(
    "https://scifig.ai/api/v1/images/edits",
    headers=headers,
    json={
        "image": "<file_id>",
        "operation": "aspect_ratio",
        "aspect_ratio": "16:9"
    },
    timeout=60,
)
print(response.status_code, response.json())
```
