# Image Resize Endpoint - Verwendung

Der neue Image Resize Endpunkt wurde erfolgreich implementiert!

## Endpunkt

```
POST /api/images/resize
```

## Parameter

| Parameter | Typ | Required | Default | Beschreibung |
|-----------|-----|----------|---------|--------------|
| `file` | MultipartFile | Ja | - | Das zu skalierende Bild |
| `width` | Integer | Nein* | - | Gewünschte Breite in Pixeln |
| `height` | Integer | Nein* | - | Gewünschte Höhe in Pixeln |
| `maintainAspectRatio` | Boolean | Nein | true | Seitenverhältnis beibehalten |

*Mindestens einer der Parameter `width` oder `height` muss angegeben werden.

## Verhalten

### Seitenverhältnis beibehalten (`maintainAspectRatio=true`)

- **Nur Breite angegeben**: Die Höhe wird automatisch berechnet, um das Seitenverhältnis zu bewahren
- **Nur Höhe angegeben**: Die Breite wird automatisch berechnet, um das Seitenverhältnis zu bewahren
- **Beide Dimensionen angegeben**: Das Bild wird so skaliert, dass es in die angegebenen Dimensionen passt, ohne das Seitenverhältnis zu verzerren

### Seitenverhältnis nicht beibehalten (`maintainAspectRatio=false`)

Das Bild wird exakt auf die angegebenen Dimensionen skaliert, auch wenn dies zu Verzerrungen führt.

## Beispiele

### cURL Beispiele

#### Beispiel 1: Breite auf 300px skalieren (Höhe automatisch)

```bash
curl -X POST http://localhost:8080/api/images/resize \
  -F "file=@/pfad/zum/bild.png" \
  -F "width=300" \
  -F "maintainAspectRatio=true" \
  --output resized-image.png
```

#### Beispiel 2: Höhe auf 200px skalieren (Breite automatisch)

```bash
curl -X POST http://localhost:8080/api/images/resize \
  -F "file=@/pfad/zum/bild.png" \
  -F "height=200" \
  -F "maintainAspectRatio=true" \
  --output resized-image.png
```

#### Beispiel 3: In 400x300 Bounding Box skalieren (Seitenverhältnis beibehalten)

```bash
curl -X POST http://localhost:8080/api/images/resize \
  -F "file=@/pfad/zum/bild.png" \
  -F "width=400" \
  -F "height=300" \
  -F "maintainAspectRatio=true" \
  --output resized-image.png
```

#### Beispiel 4: Exakt auf 500x200 skalieren (ohne Seitenverhältnis)

```bash
curl -X POST http://localhost:8080/api/images/resize \
  -F "file=@/pfad/zum/bild.png" \
  -F "width=500" \
  -F "height=200" \
  -F "maintainAspectRatio=false" \
  --output resized-image.png
```

### JavaScript/Node.js Beispiel

```javascript
const FormData = require('form-data');
const fs = require('fs');
const axios = require('axios');

async function resizeImage() {
    const formData = new FormData();
    formData.append('file', fs.createReadStream('bild.png'));
    formData.append('width', '300');
    formData.append('maintainAspectRatio', 'true');

    const response = await axios.post(
        'http://localhost:8080/api/images/resize',
        formData,
        {
            headers: formData.getHeaders(),
            responseType: 'arraybuffer'
        }
    );

    fs.writeFileSync('resized-image.png', response.data);
    console.log('Bild erfolgreich skaliert!');
}

resizeImage();
```

### Java/Spring RestTemplate Beispiel

```java
RestTemplate restTemplate = new RestTemplate();

MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", new FileSystemResource("bild.png"));
body.add("width", 300);
body.add("maintainAspectRatio", true);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);

byte[] response = restTemplate.postForObject(
    "http://localhost:8080/api/images/resize",
    requestEntity,
    byte[].class
);

Files.write(Paths.get("resized-image.png"), response);
```

## Response

Der Endpunkt gibt das skalierte Bild als Byte-Array zurück mit den folgenden Headers:

- `Content-Type`: Der Original-Content-Type des Bildes (z.B. `image/png`, `image/jpeg`)
- `Content-Length`: Die Größe des skalierten Bildes in Bytes

## Unterstützte Bildformate

- PNG
- JPEG/JPG
- GIF
- BMP

## Fehlerbehandlung

### 400 Bad Request

- Keine Dimensionen angegeben
- Ungültige Dimensionen (≤ 0)

### 500 Internal Server Error

- Ungültiges Bildformat
- Fehler beim Lesen oder Verarbeiten des Bildes

## Implementierungsdetails

Die Implementierung verwendet:
- **ImageService.resizeImage()**: Die zentrale Methode zur Bildverarbeitung (src/main/java/io/releasebook/backend/service/ImageService.java:361)
- **ImageResource.resizeImage()**: Der REST-Endpunkt (src/main/java/io/releasebook/backend/web/rest/ImageResource.java:53)
- **Java AWT Graphics2D**: Für hochwertige Bildskalierung mit Antialiasing und Bilinear-Interpolation

## Qualität

Die Bildqualität wird durch folgende Rendering-Hints optimiert:
- `KEY_INTERPOLATION`: `VALUE_INTERPOLATION_BILINEAR`
- `KEY_RENDERING`: `VALUE_RENDER_QUALITY`
- `KEY_ANTIALIASING`: `VALUE_ANTIALIAS_ON`

Dies stellt sicher, dass skalierte Bilder eine hohe visuelle Qualität aufweisen.
