mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(docs-i18n): translate all documentation into 20 languages
All 181 docs markdown files translated into 20 languages (apps/docs/<locale>/**). Companion to the i18n code PR; admin-merged because the file count exceeds GitHub's per-PR CI trigger limit. Validated by pnpm i18n:check (all surfaces, 0 stale/missing) and a clean all-locale docs build.
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
---
|
||||
description: "Dostosuj jasność, kontrast, nasycenie, temperaturę, odcień, kanały i zastosuj efekty kolorystyczne."
|
||||
i18n_source_hash: 41b35fe5c2ba
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 0b53e6a1f986
|
||||
---
|
||||
|
||||
# Dostosuj kolory {#adjust-colors}
|
||||
|
||||
Kompleksowe narzędzie do dostosowywania kolorów, łączące jasność, kontrast, ekspozycję, nasycenie, temperaturę, tinting, obrót odcienia, poziomy poszczególnych kanałów oraz efekty jednym kliknięciem (skala szarości, sepia, inwersja) w jednym punkcie końcowym.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/adjust-colors`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| brightness | number | Nie | `0` | Regulacja jasności (-100 do 100) |
|
||||
| contrast | number | Nie | `0` | Regulacja kontrastu (-100 do 100) |
|
||||
| exposure | number | Nie | `0` | Ekspozycja / gamma tonów średnich (-100 do 100) |
|
||||
| saturation | number | Nie | `0` | Nasycenie koloru (-100 do 100) |
|
||||
| temperature | number | Nie | `0` | Balans bieli: chłodny/niebieski do ciepłego/pomarańczowego (-100 do 100) |
|
||||
| tint | number | Nie | `0` | Przesunięcie odcienia: zielony do magenty (-100 do 100) |
|
||||
| hue | number | Nie | `0` | Obrót odcienia w stopniach (-180 do 180) |
|
||||
| sharpness | number | Nie | `0` | Siła wyostrzania (0 do 100) |
|
||||
| red | number | Nie | `100` | Poziom kanału czerwonego (0 do 200, 100 = bez zmian) |
|
||||
| green | number | Nie | `100` | Poziom kanału zielonego (0 do 200, 100 = bez zmian) |
|
||||
| blue | number | Nie | `100` | Poziom kanału niebieskiego (0 do 200, 100 = bez zmian) |
|
||||
| effect | string | Nie | `"none"` | Efekt kolorystyczny: `none`, `grayscale`, `sepia`, `invert` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/adjust-colors \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"brightness": 20, "contrast": 10, "saturation": -30, "effect": "none"}'
|
||||
```
|
||||
|
||||
Zastosuj ciepły, vintage'owy wygląd:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/adjust-colors \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"temperature": 40, "saturation": -15, "contrast": 10, "effect": "sepia"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2380000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wszystkie parametry mają domyślnie wartości neutralne, więc możesz regulować tylko to, czego potrzebujesz.
|
||||
- Regulacje są stosowane w tej kolejności: jasność, kontrast, ekspozycja, nasycenie/odcień, temperatura/tint, wyostrzanie, kanały, efekty.
|
||||
- Temperatura używa macierzy rekombinacji kolorów 3x3 na osiach niebiesko-pomarańczowej i zielono-magentowej.
|
||||
- Ekspozycja mapuje się na funkcję gamma Sharpa (wartości dodatnie rozjaśniają tony średnie, ujemne je przyciemniają).
|
||||
- Ten punkt końcowy odpowiada również pod starszymi ścieżkami `/api/v1/tools/image/brightness-contrast`, `/api/v1/tools/image/saturation`, `/api/v1/tools/image/color-channels` oraz `/api/v1/tools/image/color-effects`. Wszystkie używają tego samego schematu.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetworzeniem.
|
||||
@@ -0,0 +1,84 @@
|
||||
---
|
||||
description: "Rozszerz płótno obrazu za pomocą AI outpaintingu, powiększając je w dowolnym kierunku i wypełniając nowe obszary tak, aby pasowały do oryginału."
|
||||
i18n_source_hash: 1b00db4ed40d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 2fecd7b7e469
|
||||
---
|
||||
|
||||
# Rozszerzanie płótna AI {#ai-canvas-expand}
|
||||
|
||||
Rozszerz płótno obrazu za pomocą wypełniania wspomaganego przez AI (outpainting). Powiększa obraz w dowolnym kierunku i wypełnia nowe obszary treścią wygenerowaną przez AI, która pasuje do istniejącego obrazu.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/ai-canvas-expand`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modelu:** `object-eraser-colorize` (1-2 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| extendTop | integer | Nie | `0` | Piksele do rozszerzenia u góry |
|
||||
| extendRight | integer | Nie | `0` | Piksele do rozszerzenia po prawej |
|
||||
| extendBottom | integer | Nie | `0` | Piksele do rozszerzenia u dołu |
|
||||
| extendLeft | integer | Nie | `0` | Piksele do rozszerzenia po lewej |
|
||||
| tier | string | Nie | `"balanced"` | Poziom jakości: `fast`, `balanced`, `high` |
|
||||
| format | string | Nie | `"auto"` | Format wyjściowy: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| quality | integer | Nie | `95` | Jakość wyjściowa (1-100) |
|
||||
|
||||
Co najmniej jeden kierunek rozszerzenia musi być większy niż 0.
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/ai-canvas-expand \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"extendTop":200,"extendBottom":200,"extendLeft":100,"extendRight":100,"tier":"balanced"}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Expanding canvas...","percent":50}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo_extended.png",
|
||||
"previewUrl": "/api/v1/download/{jobId}/preview.webp",
|
||||
"originalSize": 300000,
|
||||
"processedSize": 520000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowanego pakietu modelu `object-eraser-colorize` (1-2 GB).
|
||||
- Używa outpaintingu opartego na LaMa do generowania treści dla rozszerzonych obszarów.
|
||||
- Parametr `tier` wymienia szybkość na jakość: `fast` daje wyniki szybko, z możliwymi artefaktami, `high` trwa dłużej, ale daje gładsze, bardziej spójne wypełnienia.
|
||||
- Wartości rozszerzenia są w pikselach. Ostateczne wymiary obrazu wyniosą: szerokość oryginału + extendLeft + extendRight na wysokość oryginału + extendTop + extendBottom.
|
||||
- Dla formatów wyjściowych niemożliwych do podglądu w przeglądarce (HEIC, JXL, TIFF) obok głównego wyniku generowany jest podgląd WebP.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
description: "Zamień tło obrazu na jednolity kolor lub gradient za pomocą AI."
|
||||
i18n_source_hash: 930fe8890e55
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: bb4f654dfdc7
|
||||
---
|
||||
|
||||
# Zamiana tła {#background-replace}
|
||||
|
||||
Zamień tło obrazu na jednolity kolor lub gradient. Model AI wykrywa obiekt, usuwa oryginalne tło i komponuje obiekt na wybranym przez Ciebie tle.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/background-replace`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| backgroundType | string | Nie | `"color"` | Tryb tła: `color` lub `gradient` |
|
||||
| color | string | Nie | `"#ffffff"` | Kolor tła w formacie hex (gdy backgroundType to `color`) |
|
||||
| gradientColor1 | string | Nie | - | Pierwszy kolor gradientu w formacie hex |
|
||||
| gradientColor2 | string | Nie | - | Drugi kolor gradientu w formacie hex |
|
||||
| gradientAngle | integer | Nie | `180` | Kąt gradientu w stopniach (0-360) |
|
||||
| feather | integer | Nie | `0` | Promień wygładzania krawędzi (0-20) |
|
||||
| format | string | Nie | `"png"` | Format wyjściowy: `png` lub `webp` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/background-replace \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"backgroundType": "color", "color": "#2563eb", "feather": 2}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
Śledź postęp przez SSE pod `GET /api/v1/jobs/{jobId}/progress`. Po zakończeniu zadania strumień SSE emituje zdarzenie `completed` z adresem URL pobierania.
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie wspomagane przez AI, które zwraca `202 Accepted` i przetwarza asynchronicznie. Połącz się z punktem końcowym SSE, aby otrzymywać aktualizacje postępu i wynik końcowy.
|
||||
- Wymaga zainstalowanego pakietu funkcji **background-removal**. Zwraca `501`, jeśli pakiet nie jest dostępny.
|
||||
- Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetworzeniem.
|
||||
- Wynik domyślnie jest w formacie PNG, aby zachować przezroczystość wokół obiektu.
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
description: "Generuj kody kreskowe w formatach Code 128, EAN-13, UPC-A, Code 39, ITF-14 i Data Matrix."
|
||||
i18n_source_hash: e84b1df40c7e
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 8cf4c56ce48d
|
||||
---
|
||||
|
||||
# Generator kodów kreskowych {#barcode-generator}
|
||||
|
||||
Generuj obrazy kodów kreskowych z wprowadzonego tekstu. Obsługuje formaty Code 128, EAN-13, UPC-A, Code 39, ITF-14 i Data Matrix.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/barcode-generate`
|
||||
|
||||
Przyjmuje treść `application/json` (nie multipart). Kod kreskowy jest generowany z podanego tekstu, a nie z przesłanego pliku.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Tak | - | Tekst do zakodowania w kodzie kreskowym (1-256 znaków) |
|
||||
| type | string | Nie | `"code128"` | Format kodu kreskowego: `code128`, `ean13`, `upca`, `code39`, `itf14`, `datamatrix` |
|
||||
| scale | integer | Nie | `3` | Współczynnik skali obrazu (1-8) |
|
||||
| includeText | boolean | Nie | `true` | Czy renderować tekst pod kodem kreskowym |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/barcode-generate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text": "5901234123457", "type": "ean13", "scale": 4}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/barcode.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 4520
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- W przeciwieństwie do większości narzędzi ten punkt końcowy przyjmuje treść JSON, a nie dane formularza multipart, ponieważ kody kreskowe są generowane z tekstu, a nie z przesłanego pliku.
|
||||
- EAN-13 wymaga dokładnie 12 lub 13 cyfr. UPC-A wymaga dokładnie 11 lub 12 cyfr. Jeśli cyfra kontrolna zostanie pominięta, jest obliczana automatycznie.
|
||||
- Code 128 jest najbardziej elastycznym formatem i obsługuje pełny zestaw znaków ASCII.
|
||||
- Data Matrix tworzy dwuwymiarowy kod kreskowy odpowiedni do kodowania dłuższych ciągów w zwartym kwadracie.
|
||||
@@ -0,0 +1,97 @@
|
||||
---
|
||||
description: "Skanuj obrazy w poszukiwaniu kodów QR, kodów kreskowych i kodów 2D z opatrzonym adnotacjami wynikiem."
|
||||
i18n_source_hash: 97c9d395c257
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: c1e42f2999ca
|
||||
---
|
||||
|
||||
# Czytnik kodów kreskowych {#barcode-reader}
|
||||
|
||||
Skanuj przesłane obrazy w poszukiwaniu wszystkich typów kodów kreskowych i kodów QR. Zwraca odkodowany tekst, typ kodu kreskowego i dane o położeniu dla każdego wykrytego kodu. Generuje również obraz z adnotacjami z kolorowymi ramkami wokół wykrytych kodów.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/barcode-read`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz opcjonalnym polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| tryHarder | boolean | Nie | `true` | Włącz agresywny tryb skanowania dla trudniejszych do odczytania kodów kreskowych (wolniejszy, ale dokładniejszy) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/barcode-read \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@receipt.jpg" \
|
||||
-F 'settings={"tryHarder": true}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"filename": "receipt.jpg",
|
||||
"barcodes": [
|
||||
{
|
||||
"type": "QRCode",
|
||||
"text": "https://example.com/product/123",
|
||||
"position": {
|
||||
"topLeft": { "x": 100, "y": 50 },
|
||||
"topRight": { "x": 250, "y": 50 },
|
||||
"bottomLeft": { "x": 100, "y": 200 },
|
||||
"bottomRight": { "x": 250, "y": 200 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "EAN-13",
|
||||
"text": "5901234123457",
|
||||
"position": {
|
||||
"topLeft": { "x": 50, "y": 400 },
|
||||
"topRight": { "x": 300, "y": 400 },
|
||||
"bottomLeft": { "x": 50, "y": 450 },
|
||||
"bottomRight": { "x": 300, "y": 450 }
|
||||
}
|
||||
}
|
||||
],
|
||||
"annotatedUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/annotated-receipt.png",
|
||||
"previewUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/annotated-receipt.png"
|
||||
}
|
||||
```
|
||||
|
||||
## Pola odpowiedzi {#response-fields}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Oryginalna nazwa pliku |
|
||||
| barcodes | array | Tablica wykrytych obiektów kodów kreskowych |
|
||||
| annotatedUrl | string lub null | Adres URL do pobrania obrazu z adnotacjami (null, jeśli nie znaleziono kodów kreskowych) |
|
||||
| previewUrl | string lub null | Taki sam jak annotatedUrl (dla zgodności z podglądem frontendu) |
|
||||
|
||||
### Obiekt kodu kreskowego {#barcode-object}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| type | string | Format kodu kreskowego (QRCode, EAN-13, Code128, DataMatrix, PDF417 itd.) |
|
||||
| text | string | Odkodowana treść kodu kreskowego |
|
||||
| position | object | Ramka ograniczająca ze współrzędnymi topLeft, topRight, bottomLeft, bottomRight |
|
||||
|
||||
## Obsługiwane typy kodów kreskowych {#supported-barcode-types}
|
||||
|
||||
Kody kreskowe 1D: Code128, Code39, Code93, Codabar, EAN-8, EAN-13, ITF, UPC-A, UPC-E
|
||||
|
||||
Kody 2D: QRCode, DataMatrix, PDF417, Aztec, MaxiCode
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Używa biblioteki zxing-wasm do wykrywania kodów kreskowych.
|
||||
- Obraz z adnotacjami nakłada kolorowe ramki wielokątne i numerowane etykiety na każdy wykryty kod kreskowy.
|
||||
- W jednym obrazie można wykryć do 255 kodów kreskowych.
|
||||
- Jeśli nie znaleziono żadnych kodów kreskowych, `barcodes` jest pustą tablicą, a `annotatedUrl` ma wartość null.
|
||||
- Tryb `tryHarder` przeprowadza dokładniejsze skanowanie kosztem czasu przetwarzania. Wyłącz go, aby szybciej przetwarzać czyste, dobrze wyrównane kody kreskowe.
|
||||
- Wynik z adnotacjami jest zawsze w formacie PNG.
|
||||
- Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed skanowaniem.
|
||||
- Orientacja EXIF jest automatycznie stosowana przed przetworzeniem.
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description: "Zamień zwykłe zrzuty ekranu w dopracowane obrazy z gradientowymi tłami, ramkami urządzeń, cieniami i rozmiarami dla mediów społecznościowych."
|
||||
i18n_source_hash: 8fd8a930a45e
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: a0c74ae04b53
|
||||
---
|
||||
|
||||
# Upiększ zrzut ekranu {#beautify-screenshot}
|
||||
|
||||
Dodaj gradientowe tła, ramki urządzeń, cienie, znaki wodne i rozmiary dla mediów społecznościowych do zrzutów ekranu. Idealne do tworzenia dopracowanych obrazów na potrzeby marketingu produktu, mediów społecznościowych i dokumentacji.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/beautify`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| backgroundType | string | Nie | `"linear-gradient"` | Typ tła: `solid`, `linear-gradient`, `radial-gradient`, `image`, `transparent` |
|
||||
| backgroundColor | string | Nie | `"#667eea"` | Jednolity kolor tła (używany, gdy `backgroundType` to `solid`) |
|
||||
| gradientStops | array | Nie | `[{"color":"#667eea","position":0},{"color":"#764ba2","position":100}]` | Punkty koloru gradientu (min. 2). Każdy punkt ma `color` (hex) i `position` (0-100). |
|
||||
| gradientAngle | number | Nie | 135 | Kąt gradientu w stopniach (0 do 360) |
|
||||
| padding | number | Nie | 64 | Odstęp wokół obrazu w pikselach (0 do 256) |
|
||||
| borderRadius | number | Nie | 12 | Zaokrąglenie narożników zrzutu ekranu (0 do 64) |
|
||||
| shadowPreset | string | Nie | `"subtle"` | Predefiniowany cień: `none`, `subtle`, `medium`, `dramatic`, `custom` |
|
||||
| shadowBlur | number | Nie | 20 | Niestandardowy promień rozmycia cienia (0 do 100, używany, gdy `shadowPreset` to `custom`) |
|
||||
| shadowOffsetX | number | Nie | 0 | Niestandardowe przesunięcie poziome cienia (-50 do 50) |
|
||||
| shadowOffsetY | number | Nie | 10 | Niestandardowe przesunięcie pionowe cienia (-50 do 50) |
|
||||
| shadowColor | string | Nie | `"#000000"` | Niestandardowy kolor cienia w formacie hex |
|
||||
| shadowOpacity | number | Nie | 30 | Niestandardowa nieprzezroczystość cienia (0 do 100) |
|
||||
| frame | string | Nie | `"none"` | Ramka urządzenia lub okna: `none`, `macos-light`, `macos-dark`, `windows-light`, `windows-dark`, `browser-light`, `browser-dark`, `iphone`, `iphone-dark`, `macbook`, `macbook-dark`, `ipad`, `ipad-dark` |
|
||||
| frameTitle | string | Nie | - | Tekst tytułu wyświetlany na paskach tytułowych ramek okien |
|
||||
| socialPreset | string | Nie | `"none"` | Zmień rozmiar do wymiarów mediów społecznościowych: `none`, `twitter`, `linkedin`, `instagram-square`, `instagram-story`, `facebook`, `producthunt` |
|
||||
| watermarkText | string | Nie | - | Opcjonalny tekst znaku wodnego nakładany na obraz |
|
||||
| watermarkPosition | string | Nie | `"bottom-right"` | Pozycja znaku wodnego: `top-left`, `top-right`, `bottom-left`, `bottom-right`, `center` |
|
||||
| watermarkOpacity | number | Nie | 50 | Nieprzezroczystość znaku wodnego (0 do 100) |
|
||||
| outputFormat | string | Nie | `"png"` | Format wyjściowy: `png`, `jpeg`, `webp` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/beautify \
|
||||
-F "file=@screenshot.png" \
|
||||
-F 'settings={"backgroundType":"linear-gradient","gradientStops":[{"color":"#667eea","position":0},{"color":"#764ba2","position":100}],"gradientAngle":135,"padding":64,"borderRadius":12,"shadowPreset":"medium","frame":"macos-dark","socialPreset":"twitter"}'
|
||||
```
|
||||
|
||||
### Z obrazem tła {#with-background-image}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/beautify \
|
||||
-F "file=@screenshot.png" \
|
||||
-F "backgroundImage=@bg-texture.jpg" \
|
||||
-F 'settings={"backgroundType":"image","padding":80,"borderRadius":16,"shadowPreset":"dramatic"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/screenshot.png",
|
||||
"originalSize": 234567,
|
||||
"processedSize": 567890
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Przyjmuje dwa pola plików: `file` (wymagane, główny zrzut ekranu) oraz `backgroundImage` (opcjonalne, używane, gdy `backgroundType` to `image`).
|
||||
- Obsługuje formaty wejściowe HEIC, RAW, PSD i SVG (automatycznie dekodowane).
|
||||
- Predefiniowane ustawienia cienia mapują się na konkretne wartości:
|
||||
- `subtle`: rozmycie 20, offsetY 4, nieprzezroczystość 20%
|
||||
- `medium`: rozmycie 40, offsetY 10, nieprzezroczystość 35%
|
||||
- `dramatic`: rozmycie 80, offsetY 20, nieprzezroczystość 50%
|
||||
- Predefiniowane ustawienia mediów społecznościowych zmieniają rozmiar końcowego wyniku, aby dopasować go do docelowych wymiarów, przy użyciu trybu `contain`:
|
||||
- `twitter`: 1600x900
|
||||
- `linkedin`: 1200x627
|
||||
- `instagram-square`: 1080x1080
|
||||
- `instagram-story`: 1080x1920
|
||||
- `facebook`: 1200x630
|
||||
- `producthunt`: 1270x760
|
||||
- Ramki urządzeń (`iphone`, `macbook`, `ipad`) dodają sprzętową obwódkę wokół obrazu i pomijają ustawienie `borderRadius`.
|
||||
- Gdy wymagana jest przezroczystość (cień, zaokrąglenie narożników, ramki urządzeń lub przezroczyste tło), wynik jest wymuszany na PNG, nawet jeśli wybrano `jpeg`.
|
||||
- Obrazy tła nie są obsługiwane w trybie potoku/wsadowym.
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
description: "Rozmyj tło, zachowując ostrość obiektu za pomocą AI."
|
||||
i18n_source_hash: 9073f10e6e9d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 565e394980a9
|
||||
---
|
||||
|
||||
# Rozmyj tło {#blur-background}
|
||||
|
||||
Rozmyj tło obrazu, zachowując ostrość obiektu. Model AI izoluje obiekt, stosuje rozmycie do oryginalnego tła i komponuje ostry obiekt na wierzchu.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/blur-background`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| intensity | integer | Nie | `50` | Intensywność rozmycia (1-100) |
|
||||
| feather | integer | Nie | `0` | Promień wygładzania krawędzi (0-20) |
|
||||
| format | string | Nie | `"png"` | Format wyjściowy: `png` lub `webp` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/blur-background \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"intensity": 75, "feather": 3}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
Śledź postęp przez SSE pod `GET /api/v1/jobs/{jobId}/progress`. Po zakończeniu zadania strumień SSE emituje zdarzenie `completed` z adresem URL pobierania.
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie wspomagane przez AI, które zwraca `202 Accepted` i przetwarza asynchronicznie. Połącz się z punktem końcowym SSE, aby otrzymywać aktualizacje postępu i wynik końcowy.
|
||||
- Wymaga zainstalowanego pakietu funkcji **background-removal**. Zwraca `501`, jeśli pakiet nie jest dostępny.
|
||||
- Wyższe wartości intensywności dają silniejszy efekt rozmycia. Wartości powyżej 80 tworzą wyraźne oddzielenie w stylu bokeh.
|
||||
- Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetworzeniem.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Automatycznie wykrywaj i rozmywaj twarze na obrazach dzięki wykrywaniu twarzy AI, na potrzeby prywatności i anonimizacji zgodnej z RODO."
|
||||
i18n_source_hash: fb861c12aea5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: c2fb28beda96
|
||||
---
|
||||
|
||||
# Rozmycie twarzy / PII {#face-pii-blur}
|
||||
|
||||
Automatycznie wykrywaj i rozmywaj twarze na obrazach za pomocą wykrywania twarzy wspomaganego przez AI (MediaPipe).
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/blur-faces`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modelu:** `face-detection` (200-300 MB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| blurRadius | number | Nie | `30` | Promień rozmycia stosowany do wykrytych twarzy (1-100) |
|
||||
| sensitivity | number | Nie | `0.5` | Czułość wykrywania twarzy (0-1). Niższe wartości wykrywają mniej twarzy z wyższą pewnością |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/blur-faces \
|
||||
-F "file=@group-photo.jpg" \
|
||||
-F 'settings={"blurRadius":40,"sensitivity":0.3}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Detecting faces...","percent":40}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/group-photo_blurred.jpg",
|
||||
"originalSize": 450000,
|
||||
"processedSize": 420000,
|
||||
"facesDetected": 3,
|
||||
"faces": [
|
||||
{"x": 100, "y": 50, "w": 80, "h": 80},
|
||||
{"x": 300, "y": 60, "w": 75, "h": 75},
|
||||
{"x": 500, "y": 55, "w": 85, "h": 85}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Nie wykryto twarzy {#no-faces-detected}
|
||||
|
||||
Jeśli nie znaleziono żadnych twarzy, wynik zawiera ostrzeżenie:
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"facesDetected": 0,
|
||||
"warning": "No faces detected in this image. Try increasing detection sensitivity."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowanego pakietu modelu `face-detection` (200-300 MB).
|
||||
- Format wyjściowy automatycznie odpowiada formatowi wejściowemu.
|
||||
- Tablica `faces` zawiera współrzędne ramki ograniczającej (x, y, szerokość, wysokość) dla każdej wykrytej twarzy.
|
||||
- Zwiększ `sensitivity` (bliżej 1.0), aby wykryć więcej twarzy, w tym częściowo zasłonięte.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
description: "Dodaj obramowania, odstępy, zaokrąglone narożniki i cienie do obrazów w przewidywalnej, kontrolowanej kolejności."
|
||||
i18n_source_hash: 8845150736a9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 019f3c59df2f
|
||||
---
|
||||
|
||||
# Obramowanie i ramka {#border-frame}
|
||||
|
||||
Dodaj obramowania, odstępy, zaokrąglone narożniki i cienie do obrazów. Narzędzie stosuje efekty w kolejności: odstęp, obramowanie, zaokrąglenie narożników, a następnie cień.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/border`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| borderWidth | number | Nie | 10 | Grubość obramowania w pikselach (0 do 2000) |
|
||||
| borderColor | string | Nie | `"#000000"` | Kolor obramowania w formacie hex (np. `#FF0000`) |
|
||||
| padding | number | Nie | 0 | Wewnętrzny odstęp między obrazem a obramowaniem w pikselach (0 do 200) |
|
||||
| paddingColor | string | Nie | `"#FFFFFF"` | Kolor wypełnienia odstępu w formacie hex |
|
||||
| cornerRadius | number | Nie | 0 | Promień zaokrąglenia narożników w pikselach (0 do 2000) |
|
||||
| shadow | boolean | Nie | `false` | Czy dodać cień |
|
||||
| shadowBlur | number | Nie | 15 | Promień rozmycia cienia (1 do 200) |
|
||||
| shadowOffsetX | number | Nie | 0 | Poziome przesunięcie cienia (-50 do 50) |
|
||||
| shadowOffsetY | number | Nie | 5 | Pionowe przesunięcie cienia (-50 do 50) |
|
||||
| shadowColor | string | Nie | `"#000000"` | Kolor cienia w formacie hex |
|
||||
| shadowOpacity | number | Nie | 40 | Nieprzezroczystość cienia w procentach (0 do 100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/border \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"borderWidth":20,"borderColor":"#333333","cornerRadius":16,"shadow":true,"shadowBlur":25,"shadowOpacity":50}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.png",
|
||||
"originalSize": 456789,
|
||||
"processedSize": 523456
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Używa standardowej fabryki `createToolRoute`. Przyjmuje pojedynczy plik obrazu przez przesyłanie multipart.
|
||||
- Obsługuje formaty wejściowe HEIC, RAW, PSD i SVG (automatycznie dekodowane).
|
||||
- Kolejność przetwarzania: najpierw dodawany jest odstęp, następnie obramowanie owija obraz, potem stosowane jest zaokrąglenie narożników, a na końcu komponowany jest cień.
|
||||
- Gdy włączone jest `cornerRadius` lub `shadow`, wynik jest wymuszany na PNG (niezależnie od formatu wejściowego), aby zachować przezroczystość. Formaty obsługujące kanał alfa (PNG, WebP, AVIF) zachowują swój oryginalny format.
|
||||
- Cień uwzględnia kształt: podąża za zaokrąglonymi narożnikami, zamiast tworzyć prostokątny cień.
|
||||
- Ustawienie `borderWidth` na 0 i użycie tylko `cornerRadius` + `shadow` tworzy efekt zaokrąglonego cienia bez ramki.
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
description: "Zmień nazwy wielu plików za pomocą szablonu wzorca i pobierz jako ZIP."
|
||||
i18n_source_hash: 2776dcc2f71c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 05d89869a52f
|
||||
---
|
||||
|
||||
# Masowa zmiana nazw {#bulk-rename}
|
||||
|
||||
Zmień nazwy wielu plików za pomocą szablonu wzorca z symbolami zastępczymi dla indeksu, uzupełnionego indeksu i oryginalnej nazwy pliku. Zwraca archiwum ZIP zawierające wszystkie pliki ze zmienionymi nazwami.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/bulk-rename`
|
||||
|
||||
Przyjmuje dane formularza multipart z wieloma plikami oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| pattern | string | Nie | `"image-{{index}}"` | Wzorzec nazewnictwa z symbolami zastępczymi (maks. 1000 znaków) |
|
||||
| startIndex | number | Nie | `1` | Początkowy numer indeksu |
|
||||
|
||||
### Symbole zastępcze wzorca {#pattern-placeholders}
|
||||
|
||||
| Symbol zastępczy | Opis | Przykład |
|
||||
|-------------|-------------|---------|
|
||||
| `{{index}}` | Kolejny numer zaczynający się od `startIndex` | `1`, `2`, `3` |
|
||||
| `{{padded}}` | Kolejny numer uzupełniony zerami | `01`, `02`, `03` |
|
||||
| `{{original}}` | Oryginalna nazwa pliku bez rozszerzenia | `photo`, `IMG_001` |
|
||||
|
||||
Oryginalne rozszerzenie pliku jest zawsze zachowywane.
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/bulk-rename \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo1.jpg" \
|
||||
-F "file=@photo2.jpg" \
|
||||
-F "file=@photo3.jpg" \
|
||||
-F 'settings={"pattern": "vacation-{{padded}}", "startIndex": 1}'
|
||||
```
|
||||
|
||||
To daje: `vacation-1.jpg`, `vacation-2.jpg`, `vacation-3.jpg`
|
||||
|
||||
Z użyciem oryginalnej nazwy pliku:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/bulk-rename \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@IMG_001.jpg" \
|
||||
-F "file=@IMG_002.jpg" \
|
||||
-F 'settings={"pattern": "2024-trip-{{original}}-{{index}}"}'
|
||||
```
|
||||
|
||||
To daje: `2024-trip-IMG_001-1.jpg`, `2024-trip-IMG_002-2.jpg`
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
Odpowiedzią jest plik ZIP strumieniowany bezpośrednio (nie odpowiedź JSON). Nagłówki odpowiedzi to:
|
||||
|
||||
```
|
||||
Content-Type: application/zip
|
||||
Content-Disposition: attachment; filename="renamed-a1b2c3d4.zip"
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie nie przetwarza obrazów. Zmienia jedynie nazwy plików i pakuje je do archiwum ZIP.
|
||||
- Szerokość uzupełnienia zerami dla `{{padded}}` jest określana automatycznie na podstawie łącznej liczby plików (np. 100 plików użyłoby uzupełnienia trzycyfrowego: `001`, `002` itd.).
|
||||
- Rozszerzenia plików są zachowywane z oryginalnych nazw plików.
|
||||
- Nazwy plików są oczyszczane w celu usunięcia niebezpiecznych znaków.
|
||||
- Musi zostać dostarczony co najmniej jeden plik.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
description: "Przytnij obraz do wyśrodkowanego koła z przezroczystymi narożnikami."
|
||||
i18n_source_hash: 06c50ccd96b2
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 9033f4215f42
|
||||
---
|
||||
|
||||
# Przycięcie do koła {#circle-crop}
|
||||
|
||||
Przytnij obraz do wyśrodkowanego koła z przezroczystymi narożnikami. Obsługuje regulowany zoom, przesunięcie, obramowanie i rozmiar wyjściowy.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/circle-crop`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| zoom | number | Nie | `1` | Współczynnik zoomu (1-5); wyższe wartości przycinają ciaśniej |
|
||||
| offsetX | number | Nie | `0.5` | Pozioma pozycja środka (0-1) |
|
||||
| offsetY | number | Nie | `0.5` | Pionowa pozycja środka (0-1) |
|
||||
| borderWidth | integer | Nie | `0` | Szerokość obramowania w pikselach (0-200) |
|
||||
| borderColor | string | Nie | `"#ffffff"` | Kolor obramowania w formacie hex |
|
||||
| background | string | Nie | `"transparent"` | Wypełnienie narożników: `"transparent"` lub kolor w formacie hex |
|
||||
| outputSize | integer | Nie | - | Ostateczny wymiar kwadratu w pikselach (16-4096) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/circle-crop \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"zoom": 1.2, "borderWidth": 4, "borderColor": "#333333"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.png",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 185000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wynik jest zawsze w formacie PNG, aby zachować przezroczyste narożniki (chyba że `background` jest ustawione na jednolity kolor).
|
||||
- Koło jest wpisane w krótszy wymiar obrazu. Użyj `zoom`, aby przyciąć ciaśniej, oraz `offsetX`/`offsetY`, aby przesunąć widoczny obszar.
|
||||
- Gdy podano `outputSize`, wynik jest zmieniany do tego wymiaru kwadratu po przycięciu.
|
||||
- Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetworzeniem.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
description: "Łącz wiele obrazów w kolaże siatkowe z ponad 25 szablonami, regulowanymi odstępami i narożnikami oraz przesuwaniem i powiększaniem dla każdej komórki."
|
||||
i18n_source_hash: 96f2055717df
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 12ed9b5e0135
|
||||
---
|
||||
|
||||
# Kolaż / Siatka {#collage-grid}
|
||||
|
||||
Łącz wiele obrazów w piękne kolaże siatkowe z ponad 25 szablonami. Obsługuje układy od 2 do 9 obrazów z konfigurowalnym odstępem, promieniem narożnika, kolorem tła oraz przesuwaniem/powiększaniem dla każdej komórki.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/collage`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| templateId | string | Tak | - | Identyfikator układu szablonu (np. `2-h-equal`, `3-left-large`, `4-grid`, `9-grid`) |
|
||||
| cells | array | Nie | - | Tablica ustawień dla poszczególnych komórek z `imageIndex`, `panX`, `panY`, `zoom`, `objectFit` |
|
||||
| cells[].imageIndex | integer | Tak | - | Indeks obrazu umieszczanego w tej komórce (liczony od 0) |
|
||||
| cells[].panX | number | Nie | 0 | Poziome przesunięcie (od -100 do 100) |
|
||||
| cells[].panY | number | Nie | 0 | Pionowe przesunięcie (od -100 do 100) |
|
||||
| cells[].zoom | number | Nie | 1 | Poziom powiększenia (od 1 do 10) |
|
||||
| cells[].objectFit | string | Nie | `"cover"` | Sposób wypełniania komórki obrazem: `cover` lub `contain` |
|
||||
| gap | number | Nie | 8 | Odstęp między komórkami w pikselach (od 0 do 500) |
|
||||
| cornerRadius | number | Nie | 0 | Promień narożnika każdej komórki w pikselach (od 0 do 500) |
|
||||
| backgroundColor | string | Nie | `"#FFFFFF"` | Kolor tła jako wartość szesnastkowa lub `"transparent"` |
|
||||
| aspectRatio | string | Nie | `"free"` | Proporcje płótna: `free`, `1:1`, `4:3`, `3:2`, `16:9`, `9:16`, `4:5` |
|
||||
| outputFormat | string | Nie | `"png"` | Format wyjściowy: `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | Nie | 90 | Jakość wyjściowa (od 1 do 100) |
|
||||
|
||||
## Dostępne szablony {#available-templates}
|
||||
|
||||
| Identyfikator szablonu | Obrazy | Układ |
|
||||
|-------------|--------|--------|
|
||||
| `2-h-equal` | 2 | Dwie równe kolumny |
|
||||
| `2-v-equal` | 2 | Dwa równe wiersze |
|
||||
| `2-h-left-large` | 2 | Lewa 2/3, prawa 1/3 |
|
||||
| `2-h-right-large` | 2 | Lewa 1/3, prawa 2/3 |
|
||||
| `3-left-large` | 3 | Duży po lewej, dwa ułożone po prawej |
|
||||
| `3-right-large` | 3 | Dwa ułożone po lewej, duży po prawej |
|
||||
| `3-top-large` | 3 | Duży na górze, dwie kolumny na dole |
|
||||
| `3-h-equal` | 3 | Trzy równe kolumny |
|
||||
| `3-v-equal` | 3 | Trzy równe wiersze |
|
||||
| `4-grid` | 4 | Siatka 2x2 |
|
||||
| `4-left-large` | 4 | Duży po lewej, trzy ułożone po prawej |
|
||||
| `4-top-large` | 4 | Duży na górze, trzy kolumny na dole |
|
||||
| `4-bottom-large` | 4 | Trzy kolumny na górze, duży na dole |
|
||||
| `5-top2-bottom3` | 5 | Dwa na górze, trzy na dole |
|
||||
| `5-top3-bottom2` | 5 | Trzy na górze, dwa na dole |
|
||||
| `5-left-large` | 5 | Duży po lewej, cztery ułożone po prawej |
|
||||
| `5-center-large` | 5 | Duży na środku, cztery w narożnikach |
|
||||
| `6-grid-2x3` | 6 | 2 kolumny x 3 wiersze |
|
||||
| `6-grid-3x2` | 6 | 3 kolumny x 2 wiersze |
|
||||
| `6-top-large` | 6 | Duży na górze, pięć kolumn na dole |
|
||||
| `7-mosaic` | 7 | Układ mozaikowy |
|
||||
| `8-mosaic` | 8 | Układ mozaikowy |
|
||||
| `9-grid` | 9 | Siatka 3x3 |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/collage \
|
||||
-F "file=@photo1.jpg" \
|
||||
-F "file=@photo2.jpg" \
|
||||
-F "file=@photo3.jpg" \
|
||||
-F "file=@photo4.jpg" \
|
||||
-F 'settings={"templateId":"4-grid","gap":12,"cornerRadius":8,"backgroundColor":"#F5F5F5","outputFormat":"png","quality":90}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/collage.png",
|
||||
"originalSize": 2456789,
|
||||
"processedSize": 1823456
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Prześlij wiele plików obrazów w żądaniu multipart. Obrazy są przypisywane do komórek szablonu w kolejności przesyłania.
|
||||
- Jeśli prześlesz więcej obrazów, niż obsługuje szablon, dodatkowe obrazy są ignorowane.
|
||||
- Obsługuje formaty wejściowe HEIC, RAW, PSD i SVG (automatycznie dekodowane).
|
||||
- Bazowy rozmiar płótna wynosi 2400 px po najdłuższym boku, skalowany zgodnie z wybranymi proporcjami.
|
||||
- Gdy `aspectRatio` ma wartość `"free"`, płótno domyślnie przyjmuje proporcje 4:3 (2400x1800).
|
||||
- Wartości `panX`/`panY` dla poszczególnych komórek przesuwają okno kadrowania wewnątrz komórki. Wartość 100 przesuwa całkowicie do jednej krawędzi, -100 do przeciwnej.
|
||||
- Kolor tła `"transparent"` jest zachowywany tylko w formatach wyjściowych `png`, `webp` lub `avif`.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Symuluj, jak obrazy wyglądają dla osób z różnymi rodzajami zaburzeń widzenia barw."
|
||||
i18n_source_hash: 0b537628ba79
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 14491fd69cec
|
||||
---
|
||||
|
||||
# Symulacja daltonizmu {#color-blindness-simulation}
|
||||
|
||||
Symuluj zaburzenie widzenia barw (CVD), aby zobaczyć, jak obrazy wyglądają dla osób z różnymi rodzajami daltonizmu. Przydatne do testowania dostępności projektów, wykresów i interfejsów użytkownika.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/color-blindness`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| simulationType | string | Nie | `"deuteranomaly"` | Rodzaj zaburzenia widzenia barw do zasymulowania |
|
||||
|
||||
### Rodzaje symulacji {#simulation-types}
|
||||
|
||||
| Wartość | Stan | Opis |
|
||||
|-------|-----------|-------------|
|
||||
| `protanopia` | Ślepota na czerwień | Całkowity brak czopków czerwieni |
|
||||
| `deuteranopia` | Ślepota na zieleń | Całkowity brak czopków zieleni |
|
||||
| `tritanopia` | Ślepota na błękit | Całkowity brak czopków błękitu |
|
||||
| `protanomaly` | Osłabione widzenie czerwieni | Obniżona czułość czopków czerwieni |
|
||||
| `deuteranomaly` | Osłabione widzenie zieleni | Obniżona czułość czopków zieleni (najczęstsze) |
|
||||
| `tritanomaly` | Osłabione widzenie błękitu | Obniżona czułość czopków błękitu |
|
||||
| `achromatopsia` | Całkowita ślepota barw | Całkowity brak widzenia barw |
|
||||
| `blueConeMonochromacy` | Tylko czopki błękitu | Działają wyłącznie czopki błękitu |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/color-blindness \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@design.png" \
|
||||
-F 'settings={"simulationType": "deuteranopia"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/design.png",
|
||||
"originalSize": 1850000,
|
||||
"processedSize": 1820000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Deuteranomalia (osłabione widzenie zieleni) jest ustawieniem domyślnym, ponieważ to najczęstsza postać zaburzenia widzenia barw, dotykająca około 6% mężczyzn.
|
||||
- Symulacja wykorzystuje macierze transformacji kolorów, które modelują, jak obniżone lub nieobecne fotoreceptory czopkowe zmieniają postrzegane barwy.
|
||||
- To narzędzie jest nieniszczące i generuje jedynie podgląd. Nie modyfikuje oryginalnego obrazu na potrzeby dostępności.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Pliki wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetworzeniem.
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
description: "Wyodrębnij dominujące kolory z obrazu jako paletę barw."
|
||||
i18n_source_hash: 65ab22dd75a9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 59ef3b7b2f37
|
||||
---
|
||||
|
||||
# Paleta kolorów {#color-palette}
|
||||
|
||||
Wyodrębnij dominujące kolory z obrazu i zwróć je jako wartości szesnastkowe. Wykorzystuje skwantowaną analizę częstości, aby zidentyfikować najbardziej wyróżniające się i wizualnie odmienne kolory.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/color-palette`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz opcjonalnym polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| count | integer | Nie | `8` | Liczba kolorów do wyodrębnienia (2-16) |
|
||||
| format | string | Nie | `"hex"` | Format koloru: `hex`, `rgb`, `hsl` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/color-palette \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"count": 6, "format": "hex"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"filename": "photo.jpg",
|
||||
"colors": [
|
||||
"#304080",
|
||||
"#e0a060",
|
||||
"#f0f0f0",
|
||||
"#203020",
|
||||
"#a0c0e0",
|
||||
"#806040"
|
||||
],
|
||||
"hex": [
|
||||
"#304080",
|
||||
"#e0a060",
|
||||
"#f0f0f0",
|
||||
"#203020",
|
||||
"#a0c0e0",
|
||||
"#806040"
|
||||
],
|
||||
"count": 6
|
||||
}
|
||||
```
|
||||
|
||||
## Pola odpowiedzi {#response-fields}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Oczyszczona nazwa pliku |
|
||||
| colors | array | Tablica ciągów kolorów w żądanym formacie, uporządkowana według dominacji (najczęstsze jako pierwsze) |
|
||||
| hex | array | Tablica szesnastkowych ciągów kolorów (zawsze szesnastkowa, niezależnie od ustawienia `format`) |
|
||||
| count | number | Liczba wyodrębnionych kolorów |
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Zwraca do `count` dominujących kolorów (domyślnie 8, zakres 2-16), posortowanych według częstości (najczęstsze jako pierwsze).
|
||||
- Obraz jest wewnętrznie skalowany do 100x100 pikseli na potrzeby analizy, więc paleta odzwierciedla ogólny rozkład kolorów, a nie drobne szczegóły.
|
||||
- Kolory są wyodrębniane metodą kwantyzacji median-cut, która rekurencyjnie dzieli populacje pikseli wzdłuż kanału o najszerszym zakresie.
|
||||
- Kanał alfa jest usuwany przed analizą, więc obszary przezroczyste nie są uwzględniane.
|
||||
- To punkt końcowy tylko do odczytu. Nie generuje pliku wyjściowego do pobrania ani `jobId`.
|
||||
- Pliki wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed analizą.
|
||||
@@ -0,0 +1,80 @@
|
||||
---
|
||||
description: "Automatycznie koloryzuj czarno-białe lub szare zdjęcia za pomocą modelu AI DDColor."
|
||||
i18n_source_hash: 688aa3abbdae
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 64c9b2a242d3
|
||||
---
|
||||
|
||||
# Koloryzacja AI {#ai-colorization}
|
||||
|
||||
Zamień czarno-białe lub szare zdjęcia na pełnokolorowe przy użyciu AI (model DDColor z rezerwowym OpenCV DNN).
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/colorize`
|
||||
|
||||
**Przetwarzanie:** asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modelu:** `object-eraser-colorize` (1-2 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| intensity | number | Nie | `1.0` | Intensywność koloru (0-1). Niższe wartości dają subtelniejszą koloryzację |
|
||||
| model | string | Nie | `"auto"` | Model do użycia: `auto`, `ddcolor`, `opencv` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/colorize \
|
||||
-F "file=@old-bw-photo.jpg" \
|
||||
-F 'settings={"intensity":0.9,"model":"auto"}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Colorizing...","percent":55}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/old-bw-photo_colorized.jpg",
|
||||
"previewUrl": "/api/v1/download/{jobId}/preview.webp",
|
||||
"originalSize": 180000,
|
||||
"processedSize": 210000,
|
||||
"width": 1920,
|
||||
"height": 1080,
|
||||
"method": "ddcolor"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modelu `object-eraser-colorize` (1-2 GB).
|
||||
- DDColor daje wyniki wyższej jakości, ale jest wolniejszy; OpenCV DNN jest szybszy przy nieco niższej jakości. `auto` używa DDColor, gdy jest dostępny, z rezerwowym OpenCV.
|
||||
- Parametr `intensity` miesza oryginalny obraz w skali szarości z wynikiem koloryzacji AI. Użyj wartości 1.0 dla pełnego koloru, niższych wartości dla częściowo odbarwionego, vintage'owego wyglądu.
|
||||
- Format wyjściowy jest automatycznie dopasowywany do formatu wejściowego.
|
||||
- W przypadku formatów wyjściowych, których nie można podejrzeć w przeglądarce, obok głównego wyniku generowany jest podgląd WebP.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,68 @@
|
||||
---
|
||||
description: "Porównaj dwa obrazy obok siebie z wizualizacją różnic na poziomie pikseli i wynikiem podobieństwa."
|
||||
i18n_source_hash: cc0a02bd75c6
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 7ad8cdc9a3da
|
||||
---
|
||||
|
||||
# Porównywanie obrazów {#image-compare}
|
||||
|
||||
Prześlij dwa obrazy, aby obliczyć mapę różnic na poziomie pikseli oraz liczbowy procent podobieństwa. Wynikiem jest obraz różnic wyróżniający zmienione obszary na czerwono.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/compare`
|
||||
|
||||
Przyjmuje dane formularza multipart z **dwoma** plikami obrazów. Pole ustawień nie jest wymagane.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
To narzędzie nie ma konfigurowalnych parametrów. Prześlij dokładnie dwa pliki obrazów.
|
||||
|
||||
| Pole | Typ | Wymagane | Opis |
|
||||
|-------|------|----------|-------------|
|
||||
| file (pierwszy) | file | Tak | Pierwszy obraz |
|
||||
| file (drugi) | file | Tak | Drugi obraz |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/compare \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@original.jpg" \
|
||||
-F "file=@modified.jpg"
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"similarity": 94.52,
|
||||
"dimensions": { "width": 1920, "height": 1080 },
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/diff.png",
|
||||
"originalSize": 4900000,
|
||||
"processedSize": 280000
|
||||
}
|
||||
```
|
||||
|
||||
## Pola odpowiedzi {#response-fields}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| jobId | string | Identyfikator zadania do pobrania obrazu różnic |
|
||||
| similarity | number | Procent podobieństwa między dwoma obrazami (od 0 do 100) |
|
||||
| dimensions | object | Szerokość i wysokość użyte do porównania |
|
||||
| downloadUrl | string | Adres URL do pobrania wygenerowanego obrazu różnic |
|
||||
| originalSize | number | Łączny rozmiar obu obrazów wejściowych w bajtach |
|
||||
| processedSize | number | Rozmiar wyjściowego obrazu różnic w bajtach |
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Oba obrazy są skalowane do tych samych wymiarów (maksimum z każdej osi) przed porównaniem.
|
||||
- Obraz różnic wyróżnia różnice na czerwono z przezroczystością proporcjonalną do wielkości zmiany. Piksele identyczne lub prawie identyczne (różnica < 10) są pokazywane jako półprzezroczyste wersje oryginału.
|
||||
- Podobieństwo jest obliczane jako odwrotność średniej różnicy pikseli w całym obrazie, wyrażona procentowo.
|
||||
- Podobieństwo 100% oznacza, że obrazy są identyczne co do piksela (w rozdzielczości porównania).
|
||||
- Wynikowy obraz różnic ma zawsze format PNG, niezależnie od formatów wejściowych.
|
||||
- Oba obrazy są walidowane i dekodowane (obsługiwane HEIC, RAW, PSD, SVG) przed porównaniem.
|
||||
- Orientacja EXIF jest automatycznie stosowana do obu obrazów przed przetwarzaniem.
|
||||
@@ -0,0 +1,87 @@
|
||||
---
|
||||
description: "Nakładaj obrazy z określoną pozycją, przezroczystością i trybami mieszania w celu kompozycji."
|
||||
i18n_source_hash: c5d09eb13fde
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d43fc1e1545b
|
||||
---
|
||||
|
||||
# Kompozycja obrazów {#image-composition}
|
||||
|
||||
Nałóż obraz nakładki na obraz bazowy z konfigurowalną pozycją, przezroczystością i trybem mieszania. Przydatne do komponowania logotypów, grafik lub łączenia wielu obrazów.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/compose`
|
||||
|
||||
Przyjmuje dane formularza multipart z **dwoma** plikami obrazów oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| x | number | Nie | `0` | Poziome przesunięcie nakładki od lewego górnego rogu w pikselach (min 0) |
|
||||
| y | number | Nie | `0` | Pionowe przesunięcie nakładki od lewego górnego rogu w pikselach (min 0) |
|
||||
| opacity | number | Nie | `100` | Procent przezroczystości nakładki (od 0 do 100) |
|
||||
| blendMode | string | Nie | `"over"` | Tryb mieszania podczas kompozycji |
|
||||
|
||||
### Tryby mieszania {#blend-modes}
|
||||
|
||||
| Wartość | Opis |
|
||||
|-------|-------------|
|
||||
| `over` | Zwykłe nałożenie (domyślne) |
|
||||
| `multiply` | Przyciemnianie przez mnożenie wartości pikseli |
|
||||
| `screen` | Rozjaśnianie przez odwrócenie, mnożenie i ponowne odwrócenie |
|
||||
| `overlay` | Łączy mnożenie i rozjaśnianie w zależności od jasności bazy |
|
||||
| `darken` | Zachowuje ciemniejszy piksel z każdej warstwy |
|
||||
| `lighten` | Zachowuje jaśniejszy piksel z każdej warstwy |
|
||||
| `hard-light` | Nałożenie o silnym kontraście |
|
||||
| `soft-light` | Nałożenie o subtelnym kontraście |
|
||||
| `difference` | Wartość bezwzględna różnicy między warstwami |
|
||||
| `exclusion` | Podobne do różnicy, ale o niższym kontraście |
|
||||
|
||||
### Pola plików {#file-fields}
|
||||
|
||||
| Nazwa pola | Wymagane | Opis |
|
||||
|------------|----------|-------------|
|
||||
| file | Tak | Obraz bazowy/tło |
|
||||
| overlay | Tak | Obraz nakładki/pierwszego planu |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/compose \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@background.jpg" \
|
||||
-F "overlay=@graphic.png" \
|
||||
-F 'settings={"x": 100, "y": 50, "opacity": 80, "blendMode": "over"}'
|
||||
```
|
||||
|
||||
Użycie trybu mieszania multiply:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/compose \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F "overlay=@texture.jpg" \
|
||||
-F 'settings={"x": 0, "y": 0, "opacity": 50, "blendMode": "multiply"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/background.jpg",
|
||||
"originalSize": 3200000,
|
||||
"processedSize": 3450000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Oba obrazy są walidowane i dekodowane (obsługiwane HEIC, RAW, PSD, SVG) przed kompozycją.
|
||||
- Nakładka jest umieszczana dokładnie we współrzędnych pikselowych określonych przez `x` i `y`. Nie jest skalowana do dopasowania.
|
||||
- Jeśli przezroczystość jest mniejsza niż 100, przed mieszaniem do nakładki stosowana jest maska alfa.
|
||||
- Nakładka może wykraczać poza granice obrazu bazowego (zostanie wtedy przycięta).
|
||||
- Orientacja EXIF jest automatycznie stosowana do obu obrazów przed przetwarzaniem.
|
||||
- Wymiary wyjściowe odpowiadają wymiarom obrazu bazowego.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Zmniejsz rozmiar pliku obrazu według poziomu jakości lub do docelowego rozmiaru pliku."
|
||||
i18n_source_hash: af4685da7e64
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ad5235390f3f
|
||||
---
|
||||
|
||||
# Kompresja {#compress}
|
||||
|
||||
Zmniejsz rozmiar pliku obrazu, określając poziom jakości lub docelowy rozmiar pliku w kilobajtach. Narzędzie wykorzystuje iteracyjne wyszukiwanie binarne, aby dokładnie trafić w docelowy rozmiar.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/compress`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| mode | string | Nie | `"quality"` | Tryb kompresji: `quality` lub `targetSize` |
|
||||
| quality | number | Nie | `80` | Poziom jakości (1-100). Używany, gdy tryb to `quality`. |
|
||||
| targetSizeKb | number | Nie | - | Docelowy rozmiar pliku w kilobajtach. Używany, gdy tryb to `targetSize`. |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Kompresja do jakości 60:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/compress \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"mode": "quality", "quality": 60}'
|
||||
```
|
||||
|
||||
Kompresja do docelowego rozmiaru 200 KB:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/compress \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"mode": "targetSize", "targetSizeKb": 200}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 204800
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- W trybie `quality` niższe wartości dają mniejsze pliki z większą liczbą artefaktów kompresji. Wartość 80 to dobra wartość domyślna do zastosowań webowych.
|
||||
- W trybie `targetSize` silnik wykonuje iteracyjną kompresję, aby zbliżyć się do celu jak najbardziej bez jego przekroczenia.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Kompresja dotyczy natywnego kodowania danego formatu (np. jakość JPEG dla plików JPEG, jakość WebP dla plików WebP).
|
||||
- Jeśli domyślna jakość (80) jest akceptowalna, możesz całkowicie pominąć parametr `quality`.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
description: "Zmiana rozmiaru metodą wycinania szwów, która dodaje lub usuwa piksele wzdłuż ścieżek o niskim znaczeniu, aby zachować kluczową zawartość i twarze."
|
||||
i18n_source_hash: f383b28ab62a
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 041fb6c6b708
|
||||
---
|
||||
|
||||
# Zmiana rozmiaru uwzględniająca treść {#content-aware-resize}
|
||||
|
||||
Zmiana rozmiaru metodą wycinania szwów, która inteligentnie usuwa lub dodaje piksele wzdłuż ścieżek o najmniejszym znaczeniu wizualnym, zachowując istotną zawartość i opcjonalnie chroniąc twarze.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/content-aware-resize`
|
||||
|
||||
**Przetwarzanie:** synchroniczne (zwraca wynik bezpośrednio)
|
||||
|
||||
**Pakiet modelu:** żaden nie jest wymagany do podstawowego działania. Ochrona twarzy używa pakietu `face-detection` (200-300 MB), jeśli jest włączona.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| width | number | Nie | - | Docelowa szerokość w pikselach |
|
||||
| height | number | Nie | - | Docelowa wysokość w pikselach |
|
||||
| protectFaces | boolean | Nie | `false` | Wykrywaj i chroń twarze przed usuwaniem szwów |
|
||||
| blurRadius | number | Nie | `4` | Promień rozmycia wstępnego przetwarzania na potrzeby obliczania energii (0-20) |
|
||||
| sobelThreshold | number | Nie | `2` | Próg wykrywania krawędzi Sobela (1-20). Wyższe wartości sprawiają, że algorytm jest bardziej agresywny |
|
||||
| square | boolean | Nie | `false` | Zmień rozmiar do kwadratu (używa mniejszego wymiaru) |
|
||||
|
||||
Należy podać co najmniej jeden z parametrów `width`, `height` lub `square`.
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/content-aware-resize \
|
||||
-F "file=@landscape.jpg" \
|
||||
-F 'settings={"width":800,"protectFaces":true}'
|
||||
```
|
||||
|
||||
## Odpowiedź (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/landscape_seam.png",
|
||||
"originalSize": 450000,
|
||||
"processedSize": 380000,
|
||||
"width": 800,
|
||||
"height": 600
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Ta niestandardowa trasa zwraca obecnie synchroniczną odpowiedź 200.
|
||||
- Wykorzystuje bibliotekę wycinania szwów `caire` do zmiany rozmiaru uwzględniającej treść.
|
||||
- Tylko zmniejsza wymiary (usuwa szwy). Nie może powiększyć obrazu poza jego oryginalny rozmiar.
|
||||
- Opcja `protectFaces` używa wykrywania twarzy przez AI, aby oznaczyć obszary twarzy jako wysokoenergetyczne, uniemożliwiając przechodzenie szwów przez twarze.
|
||||
- `blurRadius` steruje wygładzaniem przed obliczeniem mapy energii. Wyższe wartości czynią mapę energii bardziej jednorodną, co może pomóc przy zaszumionych obrazach.
|
||||
- `sobelThreshold` wpływa na to, jak agresywnie wykrywane są krawędzie. Niższe wartości zachowują więcej subtelnych krawędzi.
|
||||
- Wynik ma zawsze format PNG.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,84 @@
|
||||
---
|
||||
description: "Konwertuj obrazy między formatami, w tym nowoczesnymi jak AVIF, JXL i HEIC."
|
||||
i18n_source_hash: 562f8270e8c3
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 7d07d56af008
|
||||
---
|
||||
|
||||
# Konwersja {#convert}
|
||||
|
||||
Konwertuj obrazy między formatami. Obsługuje popularne formaty webowe oraz specjalistyczne, takie jak HEIC, JXL, BMP, ICO, JP2, QOI i PSD.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/convert`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| format | string | Tak | - | Format docelowy: `jpg`, `png`, `webp`, `avif`, `tiff`, `gif`, `heic`, `heif`, `jxl`, `bmp`, `ico`, `jp2`, `qoi`, `psd`, `ppm`, `eps`, `tga` |
|
||||
| quality | number | Nie | - | Jakość wyjściowa (1-100). Dotyczy formatów stratnych, takich jak jpg, webp, avif, heic. |
|
||||
|
||||
## Obsługiwane formaty wyjściowe {#supported-output-formats}
|
||||
|
||||
| Format | Typ | Uwagi |
|
||||
|--------|------|-------|
|
||||
| jpg | Stratny | JPEG, najlepsza kompatybilność |
|
||||
| png | Bezstratny | Obsługuje przezroczystość |
|
||||
| webp | Oba | Nowoczesny format webowy, dobra kompresja |
|
||||
| avif | Stratny | Format nowej generacji, doskonała kompresja |
|
||||
| tiff | Oba | Procesy druku/publikacji |
|
||||
| gif | Bezstratny | Ograniczony do 256 kolorów |
|
||||
| heic / heif | Stratny | Format ekosystemu Apple |
|
||||
| jxl | Oba | JPEG XL, format nowej generacji |
|
||||
| bmp | Bezstratny | Nieskompresowana mapa bitowa |
|
||||
| ico | Bezstratny | Format ikon Windows |
|
||||
| jp2 | Stratny | JPEG 2000 |
|
||||
| qoi | Bezstratny | Format Quite OK Image |
|
||||
| psd | Warstwowy | Adobe Photoshop (wymaga ImageMagick) |
|
||||
| ppm | Bezstratny | Portable Pixmap (PPM/PGM/PBM) |
|
||||
| eps | Wektorowy | Encapsulated PostScript |
|
||||
| tga | Bezstratny | Format obrazu Targa |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Konwersja do WebP:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/convert \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"format": "webp", "quality": 85}'
|
||||
```
|
||||
|
||||
Konwersja do PNG (bezstratna):
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/convert \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"format": "png"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.webp",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 680000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Rozszerzenie nazwy pliku wyjściowego jest automatycznie aktualizowane, aby pasowało do formatu docelowego.
|
||||
- Pliki wejściowe SVG są rasteryzowane w 300 DPI przed konwersją.
|
||||
- Konwersja PSD wymaga zainstalowanego na serwerze ImageMagick.
|
||||
- Formaty BMP, EPS, ICO, JP2, JXL, PPM, QOI i TGA używają specjalistycznych koderów CLI i pomijają przetwarzanie przez Sharp.
|
||||
- Kodowanie HEIC/HEIF używa systemowej biblioteki kodera HEIC.
|
||||
- Formaty wejściowe są szerokie: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC, RAW (CR2, NEF, ARW itd.), PSD, SVG, BMP i inne.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Kadruj obrazy, określając obszar za pomocą pozycji i wymiarów."
|
||||
i18n_source_hash: aab38ccd7c53
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ac8f21ea2c80
|
||||
---
|
||||
|
||||
# Kadrowanie {#crop}
|
||||
|
||||
Kadruj obrazy, definiując prostokątny obszar za pomocą pozycji i rozmiaru. Obsługuje zarówno jednostki pikselowe, jak i procentowe.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/crop`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| left | number | Tak | - | Przesunięcie X obszaru kadrowania (od lewej krawędzi) |
|
||||
| top | number | Tak | - | Przesunięcie Y obszaru kadrowania (od górnej krawędzi) |
|
||||
| width | number | Tak | - | Szerokość obszaru kadrowania |
|
||||
| height | number | Tak | - | Wysokość obszaru kadrowania |
|
||||
| unit | string | Nie | `"px"` | Jednostka wartości: `px` lub `percent` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/crop \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"left": 100, "top": 50, "width": 800, "height": 600}'
|
||||
```
|
||||
|
||||
Kadrowanie z użyciem wartości procentowych:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/crop \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"left": 10, "top": 10, "width": 80, "height": 80, "unit": "percent"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 1200000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Obszar kadrowania musi mieścić się w granicach obrazu. Jeśli obszar wykracza poza obraz, żądanie zakończy się niepowodzeniem.
|
||||
- Przy użyciu jednostki `percent` wartości oznaczają procent wymiarów obrazu (np. `left: 10` oznacza 10% od lewej krawędzi).
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu.
|
||||
- Orientacja EXIF jest automatycznie stosowana przed kadrowaniem, więc współrzędne odpowiadają wizualnie poprawnej orientacji.
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
description: "Zastosuj dwukolorowy efekt duotone z niestandardowymi kolorami cieni i świateł."
|
||||
i18n_source_hash: ab99c4f0152c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 0afe4767f2ad
|
||||
---
|
||||
|
||||
# Duotone {#duotone}
|
||||
|
||||
Zastosuj dwukolorowy efekt duotone do obrazu. Obraz jest konwertowany do skali szarości, a następnie mapowany na gradient między kolorem cieni (ciemne tony) a kolorem świateł (jasne tony).
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/duotone`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| shadow | string | Nie | `"#1e3a8a"` | Szesnastkowy kolor cieni (stosowany do ciemnych tonów) |
|
||||
| highlight | string | Nie | `"#fbbf24"` | Szesnastkowy kolor świateł (stosowany do jasnych tonów) |
|
||||
| intensity | integer | Nie | `100` | Intensywność efektu (0-100); 0 zwraca oryginał, 100 stosuje pełny efekt duotone |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/duotone \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"shadow": "#0f172a", "highlight": "#f97316", "intensity": 80}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 1870000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Pliki wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
- Wartość `intensity` mniejsza niż 100 miesza wynik duotone z oryginalnym obrazem, pozwalając na subtelniejsze efekty.
|
||||
- Popularne kombinacje duotone to granat/złoto, morski/koralowy oraz fioletowy/różowy.
|
||||
@@ -0,0 +1,108 @@
|
||||
---
|
||||
description: "Edytuj pola metadanych EXIF, IPTC, GPS i XMP w obrazach bez ponownego kodowania pikseli."
|
||||
i18n_source_hash: a37746db11c3
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d5065d34ee21
|
||||
---
|
||||
|
||||
# Edycja metadanych {#edit-metadata}
|
||||
|
||||
Edytuj pola metadanych obrazu, w tym EXIF, IPTC, współrzędne GPS, daty i słowa kluczowe. Wykorzystuje pod spodem ExifTool, więc metadane są zapisywane w miejscu bez ponownego kodowania pikseli, zachowując pełną jakość obrazu.
|
||||
|
||||
## Punkty końcowe API {#api-endpoints}
|
||||
|
||||
### Edycja metadanych {#edit-metadata-1}
|
||||
|
||||
`POST /api/v1/tools/image/edit-metadata`
|
||||
|
||||
Zapisuje pola metadanych do obrazu i zwraca zmodyfikowany plik.
|
||||
|
||||
### Sprawdzanie metadanych {#inspect-metadata}
|
||||
|
||||
`POST /api/v1/tools/image/edit-metadata/inspect`
|
||||
|
||||
Zwraca pełne metadane z obrazu za pomocą ExifTool w formacie JSON. Nie modyfikuje obrazu.
|
||||
|
||||
## Parametry (Edycja) {#parameters-edit}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| title | string | Nie | - | Tytuł obrazu (XMP/EXIF) |
|
||||
| author | string | Nie | - | Nazwa autora |
|
||||
| artist | string | Nie | - | Nazwa artysty (znacznik EXIF Artist) |
|
||||
| copyright | string | Nie | - | Nota o prawach autorskich |
|
||||
| imageDescription | string | Nie | - | Opis obrazu (EXIF) |
|
||||
| software | string | Nie | - | Znacznik oprogramowania |
|
||||
| dateTime | string | Nie | - | Wartość EXIF DateTime |
|
||||
| dateTimeOriginal | string | Nie | - | Wartość EXIF DateTimeOriginal |
|
||||
| setAllDates | string | Nie | - | Ustaw wszystkie pola dat naraz |
|
||||
| dateShift | string | Nie | - | Przesuń wszystkie daty o wartość (format: `+HH:MM` lub `-HH:MM`) |
|
||||
| clearGps | boolean | Nie | `false` | Usuń wszystkie dane GPS |
|
||||
| gpsLatitude | number | Nie | - | Ustaw szerokość geograficzną GPS (od -90 do 90) |
|
||||
| gpsLongitude | number | Nie | - | Ustaw długość geograficzną GPS (od -180 do 180) |
|
||||
| gpsAltitude | number | Nie | - | Ustaw wysokość GPS w metrach |
|
||||
| keywords | string[] | Nie | - | Słowa kluczowe/tagi do dodania lub ustawienia |
|
||||
| keywordsMode | string | Nie | `"add"` | Sposób obsługi słów kluczowych: `add` (dołącz) lub `set` (zastąp) |
|
||||
| fieldsToRemove | string[] | Nie | `[]` | Lista nazw konkretnych pól metadanych do usunięcia |
|
||||
| iptcTitle | string | Nie | - | IPTC Object Name |
|
||||
| iptcHeadline | string | Nie | - | IPTC Headline |
|
||||
| iptcCity | string | Nie | - | IPTC City |
|
||||
| iptcState | string | Nie | - | IPTC Province/State |
|
||||
| iptcCountry | string | Nie | - | IPTC Country |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Ustawianie autora i praw autorskich:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/edit-metadata \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"author": "Jane Smith", "copyright": "2024 Jane Smith"}'
|
||||
```
|
||||
|
||||
Ustawianie współrzędnych GPS:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/edit-metadata \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"gpsLatitude": 48.8566, "gpsLongitude": 2.3522, "gpsAltitude": 35}'
|
||||
```
|
||||
|
||||
Usuwanie GPS i dodawanie słów kluczowych:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/edit-metadata \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"clearGps": true, "keywords": ["landscape", "sunset"], "keywordsMode": "add"}'
|
||||
```
|
||||
|
||||
Sprawdzanie metadanych:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/edit-metadata/inspect \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg"
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź (Edycja) {#example-response-edit}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2452000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie wymaga zainstalowanego na serwerze ExifTool. Jest on dołączony do obrazu Docker.
|
||||
- Metadane są zapisywane w miejscu, więc nie następuje ponowne kodowanie pikseli. Zmiana rozmiaru pliku jest minimalna (tylko bajty metadanych).
|
||||
- Parametr `dateShift` przesuwa wszystkie pola dat o określoną wartość, co jest przydatne do korygowania błędów stref czasowych (np. `+02:00` lub `-05:30`).
|
||||
- Jeśli nie zażądano żadnych zmian (wszystkie parametry pominięte lub puste), oryginalny plik jest zwracany bez zmian.
|
||||
- Obsługiwane formaty: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC/HEIF.
|
||||
- W przypadku formatów, których nie można podejrzeć w przeglądarce (HEIF, TIFF), odpowiedź zawiera pole `previewUrl` z podglądem WebP.
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description: "Odrestauruj i wyostrz rozmyte lub niskiej jakości twarze na obrazach za pomocą modeli AI GFPGAN i CodeFormer."
|
||||
i18n_source_hash: 7f9f6af8ebda
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 0467760d4ebc
|
||||
---
|
||||
|
||||
# Poprawa twarzy {#face-enhancement}
|
||||
|
||||
Odrestauruj i popraw twarze na obrazach za pomocą modeli AI (GFPGAN/CodeFormer).
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/enhance-faces`
|
||||
|
||||
**Przetwarzanie:** asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiety modeli:** `upscale-enhance` (5-6 GB) oraz `face-detection` (200-300 MB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| model | string | Nie | `"auto"` | Model do użycia: `auto`, `gfpgan`, `codeformer` |
|
||||
| strength | number | Nie | `0.8` | Siła poprawy (0-1). Wyższe wartości dają silniejszą poprawę |
|
||||
| onlyCenterFace | boolean | Nie | `false` | Popraw tylko najbardziej centralną/wyeksponowaną twarz |
|
||||
| sensitivity | number | Nie | `0.5` | Czułość wykrywania twarzy (0-1) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/enhance-faces \
|
||||
-F "file=@portrait.jpg" \
|
||||
-F 'settings={"model":"codeformer","strength":0.7,"onlyCenterFace":false}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Enhancing faces...","percent":60}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/portrait_enhanced.png",
|
||||
"previewUrl": "/api/v1/download/{jobId}/preview.webp",
|
||||
"originalSize": 350000,
|
||||
"processedSize": 600000,
|
||||
"facesDetected": 2,
|
||||
"faces": [
|
||||
{"x": 120, "y": 80, "w": 100, "h": 100},
|
||||
{"x": 350, "y": 90, "w": 95, "h": 95}
|
||||
],
|
||||
"model": "codeformer"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zarówno pakietu modelu `upscale-enhance` (5-6 GB), jak i pakietu modelu `face-detection` (200-300 MB).
|
||||
- GFPGAN daje bardziej agresywną poprawę; CodeFormer lepiej zachowuje tożsamość. `auto` wybiera najlepszy model dla danego wejścia.
|
||||
- Wynik ma zawsze format PNG dla maksymalnej jakości.
|
||||
- Obok wyniku w pełnej rozdzielczości generowany jest podgląd WebP, aby przyspieszyć wyświetlanie w interfejsie.
|
||||
- Parametr `strength` miesza poprawioną twarz z oryginałem. Użyj niższych wartości (0.3-0.5) dla subtelnych poprawek, wyższych (0.7-1.0) dla silniejszej restauracji.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: "Usuwaj niechciane obiekty z obrazów za pomocą inpaintingu AI (LaMa), kierując się maską obszaru do wymazania."
|
||||
i18n_source_hash: 8e2e42a5e4f9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d57ffcc5291b
|
||||
---
|
||||
|
||||
# Wymazywanie obiektów {#object-eraser}
|
||||
|
||||
Usuwaj niechciane obiekty z obrazów za pomocą inpaintingu AI (model LaMa). Przyjmuje obraz oraz maskę wskazującą obszar do wymazania.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/erase-object`
|
||||
|
||||
**Przetwarzanie:** asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modelu:** `object-eraser-colorize` (1-2 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu źródłowego (multipart) |
|
||||
| mask | file | Tak | - | Obraz maski (biały = obszar do wymazania, czarny = zachowanie). Musi być przesłany z nazwą pola `mask` |
|
||||
| format | string | Nie | `"auto"` | Format wyjściowy: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| quality | integer | Nie | `95` | Jakość wyjściowa (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/erase-object \
|
||||
-F "file=@photo.jpg" \
|
||||
-F "mask=@mask.png" \
|
||||
-F "format=png" \
|
||||
-F "quality=95"
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Inpainting...","percent":70}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo_erased.png",
|
||||
"previewUrl": "/api/v1/download/{jobId}/preview.webp",
|
||||
"originalSize": 245000,
|
||||
"processedSize": 230000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modelu `object-eraser-colorize` (1-2 GB).
|
||||
- Maska musi mieć takie same wymiary jak obraz źródłowy. Białe piksele wskazują obszary do wymazania; AI wypełnia je wiarygodną treścią.
|
||||
- Wykorzystuje LaMa (Large Mask Inpainting) do wysokiej jakości usuwania obiektów.
|
||||
- W przypadku formatów wyjściowych, których nie można podejrzeć w przeglądarce, obok głównego wyniku generowany jest podgląd WebP.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,93 @@
|
||||
---
|
||||
description: "Generuj wszystkie standardowe rozmiary ikon favicon i ikon aplikacji z obrazu źródłowego."
|
||||
i18n_source_hash: 3a6451a94b7a
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ce28a5b01308
|
||||
---
|
||||
|
||||
# Generator favicon {#favicon-generator}
|
||||
|
||||
Wygeneruj kompletny zestaw plików favicon i ikon aplikacji z obrazu źródłowego. Tworzy wszystkie standardowe rozmiary potrzebne przeglądarkom, urządzeniom Apple i Android, wraz z manifestem web oraz fragmentem HTML.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/favicon`
|
||||
|
||||
Przyjmuje dane formularza multipart z jednym lub większą liczbą plików obrazów oraz opcjonalnym polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| background | string | Nie | - | Kolor tła w formacie hex (np. `"#ffffff"`). Gdy ustawiony, ikona jest spłaszczana na tym kolorze. |
|
||||
| padding | integer | Nie | `0` | Procent odstępu wokół zawartości ikony (0 do 40) |
|
||||
| radius | integer | Nie | `0` | Procent promienia zaokrąglenia narożników dla zaokrąglonych ikon (0 do 50) |
|
||||
| sizes | integer[] | Nie | - | Ogranicz wynik do konkretnych rozmiarów w pikselach (np. `[16, 32, 180]`). Pomiń, aby wygenerować wszystkie standardowe rozmiary. |
|
||||
| themeColor | string | Nie | `"#ffffff"` | Kolor motywu w formacie hex dla manifestu web |
|
||||
|
||||
## Generowane pliki {#generated-files}
|
||||
|
||||
Dla każdego obrazu wejściowego tworzone są następujące pliki:
|
||||
|
||||
| Plik | Rozmiar | Przeznaczenie |
|
||||
|------|------|---------|
|
||||
| `favicon-16x16.png` | 16x16 | Ikona karty przeglądarki |
|
||||
| `favicon-32x32.png` | 32x32 | Ikona karty przeglądarki (HiDPI) |
|
||||
| `favicon-48x48.png` | 48x48 | Skrót na pulpicie |
|
||||
| `apple-touch-icon.png` | 180x180 | Ekran główny iOS |
|
||||
| `android-chrome-192x192.png` | 192x192 | Ekran główny Android |
|
||||
| `android-chrome-512x512.png` | 512x512 | Ekran powitalny Android |
|
||||
| `favicon.ico` | 32x32 | Starszy format ICO |
|
||||
| `manifest.json` | - | Manifest aplikacji web z odwołaniami do ikon |
|
||||
| `favicon-snippet.html` | - | Gotowe do użycia znaczniki link HTML |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Pojedynczy obraz źródłowy z zaokrąglonymi narożnikami i odstępem:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/favicon \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@logo.png" \
|
||||
-F 'settings={"padding": 10, "radius": 20, "themeColor": "#0a0a0a"}'
|
||||
```
|
||||
|
||||
Wiele obrazów źródłowych (każdy otrzymuje własny zestaw w podfolderze):
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/favicon \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@logo-light.png" \
|
||||
-F "file=@logo-dark.png"
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
Odpowiedzią jest plik ZIP przesyłany strumieniowo bezpośrednio. Nagłówki odpowiedzi to:
|
||||
|
||||
```
|
||||
Content-Type: application/zip
|
||||
Content-Disposition: attachment; filename="favicons-a1b2c3d4.zip"
|
||||
```
|
||||
|
||||
## Dołączony fragment HTML {#html-snippet-included}
|
||||
|
||||
Plik ZIP zawiera plik `favicon-snippet.html`, który możesz wkleić do swojego HTML `<head>`:
|
||||
|
||||
```html
|
||||
<!-- Favicons -->
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Obrazy źródłowe są skalowane w trybie dopasowania `cover`, co oznacza, że są przycinane, aby wypełnić każdy kwadratowy rozmiar. Dla najlepszych rezultatów użyj kwadratowego obrazu źródłowego.
|
||||
- Gdy przesłanych jest wiele plików, każdy otrzymuje własny podfolder w pliku ZIP (nazwany według pliku źródłowego).
|
||||
- W przypadku przesłania pojedynczego pliku wszystkie wyniki znajdują się w katalogu głównym pliku ZIP bez podfolderu.
|
||||
- Pliki, które nie przejdą walidacji lub dekodowania, są pomijane, a do pliku ZIP dołączany jest `skipped-files.txt` wyjaśniający problemy.
|
||||
- Obsługiwane formaty wejściowe: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC, SVG, RAW, PSD i inne.
|
||||
- Orientacja EXIF jest automatycznie stosowana przed skalowaniem.
|
||||
@@ -0,0 +1,115 @@
|
||||
---
|
||||
description: "Wykrywaj zduplikowane i niemal identyczne obrazy przy użyciu haszowania percepcyjnego."
|
||||
i18n_source_hash: 4e1f4413f90f
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 86a88fd343b3
|
||||
---
|
||||
|
||||
# Znajdź duplikaty {#find-duplicates}
|
||||
|
||||
Prześlij wiele obrazów, aby wykryć duplikaty i niemal identyczne obrazy przy użyciu haszowania percepcyjnego (dHash). Grupuje podobne obrazy razem, identyfikuje wersję o najlepszej jakości w każdej grupie i oblicza potencjalne oszczędności miejsca.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/find-duplicates`
|
||||
|
||||
Przyjmuje dane formularza multipart z wieloma plikami obrazów oraz opcjonalnym polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| threshold | number | Nie | `8` | Maksymalna odległość Hamminga uznająca obrazy za duplikaty (0 do 20). Niższa = surowsze dopasowanie |
|
||||
|
||||
### Pola plików {#file-fields}
|
||||
|
||||
Prześlij co najmniej 2 pliki obrazów w żądaniu multipart (wszystkie używając nazwy pola `file` lub dowolnej nazwy pola dla części plików).
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/find-duplicates \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo1.jpg" \
|
||||
-F "file=@photo2.jpg" \
|
||||
-F "file=@photo3.jpg" \
|
||||
-F "file=@photo4.jpg" \
|
||||
-F 'settings={"threshold": 8}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"totalImages": 4,
|
||||
"duplicateGroups": [
|
||||
{
|
||||
"groupId": 1,
|
||||
"files": [
|
||||
{
|
||||
"filename": "photo1.jpg",
|
||||
"similarity": 100,
|
||||
"width": 4032,
|
||||
"height": 3024,
|
||||
"fileSize": 2450000,
|
||||
"format": "jpeg",
|
||||
"isBest": true,
|
||||
"thumbnail": "data:image/jpeg;base64,/9j/..."
|
||||
},
|
||||
{
|
||||
"filename": "photo2.jpg",
|
||||
"similarity": 96.88,
|
||||
"width": 1920,
|
||||
"height": 1440,
|
||||
"fileSize": 850000,
|
||||
"format": "jpeg",
|
||||
"isBest": false,
|
||||
"thumbnail": "data:image/jpeg;base64,/9j/..."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"uniqueImages": 2,
|
||||
"spaceSaveable": 850000,
|
||||
"skippedFiles": []
|
||||
}
|
||||
```
|
||||
|
||||
## Pola odpowiedzi {#response-fields}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| totalImages | number | Liczba pomyślnie przeanalizowanych obrazów |
|
||||
| duplicateGroups | array | Grupy zduplikowanych obrazów |
|
||||
| uniqueImages | number | Liczba obrazów nienależących do żadnej grupy duplikatów |
|
||||
| spaceSaveable | number | Łączna liczba bajtów, którą można zaoszczędzić, usuwając duplikaty inne niż najlepsze |
|
||||
| skippedFiles | array | Pliki, których nie udało się przetworzyć (z nazwą pliku i powodem) |
|
||||
|
||||
### Obiekt grupy duplikatów {#duplicate-group-object}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| groupId | number | Identyfikator grupy |
|
||||
| files | array | Obrazy w tej grupie duplikatów |
|
||||
|
||||
### Obiekt pliku (w obrębie grupy) {#file-object-within-a-group}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Oryginalna nazwa pliku |
|
||||
| similarity | number | Procentowe podobieństwo do obrazu referencyjnego (pierwszego w grupie) |
|
||||
| width | number | Szerokość obrazu w pikselach |
|
||||
| height | number | Wysokość obrazu w pikselach |
|
||||
| fileSize | number | Rozmiar pliku w bajtach |
|
||||
| format | string | Format obrazu |
|
||||
| isBest | boolean | Czy jest to wersja o najwyższej jakości (najwięcej pikseli, największy plik) |
|
||||
| thumbnail | string lub null | Miniatura JPEG w Base64 (szerokość 200px) do podglądu |
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wykorzystuje 128-bitowy dHash (64-bitowy wiersz + 64-bitowa kolumna) do wykrywania podobieństwa percepcyjnego. Wykrywa to duplikaty nawet po zmianie rozmiaru, ponownej kompresji i drobnych edycjach.
|
||||
- Próg reprezentuje maksymalną odległość Hamminga między haszami. Domyślna wartość 8 wykrywa niemal identyczne obrazy, unikając fałszywych trafień. Użyj 0 dla identycznych pikselowo, lub 15-20 dla bardzo luźnego dopasowania.
|
||||
- „Najlepszym” obrazem w każdej grupie jest ten z największą liczbą pikseli (szerokość x wysokość), z rozmiarem pliku jako kryterium rozstrzygającym.
|
||||
- Wymagane są co najmniej 2 obrazy. Pliki, które nie przejdą walidacji lub dekodowania, są zgłaszane w `skippedFiles`, zamiast powodować niepowodzenie całego żądania.
|
||||
- Miniatury to podglądy JPEG o szerokości 200px zakodowane jako identyfikatory URI danych.
|
||||
- Obsługiwane są wszystkie popularne formaty (HEIC, RAW, PSD, SVG dekodowane automatycznie).
|
||||
@@ -0,0 +1,147 @@
|
||||
---
|
||||
description: "Zmieniaj rozmiar, optymalizuj, zmieniaj prędkość, odwracaj, obracaj i wyodrębniaj klatki z animowanych plików GIF w jednym narzędziu."
|
||||
i18n_source_hash: 5e525e80db92
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 90168d0b887b
|
||||
---
|
||||
|
||||
# Narzędzia GIF {#gif-tools}
|
||||
|
||||
Zmieniaj rozmiar, optymalizuj, zmieniaj prędkość, odwracaj, wyodrębniaj klatki i obracaj animowane pliki GIF. Zapewnia wiele trybów działania w jednym narzędziu.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/gif-tools`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
### Wspólne parametry {#common-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| mode | string | Nie | `"resize"` | Tryb działania: `resize`, `optimize`, `speed`, `reverse`, `extract`, `rotate` |
|
||||
| loop | number | Nie | 0 | Liczba powtórzeń wyjściowego pliku GIF (0 = nieskończenie, 1-100 = skończona liczba pętli) |
|
||||
|
||||
### Parametry trybu zmiany rozmiaru {#resize-mode-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | Nie | - | Docelowa szerokość w pikselach (1 do 16384) |
|
||||
| height | integer | Nie | - | Docelowa wysokość w pikselach (1 do 16384) |
|
||||
| percentage | number | Nie | - | Skalowanie procentowe (1 do 500). Nadpisuje width/height, jeśli ustawione. |
|
||||
|
||||
### Parametry trybu optymalizacji {#optimize-mode-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| colors | number | Nie | 256 | Maksymalna liczba kolorów w palecie (2 do 256) |
|
||||
| dither | number | Nie | 1.0 | Siła ditheringu (0 do 1, gdzie 0 wyłącza dithering) |
|
||||
| effort | number | Nie | 7 | Poziom wysiłku optymalizacji (1 do 10, wyższy = wolniej, ale mniejszy) |
|
||||
|
||||
### Parametry trybu prędkości {#speed-mode-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| speedFactor | number | Nie | 1.0 | Mnożnik prędkości (0.1 do 10). Wartości > 1 przyspieszają, < 1 spowalniają. |
|
||||
|
||||
### Parametry trybu wyodrębniania {#extract-mode-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| extractMode | string | Nie | `"single"` | Tryb wyodrębniania: `single`, `range`, `all` |
|
||||
| frameNumber | number | Nie | 0 | Indeks klatki do wyodrębnienia w trybie `single` (od 0) |
|
||||
| frameStart | number | Nie | 0 | Indeks klatki początkowej dla trybu `range` (od 0) |
|
||||
| frameEnd | number | Nie | - | Indeks klatki końcowej dla trybu `range` (od 0, włącznie) |
|
||||
| extractFormat | string | Nie | `"png"` | Format wyodrębnionych klatek: `png`, `webp` |
|
||||
|
||||
### Parametry trybu obracania {#rotate-mode-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| angle | number | Nie | - | Kąt obrotu: `90`, `180` lub `270` stopni |
|
||||
| flipH | boolean | Nie | `false` | Odbij w poziomie |
|
||||
| flipV | boolean | Nie | `false` | Odbij w pionie |
|
||||
|
||||
## Przykładowe żądania {#example-requests}
|
||||
|
||||
### Zmiana rozmiaru {#resize}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools \
|
||||
-F "file=@animation.gif" \
|
||||
-F 'settings={"mode":"resize","percentage":50}'
|
||||
```
|
||||
|
||||
### Optymalizacja {#optimize}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools \
|
||||
-F "file=@large.gif" \
|
||||
-F 'settings={"mode":"optimize","colors":128,"effort":9}'
|
||||
```
|
||||
|
||||
### Przyspieszenie {#speed-up}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools \
|
||||
-F "file=@animation.gif" \
|
||||
-F 'settings={"mode":"speed","speedFactor":2.0}'
|
||||
```
|
||||
|
||||
### Wyodrębnienie pojedynczej klatki {#extract-single-frame}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools \
|
||||
-F "file=@animation.gif" \
|
||||
-F 'settings={"mode":"extract","extractMode":"single","frameNumber":5,"extractFormat":"png"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/animation.gif",
|
||||
"originalSize": 2345678,
|
||||
"processedSize": 1234567
|
||||
}
|
||||
```
|
||||
|
||||
## Podtrasa Info {#info-sub-route}
|
||||
|
||||
`POST /api/v1/tools/image/gif-tools/info`
|
||||
|
||||
Zwraca metadane o animowanym pliku GIF bez jego przetwarzania.
|
||||
|
||||
### Żądanie Info {#info-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools/info \
|
||||
-F "file=@animation.gif"
|
||||
```
|
||||
|
||||
### Odpowiedź Info {#info-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"width": 480,
|
||||
"height": 320,
|
||||
"pages": 24,
|
||||
"delay": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100],
|
||||
"loop": 0,
|
||||
"fileSize": 2345678,
|
||||
"duration": 2400
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wykorzystuje standardową fabrykę `createToolRoute` dla głównego punktu końcowego przetwarzania.
|
||||
- Punkt końcowy info wymaga jedynie przesłania pliku (nie są potrzebne żadne ustawienia).
|
||||
- W trybie `resize`, jeśli podano `percentage`, ma on priorytet nad `width`/`height`. Zmiana rozmiaru używa `fit: inside` w celu zachowania proporcji.
|
||||
- W trybie `speed` opóźnienia klatek są dzielone przez współczynnik prędkości. Minimalne opóźnienie na klatkę wynosi 20 ms (ograniczenie specyfikacji GIF).
|
||||
- W trybie `reverse` dostępny jest również parametr `speedFactor`, aby jednocześnie dostosować prędkość podczas odwracania.
|
||||
- W trybie `extract` z `range` lub `all` wynikiem jest plik ZIP zawierający poszczególne klatki.
|
||||
- W trybie `rotate` każda klatka jest przetwarzana indywidualnie i ponownie składana w animację.
|
||||
- Parametr `loop` kontroluje, ile razy wyjściowy plik GIF się zapętla. Użyj 0 dla nieskończonego zapętlania.
|
||||
- Pole `duration` w odpowiedzi info to całkowity czas trwania animacji w milisekundach.
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
description: "Konwertuj animowany GIF na WebP i odwrotnie, zachowując wszystkie klatki."
|
||||
i18n_source_hash: 20946e5001cb
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 716380fe088a
|
||||
---
|
||||
|
||||
# Konwerter GIF/WebP {#gif-webp-converter}
|
||||
|
||||
Konwertuj animowane pliki GIF na WebP i odwrotnie, zachowując wszystkie klatki i taktowanie animacji. Animacje WebP są zazwyczaj o 25-35% mniejsze niż równoważne pliki GIF.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/gif-webp`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem GIF lub WebP oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| quality | integer | Nie | `80` | Jakość wyjściowa dla kodowania WebP (1-100) |
|
||||
| lossless | boolean | Nie | `false` | Użyj bezstratnej kompresji WebP |
|
||||
| resizePercent | integer | Nie | `100` | Skaluj wynik procentowo (10-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-webp \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@animation.gif" \
|
||||
-F 'settings={"quality": 85, "resizePercent": 50}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/animation.webp",
|
||||
"originalSize": 3500000,
|
||||
"processedSize": 2200000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Akceptowane są tylko pliki `.gif` i `.webp`. Inne formaty obrazów nie są obsługiwane przez to narzędzie.
|
||||
- Kierunek konwersji jest automatyczny: wejście GIF daje wyjście WebP, a wejście WebP daje wyjście GIF.
|
||||
- Opcje `quality` i `lossless` mają zastosowanie tylko podczas kodowania do WebP. Podczas konwersji do GIF wynik używa standardowej palety GIF.
|
||||
- Użyj `resizePercent`, aby zmniejszyć wymiary (i rozmiar pliku) dużych animacji.
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: "Generuj wykres histogramu RGB ze statystykami dla poszczególnych kanałów z obrazu."
|
||||
i18n_source_hash: 57aa610206a5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 14ab115a148f
|
||||
---
|
||||
|
||||
# Histogram {#histogram}
|
||||
|
||||
Generuj wykres histogramu RGB z obrazu. Zwraca obraz histogramu w formacie PNG wraz ze statystykami dla poszczególnych kanałów oraz surowymi danymi histogramu z 256 przedziałami w odpowiedzi JSON.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/histogram`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| scale | string | Nie | `"linear"` | Skala osi Y: `linear` lub `log` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/histogram \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"scale": "linear"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/histogram.png",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 12000,
|
||||
"bins": {
|
||||
"r": [0, 12, 45, "... (256 values)"],
|
||||
"g": [0, 8, 38, "... (256 values)"],
|
||||
"b": [2, 15, 52, "... (256 values)"],
|
||||
"lum": [0, 10, 40, "... (256 values)"]
|
||||
},
|
||||
"stats": {
|
||||
"r": { "mean": 128, "median": 132, "stdev": 48.5 },
|
||||
"g": { "mean": 119, "median": 121, "stdev": 44.2 },
|
||||
"b": { "mean": 105, "median": 108, "stdev": 51.3 },
|
||||
"lum": { "mean": 118, "median": 120, "stdev": 45.1 }
|
||||
},
|
||||
"mean": { "r": 128, "g": 119, "b": 105 },
|
||||
"max": { "r": 4200, "g": 3800, "b": 4100 }
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- `downloadUrl` wskazuje na wyrenderowany wykres histogramu PNG pokazujący rozkłady R, G, B i luminancji.
|
||||
- `bins` zawiera surowe tablice 256 wartości dla każdego kanału (czerwony, zielony, niebieski, luminancja), przydatne do renderowania niestandardowych wizualizacji.
|
||||
- `stats` dostarcza średnią, medianę i odchylenie standardowe dla każdego kanału.
|
||||
- `mean` i `max` to zgodne wstecznie pola skrócone.
|
||||
- Użyj skali `log`, gdy histogram jest zdominowany przez kilka szczytów, a chcesz zobaczyć szczegóły w niższych przedziałach.
|
||||
- Wejścia HEIC, RAW, PSD i SVG są automatycznie dekodowane przed analizą.
|
||||
@@ -0,0 +1,81 @@
|
||||
---
|
||||
description: "Przechwytuj strony internetowe lub fragmenty HTML jako obrazy wysokiej jakości z emulacją urządzeń."
|
||||
i18n_source_hash: 1e49d070ea2e
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: bb38d8d464f0
|
||||
---
|
||||
|
||||
# HTML na obraz {#html-to-image}
|
||||
|
||||
Przechwyć adres URL strony internetowej lub surową zawartość HTML jako obraz zrzutu ekranu. Obsługuje emulację urządzeń (komputer stacjonarny, tablet, telefon), przechwytywanie całej strony i wiele formatów wyjściowych.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/html-to-image`
|
||||
|
||||
Przyjmuje **treść JSON** (nie multipart). Nie jest wymagane przesyłanie pliku.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| url | string | Warunkowo | - | Adres URL do przechwycenia (musi być prawidłowym adresem URL) |
|
||||
| html | string | Warunkowo | - | Surowa zawartość HTML do wyrenderowania (1 do 5 000 000 znaków) |
|
||||
| format | string | Nie | `"png"` | Format wyjściowy: `jpg`, `png`, `webp` |
|
||||
| quality | number | Nie | `90` | Jakość wyjściowa dla formatów stratnych (1 do 100) |
|
||||
| fullPage | boolean | Nie | `false` | Przechwyć całą przewijalną stronę, a nie tylko widoczny obszar |
|
||||
| devicePreset | string | Nie | `"desktop"` | Emulacja urządzenia: `desktop`, `tablet`, `mobile`, `custom` |
|
||||
| viewportWidth | number | Nie | `1280` | Niestandardowa szerokość widoku w pikselach (320 do 3840, używana gdy devicePreset to `custom`) |
|
||||
| viewportHeight | number | Nie | `720` | Niestandardowa wysokość widoku w pikselach (320 do 2160, używana gdy devicePreset to `custom`) |
|
||||
|
||||
Należy podać albo `url`, albo `html`, ale nie oba naraz.
|
||||
|
||||
### Presety urządzeń {#device-presets}
|
||||
|
||||
| Preset | Szerokość | Wysokość | Mobilny UA |
|
||||
|--------|-------|--------|-----------|
|
||||
| `desktop` | 1280 | 720 | Nie |
|
||||
| `tablet` | 768 | 1024 | Nie |
|
||||
| `mobile` | 375 | 812 | Tak |
|
||||
| `custom` | (określone przez użytkownika) | (określone przez użytkownika) | Nie |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Przechwyć stronę internetową:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/html-to-image \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"url": "https://example.com", "format": "png", "fullPage": true, "devicePreset": "desktop"}'
|
||||
```
|
||||
|
||||
Wyrenderuj zawartość HTML:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/html-to-image \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"html": "<div style=\"padding: 20px; background: #f0f0f0;\"><h1>Hello</h1></div>", "format": "png"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/screenshot.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 145000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania Chromium na serwerze. Zwraca HTTP 503, jeśli usługa przeglądarki jest niedostępna.
|
||||
- Adresy URL są walidowane pod kątem ataków SSRF (adresy sieci prywatnej/wewnętrznej są blokowane).
|
||||
- Ten punkt końcowy jest ograniczony do 120 żądań na godzinę.
|
||||
- `originalSize` zawsze wynosi 0, ponieważ to narzędzie generuje obrazy z adresów URL/HTML.
|
||||
- Nazwa pliku wyjściowego to `screenshot.<format>`.
|
||||
- Jeśli wczytanie strony trwa zbyt długo, żądanie zwraca HTTP 504 (przekroczenie limitu czasu bramy).
|
||||
- Jeśli usługa przeglądarki wielokrotnie ulega awarii, jest tymczasowo wyłączana i zwraca HTTP 503 z kodem `BROWSER_CRASHED`.
|
||||
@@ -0,0 +1,99 @@
|
||||
---
|
||||
description: "Automatyczne ulepszanie jednym kliknięciem, które analizuje obraz i koryguje ekspozycję, kontrast, balans bieli, nasycenie i ostrość."
|
||||
i18n_source_hash: 42b6ab956f91
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e8d464571edb
|
||||
---
|
||||
|
||||
# Ulepszanie obrazu {#image-enhancement}
|
||||
|
||||
Automatyczne ulepszanie jednym kliknięciem z inteligentną analizą. Analizuje obraz i stosuje korekcje ekspozycji, kontrastu, balansu bieli, nasycenia, ostrości i odszumiania.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-enhancement`
|
||||
|
||||
**Przetwarzanie:** Synchroniczne (używa fabryki `createToolRoute`, zwraca wynik bezpośrednio)
|
||||
|
||||
**Pakiet modelu:** Nie jest wymagany do podstawowego ulepszania. Pakiet `upscale-enhance` (5-6 GB) jest używany tylko wtedy, gdy włączone jest `deepEnhance` (do usuwania szumów AI za pomocą SCUNet).
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| mode | string | Nie | `"auto"` | Tryb ulepszania: `auto`, `portrait`, `landscape`, `low-light`, `food`, `document` |
|
||||
| intensity | number | Nie | `50` | Ogólna intensywność ulepszania (0-100) |
|
||||
| corrections | object | Nie | wszystkie `true` | Selektywne korekcje do zastosowania (patrz niżej) |
|
||||
| deepEnhance | boolean | Nie | `false` | Włącz usuwanie szumów wspomagane AI (wymaga zainstalowanego narzędzia `noise-removal`) |
|
||||
|
||||
### Obiekt corrections {#corrections-object}
|
||||
|
||||
| Pole | Typ | Domyślnie | Opis |
|
||||
|-------|------|---------|-------------|
|
||||
| exposure | boolean | `true` | Automatyczna korekcja ekspozycji |
|
||||
| contrast | boolean | `true` | Automatyczna korekcja kontrastu |
|
||||
| whiteBalance | boolean | `true` | Automatyczna korekcja balansu bieli |
|
||||
| saturation | boolean | `true` | Automatyczna korekcja nasycenia |
|
||||
| sharpness | boolean | `true` | Automatyczne wyostrzanie |
|
||||
| denoise | boolean | `true` | Lekkie odszumianie |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-enhancement \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"mode":"portrait","intensity":70,"corrections":{"exposure":true,"contrast":true,"sharpness":false}}'
|
||||
```
|
||||
|
||||
## Odpowiedź (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo.jpg",
|
||||
"originalSize": 300000,
|
||||
"processedSize": 310000
|
||||
}
|
||||
```
|
||||
|
||||
## Punkt końcowy Analyze {#analyze-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-enhancement/analyze`
|
||||
|
||||
Analizuje obraz i zwraca zalecenia korekcji bez ich stosowania.
|
||||
|
||||
### Parametry {#parameters-1}
|
||||
|
||||
| Parametr | Typ | Wymagany | Opis |
|
||||
|-----------|------|----------|-------------|
|
||||
| file | file | Tak | Plik obrazu (multipart) |
|
||||
|
||||
### Przykładowe żądanie {#example-request-1}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-enhancement/analyze \
|
||||
-F "file=@photo.jpg"
|
||||
```
|
||||
|
||||
### Odpowiedź (200 OK) {#response-200-ok-1}
|
||||
|
||||
```json
|
||||
{
|
||||
"corrections": {
|
||||
"exposure": { "value": 0.3, "direction": "brighten" },
|
||||
"contrast": { "value": 0.2, "direction": "increase" },
|
||||
"whiteBalance": { "value": 200, "direction": "warmer" },
|
||||
"saturation": { "value": 0.1, "direction": "increase" },
|
||||
"sharpness": { "value": 0.4, "direction": "sharpen" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie używa synchronicznej fabryki `createToolRoute`, więc zwraca standardową odpowiedź (nie 202 async).
|
||||
- Parametr `mode` dostosowuje sposób ważenia korekcji (np. tryb portretowy jest łagodniejszy dla odcieni skóry, tryb krajobrazowy zwiększa nasycenie).
|
||||
- Gdy `deepEnhance` jest włączone i narzędzie `noise-removal` (SCUNet) jest zainstalowane, po standardowych korekcjach stosowany jest dodatkowy przebieg odszumiania AI.
|
||||
- Punkt końcowy analyze jest przydatny do podglądu, jakie korekcje zostałyby zastosowane, przed ich zatwierdzeniem.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
description: "Dopełnij obraz do docelowych proporcji jednolitym kolorem, przezroczystym lub rozmytym tłem."
|
||||
i18n_source_hash: 796122da3dae
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 47d27ff89e89
|
||||
---
|
||||
|
||||
# Dopełnianie obrazu {#image-pad}
|
||||
|
||||
Dopełnij obraz do docelowych proporcji, dodając wokół niego jednolity kolor, przezroczyste lub rozmyte tło. Przydatne do dopasowywania obrazów do stałych proporcji dla mediów społecznościowych lub druku bez przycinania.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-pad`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| target | string | Nie | `"1:1"` | Docelowe proporcje: `16:9`, `9:16`, `1:1`, `4:3`, `3:4` lub `custom` |
|
||||
| ratioW | integer | Nie | `1` | Niestandardowa szerokość proporcji (1-100, używana gdy target to `custom`) |
|
||||
| ratioH | integer | Nie | `1` | Niestandardowa wysokość proporcji (1-100, używana gdy target to `custom`) |
|
||||
| background | string | Nie | `"color"` | Tryb tła: `color`, `transparent` lub `blur` |
|
||||
| color | string | Nie | `"#ffffff"` | Kolor tła w formacie hex (gdy background to `color`) |
|
||||
| padding | integer | Nie | `0` | Dodatkowy odstęp jako procent kanwy (0-50) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-pad \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"target": "16:9", "background": "blur", "padding": 5}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 3100000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Tryb tła `blur` tworzy rozmytą kopię oryginalnego obrazu jako wypełnienie dopełnienia, dając wizualnie spójny rezultat.
|
||||
- Podczas używania tła `transparent` wynik jest konwertowany na PNG w celu zachowania kanału alfa.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu, chyba że w grę wchodzi przezroczystość. Wejścia HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
- Ustaw `target` na `custom` i podaj `ratioW` oraz `ratioH` dla dowolnych proporcji (np. `ratioW: 3, ratioH: 2` dla 3:2).
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Konwertuj obrazy na identyfikatory URI danych Base64 do osadzania w HTML, CSS i innych."
|
||||
i18n_source_hash: ba4b8f3b4ece
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 4af7bf124f8d
|
||||
---
|
||||
|
||||
# Obraz na Base64 {#image-to-base64}
|
||||
|
||||
Konwertuj jeden lub więcej obrazów na ciągi zakodowane w Base64 i identyfikatory URI danych. Obsługuje opcjonalną konwersję formatu, kontrolę jakości i zmianę rozmiaru. Przydatne do osadzania obrazów bezpośrednio w HTML, CSS, JSON lub szablonach e-mail.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-to-base64`
|
||||
|
||||
Przyjmuje dane formularza multipart z jednym lub większą liczbą plików obrazów oraz opcjonalnym polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| outputFormat | string | Nie | `"original"` | Konwertuj przed zakodowaniem: `original`, `jpeg`, `png`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | Nie | `80` | Jakość wyjściowa dla formatów stratnych (1 do 100) |
|
||||
| maxWidth | number | Nie | `0` | Maksymalna szerokość w pikselach (0 = brak zmiany rozmiaru, nie powiększy) |
|
||||
| maxHeight | number | Nie | `0` | Maksymalna wysokość w pikselach (0 = brak zmiany rozmiaru, nie powiększy) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-to-base64 \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@icon.png" \
|
||||
-F 'settings={"outputFormat": "webp", "quality": 80, "maxWidth": 200}'
|
||||
```
|
||||
|
||||
Wiele plików:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-to-base64 \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@icon1.png" \
|
||||
-F "file=@icon2.png" \
|
||||
-F "file=@icon3.png" \
|
||||
-F 'settings={"outputFormat": "original"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"filename": "icon.png",
|
||||
"mimeType": "image/webp",
|
||||
"width": 200,
|
||||
"height": 200,
|
||||
"originalSize": 45000,
|
||||
"encodedSize": 28800,
|
||||
"overheadPercent": -36.0,
|
||||
"base64": "UklGRlYAAABXRUJQ...",
|
||||
"dataUri": "data:image/webp;base64,UklGRlYAAABXRUJQ..."
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
```
|
||||
|
||||
## Pola odpowiedzi {#response-fields}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| results | array | Pomyślnie przekonwertowane obrazy |
|
||||
| errors | array | Obrazy, których nie udało się przetworzyć (z nazwą pliku i komunikatem błędu) |
|
||||
|
||||
### Obiekt result {#result-object}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Oryginalna nazwa pliku |
|
||||
| mimeType | string | Typ MIME zakodowanego wyniku |
|
||||
| width | number | Końcowa szerokość w pikselach (po ewentualnej zmianie rozmiaru) |
|
||||
| height | number | Końcowa wysokość w pikselach (po ewentualnej zmianie rozmiaru) |
|
||||
| originalSize | number | Oryginalny rozmiar pliku w bajtach |
|
||||
| encodedSize | number | Rozmiar ciągu Base64 w bajtach |
|
||||
| overheadPercent | number | Procentowa różnica rozmiaru względem oryginału (dodatnia = większy, ujemna = mniejszy) |
|
||||
| base64 | string | Surowe dane obrazu zakodowane w Base64 |
|
||||
| dataUri | string | Kompletny identyfikator URI danych gotowy do użycia w atrybutach `src` |
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Kodowanie Base64 zazwyczaj zwiększa rozmiar o około 33% w porównaniu z plikiem binarnym. Pole `overheadPercent` pokazuje rzeczywistą różnicę.
|
||||
- Gdy `outputFormat` to `"original"`, pliki HEIC/HEIF są konwertowane na JPEG (ponieważ przeglądarki nie mogą wyświetlać HEIC w identyfikatorach URI danych).
|
||||
- Opcje `maxWidth` i `maxHeight` zmieniają rozmiar za pomocą `fit: inside` z `withoutEnlargement`, więc obrazy mniejsze niż podane wymiary nie są powiększane.
|
||||
- W jednym żądaniu można przetworzyć wiele plików. Każdy plik jest przetwarzany niezależnie, a niepowodzenia nie uniemożliwiają pomyślnego przetworzenia innych plików.
|
||||
- Pliki SVG są przepuszczane jako `image/svg+xml` bez ponownego kodowania (chyba że zażądano konwersji formatu).
|
||||
- To punkt końcowy tylko do odczytu. Nie tworzy pliku do pobrania ani `jobId`. Dane Base64 są zwracane bezpośrednio w treści odpowiedzi.
|
||||
@@ -0,0 +1,119 @@
|
||||
---
|
||||
description: "Połącz jeden lub więcej obrazów w dokument PDF z opcjami rozmiaru strony, orientacji i docelowego rozmiaru pliku."
|
||||
i18n_source_hash: f659c7e7f56b
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 990d14b7fce3
|
||||
---
|
||||
|
||||
# Obraz na PDF {#image-to-pdf}
|
||||
|
||||
Połącz jeden lub więcej obrazów w dokument PDF. Obsługuje wiele rozmiarów stron, orientacji, marginesów oraz opcjonalne ustawienie docelowego rozmiaru pliku poprzez regulację jakości.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-to-pdf`
|
||||
|
||||
Przyjmuje dane formularza multipart z jednym lub większą liczbą plików obrazów oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| pageSize | string | Nie | `"A4"` | Rozmiar strony: `A4`, `Letter`, `A3`, `A5` |
|
||||
| orientation | string | Nie | `"portrait"` | Orientacja strony: `portrait` lub `landscape` |
|
||||
| margin | number | Nie | `20` | Margines strony w punktach (0-500) |
|
||||
| targetSize | object | Nie | - | Ograniczenie docelowego rozmiaru pliku (patrz niżej) |
|
||||
| collate | boolean | Nie | `true` | Połącz wszystkie obrazy w jeden PDF. Jeśli `false`, tworzy jeden PDF na obraz. |
|
||||
|
||||
### Obiekt targetSize {#target-size-object}
|
||||
|
||||
| Pole | Typ | Wymagany | Opis |
|
||||
|-------|------|----------|-------------|
|
||||
| value | number | Tak | Wartość docelowego rozmiaru |
|
||||
| unit | string | Tak | Jednostka: `KB` lub `MB` |
|
||||
|
||||
Minimalny docelowy rozmiar to 50 KB.
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Podstawowy PDF z wieloma obrazami:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-to-pdf \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@page1.jpg" \
|
||||
-F "file=@page2.jpg" \
|
||||
-F "file=@page3.jpg" \
|
||||
-F 'settings={"pageSize": "A4", "orientation": "portrait", "margin": 20}'
|
||||
```
|
||||
|
||||
Z docelowym rozmiarem pliku:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-to-pdf \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@scan1.jpg" \
|
||||
-F "file=@scan2.jpg" \
|
||||
-F 'settings={"pageSize": "Letter", "targetSize": {"value": 2, "unit": "MB"}}'
|
||||
```
|
||||
|
||||
Jeden PDF na obraz:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-to-pdf \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo1.jpg" \
|
||||
-F "file=@photo2.jpg" \
|
||||
-F 'settings={"collate": false}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź (połączona) {#example-response-collated}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/images.pdf",
|
||||
"originalSize": 5000000,
|
||||
"processedSize": 1200000,
|
||||
"pages": 3
|
||||
}
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź (niepołączona) {#example-response-non-collated}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/images.zip",
|
||||
"originalSize": 5000000,
|
||||
"processedSize": 2400000,
|
||||
"pages": 2,
|
||||
"collated": false
|
||||
}
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź (z docelowym rozmiarem) {#example-response-with-target-size}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/images.pdf",
|
||||
"originalSize": 10000000,
|
||||
"processedSize": 2000000,
|
||||
"pages": 5,
|
||||
"compression": {
|
||||
"targetRequested": 2097152,
|
||||
"targetMet": true,
|
||||
"jpegQuality": 72
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Obrazy są wyśrodkowane na stronie i skalowane tak, aby zmieściły się w marginesach, zachowując proporcje. Obrazy nigdy nie są powiększane.
|
||||
- Gdy `collate` to `false`, każdy obraz staje się osobnym plikiem PDF, a plikiem do pobrania jest archiwum ZIP zawierające wszystkie pliki PDF.
|
||||
- Funkcja docelowego rozmiaru używa iteracyjnego wyszukiwania binarnego po poziomach jakości JPEG (10-95), aby znaleźć najlepszą jakość mieszczącą się w budżecie.
|
||||
- Przezroczyste obrazy są spłaszczane do bieli przed osadzeniem w PDF.
|
||||
- Obsługiwane formaty wejściowe: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC, RAW, PSD, SVG i inne.
|
||||
- Orientacja EXIF jest automatycznie stosowana przed osadzeniem.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
description: "Wyświetl szczegółowe metadane obrazu, właściwości i statystyki histogramu dla poszczególnych kanałów."
|
||||
i18n_source_hash: 8a0f7a0b0153
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ad7ebbe87780
|
||||
---
|
||||
|
||||
# Informacje o obrazie {#image-info}
|
||||
|
||||
Narzędzie analityczne tylko do odczytu, które zwraca kompleksowe metadane obrazu, w tym wymiary, format, przestrzeń kolorów, obecność EXIF/ICC/XMP oraz statystyki histogramu dla poszczególnych kanałów. Nie tworzy przetworzonego pliku wyjściowego.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/info`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu. Pole ustawień nie jest potrzebne.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
To narzędzie nie ma konfigurowalnych parametrów. Wystarczy przesłać plik obrazu.
|
||||
|
||||
| Pole | Typ | Wymagany | Opis |
|
||||
|-------|------|----------|-------------|
|
||||
| file | file | Tak | Obraz do analizy |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/info \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg"
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"filename": "photo.jpg",
|
||||
"fileSize": 2450000,
|
||||
"width": 4032,
|
||||
"height": 3024,
|
||||
"format": "jpeg",
|
||||
"channels": 3,
|
||||
"hasAlpha": false,
|
||||
"colorSpace": "srgb",
|
||||
"density": 72,
|
||||
"isProgressive": false,
|
||||
"orientation": 1,
|
||||
"hasProfile": true,
|
||||
"hasExif": true,
|
||||
"hasIcc": true,
|
||||
"hasXmp": false,
|
||||
"bitDepth": "8",
|
||||
"pages": 1,
|
||||
"histogram": [
|
||||
{ "channel": "red", "min": 0, "max": 255, "mean": 128.45, "stdev": 52.31 },
|
||||
{ "channel": "green", "min": 2, "max": 253, "mean": 115.22, "stdev": 48.76 },
|
||||
{ "channel": "blue", "min": 0, "max": 250, "mean": 102.89, "stdev": 55.14 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Pola odpowiedzi {#response-fields}
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Oczyszczona nazwa pliku |
|
||||
| fileSize | number | Rozmiar pliku w bajtach |
|
||||
| width | number | Szerokość obrazu w pikselach |
|
||||
| height | number | Wysokość obrazu w pikselach |
|
||||
| format | string | Wykryty format (jpeg, png, webp itd.) |
|
||||
| channels | number | Liczba kanałów kolorów |
|
||||
| hasAlpha | boolean | Czy obraz ma kanał alfa |
|
||||
| colorSpace | string | Przestrzeń kolorów (srgb, cmyk itd.) |
|
||||
| density | number lub null | Rozdzielczość DPI/PPI |
|
||||
| isProgressive | boolean | Czy JPEG używa kodowania progresywnego |
|
||||
| orientation | number lub null | Wartość orientacji EXIF (1-8) |
|
||||
| hasProfile | boolean | Czy osadzony jest profil ICC |
|
||||
| hasExif | boolean | Czy obecne są metadane EXIF |
|
||||
| hasIcc | boolean | Czy obecny jest profil kolorów ICC |
|
||||
| hasXmp | boolean | Czy obecne są metadane XMP |
|
||||
| bitDepth | string lub null | Bity na próbkę |
|
||||
| pages | number | Liczba stron (dla formatów wielostronicowych, takich jak TIFF, GIF) |
|
||||
| histogram | array | Statystyki dla poszczególnych kanałów (min, max, średnia, odchylenie standardowe) |
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To punkt końcowy tylko do odczytu. Nie tworzy pliku wyjściowego do pobrania ani `jobId`.
|
||||
- W przypadku obrazów w formacie RAW (DNG, CR2, NEF, ARW itd.) do wyodrębnienia rzeczywistych wymiarów sensora i flag metadanych, których Sharp nie potrafi odczytać bezpośrednio, używany jest ExifTool.
|
||||
- Pliki HEIC/HEIF są dekodowane wewnętrznie do PNG w celu wyodrębnienia statystyk pikseli, ponieważ Sharp nie potrafi dekodować pikseli HEVC.
|
||||
- Histogram dostarcza min/max/średnią/odchylenie standardowe na kanał, a nie pełny rozkład z 256 przedziałami.
|
||||
- Pole `density` odzwierciedla osadzone metadane DPI, jeśli są obecne.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Generuj maleńki symbol zastępczy obrazu niskiej jakości z identyfikatorem URI danych Base64."
|
||||
i18n_source_hash: f8a27c8021f5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 2fc223c7c2e9
|
||||
---
|
||||
|
||||
# Symbol zastępczy LQIP {#lqip-placeholder}
|
||||
|
||||
Generuj maleńki symbol zastępczy obrazu niskiej jakości (LQIP) z obrazu źródłowego. Zwraca mały plik symbolu zastępczego wraz z identyfikatorem URI danych Base64, gotowym do użycia znacznikiem HTML `<img>` oraz fragmentem CSS `background-image` do natychmiastowego osadzenia.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/lqip-placeholder`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu oraz polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | Nie | `16` | Docelowa szerokość w pikselach (4-64) |
|
||||
| blur | number | Nie | `2` | Promień rozmycia dla strategii rozmycia (0-20) |
|
||||
| strategy | string | Nie | `"blur"` | Strategia symbolu zastępczego: `blur`, `pixelate` lub `solid` |
|
||||
| format | string | Nie | `"webp"` | Format wyjściowy: `webp`, `png` lub `jpeg` |
|
||||
| quality | integer | Nie | `50` | Jakość wyjściowa (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/lqip-placeholder \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"width": 20, "strategy": "blur", "format": "webp"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.webp",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 280,
|
||||
"dataUri": "data:image/webp;base64,UklGR...",
|
||||
"width": 20,
|
||||
"height": 13,
|
||||
"bytes": 280,
|
||||
"strategy": "blur",
|
||||
"html": "<img src=\"data:image/webp;base64,UklGR...\" />",
|
||||
"css": "background-image:url('data:image/webp;base64,UklGR...');background-size:cover;background-position:center;"
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Pole `dataUri` zawiera kompletny identyfikator URI danych, gotowy do użycia w atrybutach `src` lub CSS bez żadnych dodatkowych żądań.
|
||||
- Pola `html` i `css` dostarczają fragmenty do skopiowania i wklejenia w typowych zastosowaniach.
|
||||
- Strategia `blur` tworzy miękką, rozmytą miniaturę. Strategia `pixelate` tworzy blokową mozaikę. Strategia `solid` zwraca pojedynczy uśredniony kolor.
|
||||
- Typowe rozmiary symboli zastępczych to 200-500 bajtów, co czyni je odpowiednimi do osadzania bezpośrednio w HTML.
|
||||
- Wysokość jest obliczana automatycznie, aby zachować proporcje obrazu źródłowego.
|
||||
- Wejścia HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
description: "Twórz memy z szablonów lub własnych obrazów, ze stylizowanymi polami tekstowymi i opcjami czcionek."
|
||||
i18n_source_hash: 0a4970112ca6
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 5641aa8f9ea3
|
||||
---
|
||||
|
||||
# Generator memów {#meme-generator}
|
||||
|
||||
Twórz memy przy użyciu wbudowanych szablonów lub własnych obrazów. Dodawaj tekst w klasycznej stylistyce memów (pogrubiony tekst z obrysem), z wieloma gotowymi układami i opcjami czcionek.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/meme-generator`
|
||||
|
||||
Przyjmuje jedno z dwóch:
|
||||
- **Dane formularza multipart** z plikiem obrazu i polem JSON `settings` (tryb własnego obrazu)
|
||||
- **Treść JSON** z `templateId` (tryb szablonu, bez potrzeby przesyłania pliku)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| templateId | string | Nie | - | ID wbudowanego szablonu memu. Jeśli podane, nie trzeba przesyłać obrazu |
|
||||
| textLayout | string | Nie | `"top-bottom"` | Układ pól tekstowych: `top-bottom`, `top-only`, `bottom-only`, `center`, `side-by-side` |
|
||||
| textBoxes | array | Nie | `[]` | Tablica obiektów pól tekstowych z polami `id` i `text` |
|
||||
| fontFamily | string | Nie | `"anton"` | Czcionka: `anton`, `arial-black`, `comic-sans`, `montserrat`, `bebas-neue`, `permanent-marker`, `roboto` |
|
||||
| fontSize | number | Nie | auto | Rozmiar czcionki w pikselach (8 do 200). Obliczany automatycznie, jeśli pominięty |
|
||||
| textColor | string | Nie | `"#ffffff"` | Kolor wypełnienia tekstu |
|
||||
| strokeColor | string | Nie | `"#000000"` | Kolor obrysu/konturu tekstu |
|
||||
| textAlign | string | Nie | `"center"` | Wyrównanie tekstu: `left`, `center`, `right` |
|
||||
| allCaps | boolean | Nie | `true` | Zamień tekst na wielkie litery |
|
||||
|
||||
### Pola tekstowe {#text-boxes}
|
||||
|
||||
Każdy wpis w tablicy `textBoxes` powinien mieć:
|
||||
|
||||
| Pole | Typ | Opis |
|
||||
|-------|------|-------------|
|
||||
| id | string | Identyfikator pola pasujący do układu (np. `"top"`, `"bottom"`, `"left"`, `"right"`, `"center"`) |
|
||||
| text | string | Tekst memu do wyświetlenia |
|
||||
|
||||
### Identyfikatory pól dla układów tekstu {#text-layout-box-ids}
|
||||
|
||||
| Układ | Dostępne ID pól |
|
||||
|--------|-------------------|
|
||||
| `top-bottom` | `top`, `bottom` |
|
||||
| `top-only` | `top` |
|
||||
| `bottom-only` | `bottom` |
|
||||
| `center` | `center` |
|
||||
| `side-by-side` | `left`, `right` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Własny obraz z tekstem u góry i u dołu:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/meme-generator \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"textLayout": "top-bottom", "textBoxes": [{"id": "top", "text": "When the code works"}, {"id": "bottom", "text": "On the first try"}], "fontFamily": "anton", "allCaps": true}'
|
||||
```
|
||||
|
||||
Z użyciem wbudowanego szablonu (treść JSON, bez przesyłania pliku):
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/meme-generator \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"templateId": "drake", "textBoxes": [{"id": "top", "text": "Manual testing"}, {"id": "bottom", "text": "Automated tests"}]}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/meme-drake.png",
|
||||
"originalSize": 450000,
|
||||
"processedSize": 520000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymagane jest podanie `templateId` albo przesłanego pliku obrazu. Podanie obu naraz spowoduje użycie szablonu.
|
||||
- Szablony definiują własne pozycje pól tekstowych; parametr `textLayout` jest ignorowany przy użyciu szablonów.
|
||||
- Tekst jest renderowany jako SVG z obrysem, aby uzyskać klasyczny wygląd memu.
|
||||
- Rozmiar czcionki jest obliczany automatycznie tak, aby zmieścić tekst w polu, jeśli nie został ustawiony jawnie.
|
||||
- Puste pola tekstowe są pomijane (renderowanie nie następuje, jeśli wszystkie pola są puste).
|
||||
- Nazwa pliku wynikowego zawiera ID szablonu przy jego użyciu (np. `meme-drake.png`).
|
||||
- Pliki wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: "Usuwanie szumu i ziarna wspomagane AI z wielopoziomowymi opcjami jakości."
|
||||
i18n_source_hash: f0dfc876e0e0
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 0845acd65ae1
|
||||
---
|
||||
|
||||
# Usuwanie szumu {#noise-removal}
|
||||
|
||||
Usuwanie szumu i ziarna wspomagane AI z wielopoziomowymi opcjami jakości, przy użyciu sidecara w Pythonie (model SCUNet).
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/noise-removal`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `upscale-enhance` (5-6 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| tier | string | Nie | `"balanced"` | Poziom jakości: `quick`, `balanced`, `quality`, `maximum` |
|
||||
| strength | number | Nie | `50` | Siła odszumiania (0-100) |
|
||||
| detailPreservation | number | Nie | `50` | Jak wiele szczegółów zachować (0-100). Wyższe wartości zachowują więcej tekstury |
|
||||
| colorNoise | number | Nie | `30` | Siła redukcji szumu barwnego (0-100) |
|
||||
| format | string | Nie | `"original"` | Format wyjściowy: `original`, `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | Nie | `90` | Jakość kodowania wyjścia (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/noise-removal \
|
||||
-F "file=@noisy-photo.jpg" \
|
||||
-F 'settings={"tier":"quality","strength":60,"detailPreservation":70,"colorNoise":40}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Denoising...","percent":65}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/noisy-photo_denoised.jpg",
|
||||
"originalSize": 500000,
|
||||
"processedSize": 380000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `upscale-enhance` (5-6 GB).
|
||||
- Poziomy jakości to kompromis między szybkością a jakością: `quick` jest najszybszy z podstawowym odszumianiem, `maximum` stosuje najbardziej dokładne podejście wieloprzebiegowe.
|
||||
- Parametr `detailPreservation` ma kluczowe znaczenie dla obiektów o teksturze (tkanina, włosy, listowie). Wyższe wartości zapobiegają wygładzaniu drobnych szczegółów przez algorytm odszumiania.
|
||||
- Gdy `format` ma wartość `"original"`, format wyjściowy odpowiada formatowi pliku wejściowego.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: "Wyodrębniaj tekst z obrazów za pomocą optycznego rozpoznawania znaków wspomaganego AI."
|
||||
i18n_source_hash: 3d85d423b82c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 41c5d748cf54
|
||||
---
|
||||
|
||||
# OCR / Wyodrębnianie tekstu {#ocr-text-extraction}
|
||||
|
||||
Wyodrębniaj tekst z obrazów za pomocą optycznego rozpoznawania znaków wspomaganego AI. Obsługuje wiele języków i poziomów jakości.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/ocr`
|
||||
|
||||
**Przetwarzanie:** Synchroniczna odpowiedź JSON. Jeśli podano `clientJobId`, postęp jest też raportowany przez SSE.
|
||||
|
||||
**Pakiet modeli:** `ocr` (5-6 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| quality | string | Nie | `"balanced"` | Poziom jakości: `fast` (Tesseract), `balanced` (PaddleOCR v5), `best` (PaddleOCR VL) |
|
||||
| language | string | Nie | `"auto"` | Podpowiedź językowa: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
|
||||
| enhance | boolean | Nie | `true` | Wstępnie przetwórz obraz dla lepszej dokładności OCR |
|
||||
| engine | string | Nie | - | Przestarzały. Użyj `quality`. Mapuje `tesseract` na `fast`, `paddleocr` na `balanced` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/ocr \
|
||||
-F "file=@document.png" \
|
||||
-F 'settings={"quality":"best","language":"en","enhance":true}'
|
||||
```
|
||||
|
||||
## Odpowiedź (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"filename": "document.png",
|
||||
"text": "Extracted text content from the image...",
|
||||
"engine": "paddleocr-vl"
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE, opcjonalnie) {#progress-sse-optional}
|
||||
|
||||
Jeśli podano pole formularza `clientJobId`, zdarzenia postępu są strumieniowane:
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Recognizing text...","percent":50}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `ocr` (5-6 GB).
|
||||
- OCR zwraca wyodrębniony tekst bezpośrednio, a nie adres URL do pobrania obrazu.
|
||||
- Używa łańcucha awaryjnego: jeśli poziom o wyższej jakości ulegnie awarii (np. segfault PaddleOCR), automatycznie ponawia próbę z kolejnym niższym poziomem.
|
||||
- Jeśli poziom zwróci pusty tekst bez awarii, również przełącza się na kolejny poziom.
|
||||
- Poziomy jakości mapują się na silniki: `fast` = Tesseract, `balanced` = PaddleOCR v5, `best` = PaddleOCR VL.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,74 @@
|
||||
---
|
||||
description: "Optymalizuj obrazy do publikacji w sieci z konwersją formatu, kontrolą jakości, zmianą rozmiaru i usuwaniem metadanych."
|
||||
i18n_source_hash: c327bbbce768
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 5e9a8ae5d62a
|
||||
---
|
||||
|
||||
# Optymalizacja pod sieć {#optimize-for-web}
|
||||
|
||||
Optymalizuj obrazy do publikacji w sieci w jednym kroku. Łączy konwersję formatu, dostosowanie jakości, opcjonalną zmianę rozmiaru, kodowanie progresywne i usuwanie metadanych.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/optimize-for-web`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
Dostępny jest też punkt końcowy podglądu na żywo pod `POST /api/v1/tools/image/optimize-for-web/preview`, który zwraca przetworzony obraz bezpośrednio jako dane binarne (bez tworzenia obszaru roboczego) na potrzeby strojenia parametrów w czasie rzeczywistym.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| format | string | Nie | `"webp"` | Format wyjściowy: `webp`, `jpeg`, `avif`, `png`, `jxl` |
|
||||
| quality | number | Nie | `80` | Jakość wyjścia (1-100) |
|
||||
| maxWidth | number | Nie | - | Maksymalna szerokość w pikselach. Obraz jest zmniejszany, jeśli jest szerszy. |
|
||||
| maxHeight | number | Nie | - | Maksymalna wysokość w pikselach. Obraz jest zmniejszany, jeśli jest wyższy. |
|
||||
| progressive | boolean | Nie | `true` | Włącz kodowanie progresywne/przeplatane |
|
||||
| stripMetadata | boolean | Nie | `true` | Usuń metadane EXIF, GPS, ICC i XMP |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/optimize-for-web \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"format": "webp", "quality": 75, "maxWidth": 1920}'
|
||||
```
|
||||
|
||||
Optymalizacja do AVIF z agresywną kompresją:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/optimize-for-web \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"format": "avif", "quality": 50, "maxWidth": 1200, "maxHeight": 800}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.webp",
|
||||
"originalSize": 4500000,
|
||||
"processedSize": 320000
|
||||
}
|
||||
```
|
||||
|
||||
### Odpowiedź punktu końcowego podglądu {#preview-endpoint-response}
|
||||
|
||||
Punkt końcowy podglądu (`/api/v1/tools/image/optimize-for-web/preview`) zwraca obraz binarny bezpośrednio wraz z nagłówkami informacyjnymi:
|
||||
|
||||
- `X-Original-Size` - Rozmiar oryginalnego pliku w bajtach
|
||||
- `X-Processed-Size` - Rozmiar przetworzonego pliku w bajtach
|
||||
- `X-Output-Filename` - Nazwa pliku wynikowego zakodowana w URL
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie jest zaprojektowane jako kompleksowy potok optymalizacji zasobów sieciowych. Obsługuje konwersję formatu, strojenie jakości, ograniczanie maksymalnych wymiarów i usuwanie metadanych w jednym przebiegu.
|
||||
- Rozszerzenie nazwy pliku wynikowego jest aktualizowane, aby pasowało do wybranego formatu.
|
||||
- Kodowanie JXL (JPEG XL) używa wyspecjalizowanego kodera CLI. Obraz jest najpierw przetwarzany jako PNG, a następnie kodowany do JXL.
|
||||
- Kodowanie progresywne poprawia postrzegany czas ładowania dla JPEG i PNG, umożliwiając przeglądarkom wyświetlenie podglądu niskiej jakości przed pełnym załadowaniem obrazu.
|
||||
- Punkt końcowy podglądu jest lżejszy (bez tworzenia obszaru roboczego/zadania) i jest przeznaczony do interfejsu strojenia parametrów na żywo we frontendzie.
|
||||
@@ -0,0 +1,173 @@
|
||||
---
|
||||
description: "Generator zdjęć paszportowych i do dokumentów wspomagany AI z wykrywaniem twarzy, usuwaniem tła i układaniem na arkuszu do druku."
|
||||
i18n_source_hash: d4b4f4ced988
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e7771c6de920
|
||||
---
|
||||
|
||||
# Zdjęcie paszportowe {#passport-photo}
|
||||
|
||||
Generator zdjęć paszportowych i do dokumentów wspomagany AI. Dwuetapowy przepływ pracy: analiza (wykrywanie twarzy + usuwanie tła), a następnie generowanie (kadrowanie, zmiana rozmiaru i układanie do druku).
|
||||
|
||||
## Punkty końcowe API {#api-endpoints}
|
||||
|
||||
To narzędzie używa dwuetapowego przepływu z osobnymi punktami końcowymi do analizy i generowania.
|
||||
|
||||
**Pakiety modeli:** `background-removal` i `face-detection`
|
||||
|
||||
---
|
||||
|
||||
### Etap 1: Analiza {#phase-1-analyze}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo/analyze`
|
||||
|
||||
Wykrywa punkty charakterystyczne twarzy i usuwa tło. Zwraca dane punktów charakterystycznych oraz podgląd, aby frontend mógł wyświetlić podgląd kadrowania.
|
||||
|
||||
#### Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| clientJobId | string | Nie | - | Opcjonalne ID zadania do śledzenia postępu przez SSE |
|
||||
|
||||
#### Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/passport-photo/analyze \
|
||||
-F "file=@headshot.jpg"
|
||||
```
|
||||
|
||||
#### Odpowiedź (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"filename": "headshot.jpg",
|
||||
"preview": "<base64-encoded PNG>",
|
||||
"previewWidth": 800,
|
||||
"previewHeight": 1067,
|
||||
"landmarks": {
|
||||
"leftEye": { "x": 0.42, "y": 0.35 },
|
||||
"rightEye": { "x": 0.58, "y": 0.35 },
|
||||
"eyeCenter": { "x": 0.50, "y": 0.35 },
|
||||
"chin": { "x": 0.50, "y": 0.65 },
|
||||
"forehead": { "x": 0.50, "y": 0.22 },
|
||||
"crown": { "x": 0.50, "y": 0.18 },
|
||||
"nose": { "x": 0.50, "y": 0.48 },
|
||||
"faceCenterX": 0.50
|
||||
},
|
||||
"imageWidth": 2400,
|
||||
"imageHeight": 3200
|
||||
}
|
||||
```
|
||||
|
||||
#### Postęp (SSE, opcjonalnie) {#progress-sse-optional}
|
||||
|
||||
Jeśli podano `clientJobId`, postęp jest strumieniowany (0-30% dla wykrywania twarzy, 30-95% dla usuwania tła).
|
||||
|
||||
#### Błąd: Nie wykryto twarzy (422) {#error-no-face-detected-422}
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "No face detected",
|
||||
"details": "Could not detect a face in the uploaded image. Please upload a clear, front-facing photo with good lighting."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Etap 2: Generowanie {#phase-2-generate}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo/generate`
|
||||
|
||||
Kadruje, zmienia rozmiar i opcjonalnie układa zdjęcie na arkuszu do druku. Korzysta z obrazów zapisanych w pamięci podręcznej z Etapu 1 (bez ponownego uruchamiania AI).
|
||||
|
||||
#### Parametry (treść JSON) {#parameters-json-body}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| jobId | string | Tak | - | ID zadania z Etapu 1 |
|
||||
| filename | string | Tak | - | Oryginalna nazwa pliku z Etapu 1 |
|
||||
| countryCode | string | Tak | - | Kod kraju dla specyfikacji paszportu (np. `US`, `GB`, `IN`) |
|
||||
| documentType | string | Nie | `"passport"` | Typ dokumentu (ze specyfikacji kraju) |
|
||||
| bgColor | string | Nie | `"#FFFFFF"` | Kolor tła w formacie hex |
|
||||
| printLayout | string | Nie | `"none"` | Układ papieru do druku: `none`, `4x6`, `a4` |
|
||||
| maxFileSizeKb | number | Nie | `0` | Ograniczenie maksymalnego rozmiaru pliku w KB (0 = bez limitu) |
|
||||
| dpi | number | Nie | `300` | DPI wyjścia (72-1200) |
|
||||
| customWidthMm | number | Nie | - | Własna szerokość zdjęcia w mm (nadpisuje specyfikację kraju) |
|
||||
| customHeightMm | number | Nie | - | Własna wysokość zdjęcia w mm (nadpisuje specyfikację kraju) |
|
||||
| zoom | number | Nie | `1` | Współczynnik przybliżenia (0.5-3). Wartości > 1 kadrują ciaśniej |
|
||||
| adjustX | number | Nie | `0` | Korekta położenia w poziomie |
|
||||
| adjustY | number | Nie | `0` | Korekta położenia w pionie |
|
||||
| landmarks | object | Tak | - | Obiekt punktów charakterystycznych z odpowiedzi Etapu 1 |
|
||||
| imageWidth | number | Tak | - | Szerokość obrazu z odpowiedzi Etapu 1 |
|
||||
| imageHeight | number | Tak | - | Wysokość obrazu z odpowiedzi Etapu 1 |
|
||||
|
||||
#### Przykładowe żądanie {#example-request-1}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/passport-photo/generate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"jobId": "a1b2c3d4-...",
|
||||
"filename": "headshot.jpg",
|
||||
"countryCode": "US",
|
||||
"documentType": "passport",
|
||||
"bgColor": "#FFFFFF",
|
||||
"printLayout": "4x6",
|
||||
"dpi": 300,
|
||||
"zoom": 1,
|
||||
"adjustX": 0,
|
||||
"adjustY": 0,
|
||||
"landmarks": { "leftEye": {"x":0.42,"y":0.35}, "rightEye": {"x":0.58,"y":0.35}, "eyeCenter": {"x":0.50,"y":0.35}, "chin": {"x":0.50,"y":0.65}, "forehead": {"x":0.50,"y":0.22}, "crown": {"x":0.50,"y":0.18}, "nose": {"x":0.50,"y":0.48}, "faceCenterX": 0.50 },
|
||||
"imageWidth": 2400,
|
||||
"imageHeight": 3200
|
||||
}'
|
||||
```
|
||||
|
||||
#### Odpowiedź (200 OK) {#response-200-ok-1}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/headshot_passport.jpg",
|
||||
"dimensions": {
|
||||
"widthMm": 51,
|
||||
"heightMm": 51,
|
||||
"widthPx": 602,
|
||||
"heightPx": 602,
|
||||
"dpi": 300
|
||||
},
|
||||
"spec": {
|
||||
"country": "United States",
|
||||
"countryCode": "US",
|
||||
"documentType": "passport",
|
||||
"documentLabel": "Passport"
|
||||
},
|
||||
"printDownloadUrl": "/api/v1/download/{jobId}/headshot_passport_print_4x6.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Trasa bazowa {#base-route}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo`
|
||||
|
||||
Zwraca wskazówki, aby użyć właściwego podrzędnego punktu końcowego.
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "Use /api/v1/tools/image/passport-photo/analyze or /generate"
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietów modeli `background-removal` i `face-detection`.
|
||||
- Etap 1 uruchamia AI (punkty charakterystyczne twarzy + usuwanie tła) i zapisuje wyniki w pamięci podręcznej. Etap 2 to czysta manipulacja obrazem w Sharp (szybka, bez potrzeby AI).
|
||||
- Punkty charakterystyczne są zwracane jako współrzędne znormalizowane (zakres 0-1 względem wymiarów obrazu).
|
||||
- Pole `preview` w odpowiedzi analizy to zakodowany w base64 obraz PNG (maks. 800px szerokości) dla szybkiego wyświetlania.
|
||||
- Specyfikacje krajów obejmują wymiary dokumentu, proporcje wysokości głowy i pozycjonowanie linii oczu na podstawie oficjalnych wymagań dotyczących zdjęć paszportowych.
|
||||
- Opcja `printLayout` generuje arkusz z ułożonymi zdjęciami na papierze 4x6\" lub A4 z 2mm odstępami między zdjęciami.
|
||||
- Gdy ustawiono `maxFileSizeKb`, wynik jest iteracyjnie kompresowany, aby zmieścić się w limicie rozmiaru.
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
description: "Zastosuj efekt pikselizacji do całego obrazu lub wybranego obszaru."
|
||||
i18n_source_hash: a3ad29841f7b
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f098fbbfdcab
|
||||
---
|
||||
|
||||
# Pikselizacja {#pixelate}
|
||||
|
||||
Zastosuj efekt pikselizacji do całego obrazu lub wybranego prostokątnego obszaru. Przydatne do zasłaniania wrażliwej treści, takiej jak twarze, tablice rejestracyjne czy dane osobowe.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/pixelate`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| blockSize | integer | Nie | `12` | Rozmiar bloku pikseli (2-128); większe wartości dają grubszą pikselizację |
|
||||
| region | object | Nie | - | Ogranicz pikselizację do prostokąta (patrz poniżej) |
|
||||
|
||||
### Obiekt region {#region-object}
|
||||
|
||||
| Pole | Typ | Wymagane | Opis |
|
||||
|-------|------|----------|-------------|
|
||||
| left | integer | Tak | Przesunięcie od lewej w pikselach (>= 0) |
|
||||
| top | integer | Tak | Przesunięcie od góry w pikselach (>= 0) |
|
||||
| width | integer | Tak | Szerokość obszaru w pikselach (>= 1) |
|
||||
| height | integer | Tak | Wysokość obszaru w pikselach (>= 1) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Pikselizacja całego obrazu:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/pixelate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"blockSize": 20}'
|
||||
```
|
||||
|
||||
Pikselizacja wybranego obszaru:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/pixelate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"blockSize": 16, "region": {"left": 100, "top": 50, "width": 200, "height": 150}}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2380000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Gdy `region` jest pominięty, pikselizowany jest cały obraz.
|
||||
- Współrzędne obszaru są podawane w pikselach względem lewego górnego rogu obrazu. Obszar musi mieścić się w granicach obrazu.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Pliki wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
description: "Generuj kody QR z niestandardowymi kolorami i poziomami korekcji błędów."
|
||||
i18n_source_hash: 096ef4d90da5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d9030f17e1ca
|
||||
---
|
||||
|
||||
# Generator kodów QR {#qr-code-generator}
|
||||
|
||||
Generuj obrazy kodów QR z tekstu lub adresów URL z konfigurowalnym rozmiarem, poziomem korekcji błędów oraz niestandardowymi kolorami pierwszego planu i tła.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/qr-generate`
|
||||
|
||||
Przyjmuje **treść JSON** (nie multipart). Nie jest potrzebne przesyłanie pliku.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Tak | - | Treść do zakodowania w kodzie QR (od 1 do 2000 znaków) |
|
||||
| size | number | Nie | `400` | Szerokość/wysokość obrazu wynikowego w pikselach (100 do 10000) |
|
||||
| errorCorrection | string | Nie | `"M"` | Poziom korekcji błędów: `L` (7%), `M` (15%), `Q` (25%), `H` (30%) |
|
||||
| foreground | string | Nie | `"#000000"` | Kolor pierwszego planu/modułów kodu QR w hex (`#RRGGBB`) |
|
||||
| background | string | Nie | `"#FFFFFF"` | Kolor tła kodu QR w hex (`#RRGGBB`) |
|
||||
| logoDataUri | string | Nie | - | Obraz logo jako data URI (`data:image/png;base64,...` lub `data:image/jpeg;base64,...`, maks. 700 KB). Wyśrodkowany na kodzie QR na 22% jego rozmiaru. Wymusza korekcję błędów na `H` |
|
||||
|
||||
### Poziomy korekcji błędów {#error-correction-levels}
|
||||
|
||||
| Poziom | Odzyskiwanie | Zastosowanie |
|
||||
|-------|----------|----------|
|
||||
| `L` | ~7% | Maksymalna gęstość danych |
|
||||
| `M` | ~15% | Zrównoważony (domyślny) |
|
||||
| `Q` | ~25% | Dobry dla kodów drukowanych |
|
||||
| `H` | ~30% | Najlepszy dla kodów z nakładką logo |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/qr-generate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text": "https://snapotter.com", "size": 500, "errorCorrection": "H"}'
|
||||
```
|
||||
|
||||
Kod QR z marką i niestandardowymi kolorami:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/qr-generate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text": "Hello World", "size": 300, "foreground": "#1a365d", "background": "#f7fafc"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/qrcode.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 4520
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Ten punkt końcowy przyjmuje JSON, a nie dane formularza multipart, ponieważ nie jest potrzebne przesyłanie obrazu.
|
||||
- Wynikiem jest zawsze obraz PNG.
|
||||
- Nazwa pliku wynikowego to zawsze `qrcode.png`.
|
||||
- `originalSize` zawsze wynosi 0, ponieważ to narzędzie generuje obrazy od zera.
|
||||
- Wokół kodu QR uwzględniana jest 2-modułowa strefa cichej (margines).
|
||||
- Maksymalna długość tekstu to 2000 znaków. Rzeczywista pojemność zależy od poziomu korekcji błędów i kodowania znaków.
|
||||
- Wyższe poziomy korekcji błędów pozwalają, by kod QR pozostał skanowalny nawet przy częściowym zasłonięciu, ale zmniejszają pojemność danych.
|
||||
- Gdy podano `logoDataUri`, korekcja błędów jest automatycznie wymuszana na `H` (30%), aby kod QR pozostał skanowalny mimo zasłonięcia środka przez logo.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: "Wykrywanie i korekcja efektu czerwonych oczu spowodowanego lampą błyskową, wspomagane AI."
|
||||
i18n_source_hash: 647c6ff1ef7c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 1f5d29f39bb0
|
||||
---
|
||||
|
||||
# Usuwanie efektu czerwonych oczu {#red-eye-removal}
|
||||
|
||||
Wykrywanie i korekcja efektu czerwonych oczu spowodowanego lampą błyskową, wspomagane AI.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/red-eye-removal`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `face-detection` (200-300 MB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| sensitivity | number | Nie | `50` | Czułość wykrywania czerwonych oczu (0-100). Wyższe wartości wykrywają subtelniejszy efekt |
|
||||
| strength | number | Nie | `70` | Siła korekcji (0-100). Jak agresywnie neutralizować czerwień |
|
||||
| format | string | Nie | - | Format wyjściowy (opcjonalne nadpisanie) |
|
||||
| quality | number | Nie | `90` | Jakość wyjścia (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/red-eye-removal \
|
||||
-F "file=@flash-photo.jpg" \
|
||||
-F 'settings={"sensitivity":60,"strength":80}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Detecting red eyes...","percent":40}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/flash-photo_redeye_fixed.png",
|
||||
"originalSize": 280000,
|
||||
"processedSize": 290000,
|
||||
"facesDetected": 2,
|
||||
"eyesCorrected": 4
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `face-detection` (200-300 MB).
|
||||
- Najpierw wykrywa twarze, następnie lokalizuje obszary oczu w każdej twarzy, a na końcu identyfikuje i koryguje piksele czerwonych oczu.
|
||||
- Licznik `facesDetected` wskazuje, ile twarzy znaleziono; `eyesCorrected` to łączna liczba pojedynczych oczu, w których skorygowano efekt czerwonych oczu.
|
||||
- Wyjściem jest zawsze PNG dla maksymalnego zachowania jakości.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,136 @@
|
||||
---
|
||||
description: "Usuwanie tła wspomagane AI z opcjonalnymi efektami (rozmycie, cień, gradient, niestandardowe tło)."
|
||||
i18n_source_hash: 326a91284529
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: c66a3291299a
|
||||
---
|
||||
|
||||
# Usuwanie tła {#remove-background}
|
||||
|
||||
Usuwanie tła wspomagane AI z opcjonalnymi efektami (rozmycie, cień, gradient, niestandardowe tło).
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/remove-background`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `background-removal` (4-5 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| model | string | Nie | - | Wariant modelu AI do użycia |
|
||||
| backgroundType | string | Nie | `"transparent"` | Jedno z: `transparent`, `color`, `gradient`, `blur`, `image` |
|
||||
| backgroundColor | string | Nie | - | Kolor hex dla jednolitego tła |
|
||||
| gradientColor1 | string | Nie | - | Pierwszy kolor gradientu |
|
||||
| gradientColor2 | string | Nie | - | Drugi kolor gradientu |
|
||||
| gradientAngle | number | Nie | - | Kąt gradientu w stopniach |
|
||||
| blurEnabled | boolean | Nie | - | Włącz efekt rozmycia tła |
|
||||
| blurIntensity | number | Nie | - | Intensywność rozmycia (0-100) |
|
||||
| shadowEnabled | boolean | Nie | - | Włącz cień pod obiektem |
|
||||
| shadowOpacity | number | Nie | - | Krycie cienia (0-100) |
|
||||
| outputFormat | string | Nie | - | Format wyjściowy: `png`, `webp` lub `avif` |
|
||||
| edgeRefine | integer | Nie | - | Poziom wygładzania krawędzi (0-3) |
|
||||
| decontaminate | boolean | Nie | - | Usuń przenikanie koloru z krawędzi |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/remove-background \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"backgroundType":"transparent","edgeRefine":2,"outputFormat":"png"}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Removing background...","percent":50}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo_mask.png",
|
||||
"maskUrl": "/api/v1/download/{jobId}/photo_mask.png",
|
||||
"originalUrl": "/api/v1/download/{jobId}/photo_original.png",
|
||||
"originalSize": 245000,
|
||||
"processedSize": 180000,
|
||||
"filename": "photo.jpg",
|
||||
"model": "rembg"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Punkt końcowy efektów (Etap 2) {#effects-endpoint-phase-2}
|
||||
|
||||
`POST /api/v1/tools/image/remove-background/effects`
|
||||
|
||||
Ponownie stosuje efekty tła bez ponownego uruchamiania modelu AI. Korzysta z zapisanej w pamięci podręcznej maski i oryginału z Etapu 1.
|
||||
|
||||
### Parametry {#parameters-1}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| settings | JSON | Tak | - | JSON z ustawieniami efektów (patrz poniżej) |
|
||||
| backgroundImage | file | Nie | - | Niestandardowy obraz tła (gdy backgroundType to `image`) |
|
||||
|
||||
#### Pola JSON ustawień {#settings-json-fields}
|
||||
|
||||
| Pole | Typ | Wymagane | Opis |
|
||||
|-------|------|----------|-------------|
|
||||
| jobId | string | Tak | ID zadania z Etapu 1 |
|
||||
| filename | string | Tak | Oryginalna nazwa pliku z Etapu 1 |
|
||||
| backgroundType | string | Nie | `transparent`, `color`, `gradient`, `blur`, `image` |
|
||||
| backgroundColor | string | Nie | Kolor hex dla jednolitego tła |
|
||||
| gradientColor1 | string | Nie | Pierwszy kolor gradientu |
|
||||
| gradientColor2 | string | Nie | Drugi kolor gradientu |
|
||||
| gradientAngle | number | Nie | Kąt gradientu w stopniach |
|
||||
| blurEnabled | boolean | Nie | Włącz rozmycie tła |
|
||||
| blurIntensity | number | Nie | Intensywność rozmycia (0-100) |
|
||||
| shadowEnabled | boolean | Nie | Włącz cień |
|
||||
| shadowOpacity | number | Nie | Krycie cienia (0-100) |
|
||||
| outputFormat | string | Nie | `png`, `webp` lub `avif` |
|
||||
|
||||
### Przykładowe żądanie {#example-request-1}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/remove-background/effects \
|
||||
-F 'settings={"jobId":"a1b2c3d4-...","filename":"photo.jpg","backgroundType":"color","backgroundColor":"#FF5500","outputFormat":"png"}'
|
||||
```
|
||||
|
||||
### Odpowiedź (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo_nobg.png",
|
||||
"processedSize": 195000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `background-removal` (4-5 GB).
|
||||
- Etap 1 zapisuje w pamięci podręcznej przezroczystą maskę i oryginalny obraz, dzięki czemu Etap 2 (efekty) może natychmiast zastosować różne tła bez ponownego uruchamiania modelu AI.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
- Obrót EXIF jest automatycznie korygowany przed przetwarzaniem.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Zastąp określony kolor na obrazie innym kolorem lub uczyń go przezroczystym."
|
||||
i18n_source_hash: df55ac451ecb
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 738c3a5148df
|
||||
---
|
||||
|
||||
# Zamiana i inwersja koloru {#replace-invert-color}
|
||||
|
||||
Zastąp piksele pasujące do koloru źródłowego kolorem docelowym lub uczyń je przezroczystymi. Używa odległości euklidesowej w przestrzeni RGB z konfigurowalną tolerancją dla płynnego przejścia na granicach kolorów.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/replace-color`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| sourceColor | string | Nie | `"#FF0000"` | Kolor hex do znalezienia (format: `#RRGGBB`) |
|
||||
| targetColor | string | Nie | `"#00FF00"` | Kolor hex, na który zamienić (format: `#RRGGBB`) |
|
||||
| makeTransparent | boolean | Nie | `false` | Uczyń pasujące piksele przezroczystymi zamiast zamieniać na kolor docelowy |
|
||||
| tolerance | number | Nie | `30` | Tolerancja dopasowania koloru (0 do 255). Wyższe wartości dopasowują szerszy zakres podobnych kolorów |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/replace-color \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"sourceColor": "#FF0000", "targetColor": "#0000FF", "tolerance": 40}'
|
||||
```
|
||||
|
||||
Uczyń zielone tło przezroczystym:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/replace-color \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@greenscreen.png" \
|
||||
-F 'settings={"sourceColor": "#00FF00", "makeTransparent": true, "tolerance": 50}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.png",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2100000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Dopasowanie koloru używa odległości euklidesowej w przestrzeni RGB, skalowanej przez `tolerance * sqrt(3)`.
|
||||
- Mieszanie przy zamianie jest proporcjonalne do odległości koloru: piksele bliższe kolorowi źródłowemu otrzymują więcej koloru docelowego, tworząc płynne przejścia.
|
||||
- Gdy `makeTransparent` ma wartość `true`, wynik jest wymuszany na PNG (lub WebP/AVIF), jeśli format wejściowy nie obsługuje kanałów alfa (np. JPEG).
|
||||
- Tolerancja 0 dopasowuje tylko dokładny kolor źródłowy. Wyższe wartości (50+) dopasują szerszy zakres podobnych odcieni.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu, chyba że potrzebna jest przezroczystość, a format wejściowy nie obsługuje kanału alfa.
|
||||
@@ -0,0 +1,72 @@
|
||||
---
|
||||
description: "Zmieniaj rozmiar obrazów w pikselach, procentowo lub z trybami dopasowania."
|
||||
i18n_source_hash: 00d1bffa4d38
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d0de66d1ead7
|
||||
---
|
||||
|
||||
# Zmiana rozmiaru {#resize}
|
||||
|
||||
Zmieniaj rozmiar obrazów, podając dokładne wymiary w pikselach, procentowy współczynnik skali lub tryb dopasowania kontrolujący, jak obraz dostosowuje się do wymiarów docelowych.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/resize`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | Nie | - | Docelowa szerokość w pikselach (maks. 16383) |
|
||||
| height | integer | Nie | - | Docelowa wysokość w pikselach (maks. 16383) |
|
||||
| fit | string | Nie | `"contain"` | Jak obraz dopasowuje się do wymiarów: `contain`, `cover`, `fill`, `inside`, `outside` |
|
||||
| withoutEnlargement | boolean | Nie | `false` | Zapobiegaj powiększaniu, jeśli obraz jest mniejszy niż cel |
|
||||
| percentage | number | Nie | - | Skaluj procentowo (np. 50 dla połowy rozmiaru) |
|
||||
|
||||
Musi być podany przynajmniej jeden z: `width`, `height` lub `percentage`.
|
||||
|
||||
### Tryby dopasowania {#fit-modes}
|
||||
|
||||
- **contain** - Zmień rozmiar tak, aby zmieścić się w wymiarach, zachowując proporcje (może pozostawić puste miejsce)
|
||||
- **cover** - Zmień rozmiar tak, aby pokryć wymiary, zachowując proporcje (może kadrować)
|
||||
- **fill** - Rozciągnij dokładnie do wymiarów (ignoruje proporcje)
|
||||
- **inside** - Jak `contain`, ale tylko zmniejsza, nigdy nie powiększa
|
||||
- **outside** - Jak `cover`, ale tylko zmniejsza, nigdy nie powiększa
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/resize \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"width": 800, "height": 600, "fit": "contain"}'
|
||||
```
|
||||
|
||||
Zmiana rozmiaru procentowa:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/resize \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"percentage": 50}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 980000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Maksymalny wymiar to 16383 piksele na każdej osi (limit Sharp/libvips).
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Pliki wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
- Orientacja EXIF jest automatycznie stosowana przed zmianą rozmiaru.
|
||||
- Flaga `withoutEnlargement` jest przydatna przy przetwarzaniu wsadowym, gdzie niektóre obrazy mogą już być mniejsze niż cel.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Napraw zarysowania, rozdarcia i uszkodzenia na starych zdjęciach za pomocą potoku AI do renowacji, poprawy twarzy i koloryzacji."
|
||||
i18n_source_hash: 3de13284216c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 317d701f3054
|
||||
---
|
||||
|
||||
# Renowacja zdjęć {#photo-restoration}
|
||||
|
||||
Napraw zarysowania, rozdarcia i uszkodzenia na starych zdjęciach za pomocą wieloetapowego potoku AI. Łączy naprawę zarysowań, poprawę twarzy, odszumianie i opcjonalną koloryzację.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/restore-photo`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `photo-restoration` (4-5 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| scratchRemoval | boolean | Nie | `true` | Usuń zarysowania i uszkodzenia powierzchni |
|
||||
| faceEnhancement | boolean | Nie | `true` | Popraw twarze na odrestaurowanym zdjęciu |
|
||||
| fidelity | number | Nie | `0.7` | Wierność poprawy twarzy (0-1). Wyższe wartości mocniej zachowują oryginalne rysy |
|
||||
| denoise | boolean | Nie | `true` | Zastosuj odszumianie do odrestaurowanego wyniku |
|
||||
| denoiseStrength | number | Nie | `25` | Siła odszumiania (0-100) |
|
||||
| colorize | boolean | Nie | `false` | Koloryzuj odrestaurowane zdjęcie (dla obrazów w skali szarości) |
|
||||
| colorizeStrength | number | Nie | `85` | Intensywność koloryzacji (0-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/restore-photo \
|
||||
-F "file=@damaged-old-photo.jpg" \
|
||||
-F 'settings={"scratchRemoval":true,"faceEnhancement":true,"fidelity":0.6,"colorize":true}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Odpowiedź początkowa (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Removing scratches...","percent":30}
|
||||
```
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Enhancing faces...","percent":60}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/damaged-old-photo_restored.jpg",
|
||||
"previewUrl": "/api/v1/download/{jobId}/preview.webp",
|
||||
"originalSize": 200000,
|
||||
"processedSize": 350000,
|
||||
"width": 1200,
|
||||
"height": 900,
|
||||
"steps": ["scratch_removal", "face_enhancement", "denoise", "colorize"],
|
||||
"scratchCoverage": 12.5,
|
||||
"facesEnhanced": 2,
|
||||
"isGrayscale": true,
|
||||
"colorized": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `photo-restoration` (4-5 GB).
|
||||
- Potok uruchamia wiele kroków AI kolejno: naprawa zarysowań, poprawa twarzy (GFPGAN), odszumianie i opcjonalnie koloryzacja.
|
||||
- Tablica `steps` w wyniku pokazuje, które kroki przetwarzania zostały faktycznie wykonane.
|
||||
- `scratchCoverage` to szacowany procent powierzchni obrazu, który miał uszkodzenia zarysowaniami.
|
||||
- `fidelity` kontroluje, jak mocno twarze są poprawiane w stosunku do zachowania oryginalnego wyglądu. Niższe wartości dają bardziej agresywną poprawę; wyższe wartości są bardziej zachowawcze.
|
||||
- Opcja `colorize` automatycznie wykrywa, czy obraz jest w skali szarości. Flaga `isGrayscale` w wyniku potwierdza to wykrycie.
|
||||
- Format wyjściowy odpowiada automatycznie formatowi wejściowemu.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR, HDR i AVIF poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
description: "Obracaj obrazy o dowolny kąt i odbijaj je w poziomie lub pionie."
|
||||
i18n_source_hash: af2581d7cd8d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 4e6c302679f5
|
||||
---
|
||||
|
||||
# Obrót i odbicie {#rotate-flip}
|
||||
|
||||
Obracaj obrazy o dowolny kąt i/lub odbijaj je w poziomie lub pionie. Operacje obrotu i odbicia można łączyć w jednym żądaniu.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/rotate`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| angle | number | Nie | `0` | Kąt obrotu w stopniach (zgodnie z ruchem wskazówek zegara). Przyjmuje dowolną wartość liczbową. |
|
||||
| horizontal | boolean | Nie | `false` | Odbij obraz w poziomie (lustrzane odbicie) |
|
||||
| vertical | boolean | Nie | `false` | Odbij obraz w pionie |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Obrót o 90 stopni zgodnie z ruchem wskazówek zegara:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/rotate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"angle": 90}'
|
||||
```
|
||||
|
||||
Odbicie w poziomie:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/rotate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"horizontal": true}'
|
||||
```
|
||||
|
||||
Obrót i odbicie razem:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/rotate \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"angle": 45, "vertical": true}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2480000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Najpierw stosowany jest obrót, potem operacje odbicia.
|
||||
- Obroty inne niż o 90 stopni (np. 45 stopni) powiększą płótno, aby zmieścić obrócony obraz, z wypełnieniem przezroczystym lub czarnym zależnie od formatu wyjściowego.
|
||||
- Typowe wartości: 90, 180, 270 dla obrotów o ćwierć obrotu.
|
||||
- Orientacja EXIF jest automatycznie stosowana przed przetwarzaniem, więc obrót jest względny do orientacji wizualnej.
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
description: "Wyostrzaj obrazy metodami adaptacyjną, maski wyostrzającej lub filtra górnoprzepustowego z opcjonalną redukcją szumów."
|
||||
i18n_source_hash: ccb60af9faae
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 6d8a1b16e180
|
||||
---
|
||||
|
||||
# Wyostrzanie {#sharpening}
|
||||
|
||||
Zaawansowane narzędzie do wyostrzania z trzema metodami: adaptacyjną (inteligentne rozpoznawanie krawędzi), maską wyostrzającą (klasyczny promień/siła) oraz filtrem górnoprzepustowym (uwydatnienie tekstury). Zawiera wbudowaną redukcję szumów, aby zapobiec powstawaniu artefaktów wyostrzania.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/sharpening`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| method | string | Nie | `"adaptive"` | Algorytm wyostrzania: `adaptive`, `unsharp-mask`, `high-pass` |
|
||||
| sigma | number | Nie | `1.0` | Adaptacyjny: sigma Gaussa (0.5 do 10) |
|
||||
| m1 | number | Nie | `1.0` | Adaptacyjny: wyostrzanie obszarów gładkich (0 do 10) |
|
||||
| m2 | number | Nie | `3.0` | Adaptacyjny: wyostrzanie obszarów postrzępionych (0 do 20) |
|
||||
| x1 | number | Nie | `2.0` | Adaptacyjny: próg gładki/postrzępiony (0 do 10) |
|
||||
| y2 | number | Nie | `12` | Adaptacyjny: maksymalne wyostrzanie obszarów gładkich (0 do 50) |
|
||||
| y3 | number | Nie | `20` | Adaptacyjny: maksymalne wyostrzanie obszarów postrzępionych (0 do 50) |
|
||||
| amount | number | Nie | `100` | Maska wyostrzająca: siła wyostrzania (0 do 1000) |
|
||||
| radius | number | Nie | `1.0` | Maska wyostrzająca: promień rozmycia w pikselach (0.1 do 5) |
|
||||
| threshold | number | Nie | `0` | Maska wyostrzająca: minimalna różnica jasności do wyostrzenia (0 do 255) |
|
||||
| strength | number | Nie | `50` | Filtr górnoprzepustowy: siła filtra (0 do 100) |
|
||||
| kernelSize | number | Nie | `3` | Filtr górnoprzepustowy: rozmiar jądra splotu (3 lub 5) |
|
||||
| denoise | string | Nie | `"off"` | Redukcja szumów przed wyostrzaniem: `off`, `light`, `medium`, `strong` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/sharpening \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"method": "adaptive", "sigma": 1.5}'
|
||||
```
|
||||
|
||||
Maska wyostrzająca z progiem chroniącym gładkie obszary:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/sharpening \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"method": "unsharp-mask", "amount": 150, "radius": 1.5, "threshold": 10}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2510000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Używane są tylko parametry właściwe dla wybranej metody. Na przykład `amount`, `radius` i `threshold` są ignorowane, gdy `method` ma wartość `adaptive`.
|
||||
- Metoda adaptacyjna korzysta z wbudowanego w Sharp wyostrzania adaptacyjnego z konfigurowalnym zachowaniem dla obszarów gładkich/postrzępionych.
|
||||
- Opcja `denoise` stosuje redukcję szumów przed wyostrzaniem, aby zapobiec wzmocnieniu szumu/ziarna.
|
||||
- Wyostrzanie filtrem górnoprzepustowym wydobywa drobne detale, odejmując rozmytą wersję od oryginału, a następnie łącząc ją z powrotem.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Kadrowanie uwzględniające obiekt, twarze i entropię, które inteligentnie komponuje obrazy przy użyciu Sharp i wykrywania twarzy przez AI."
|
||||
i18n_source_hash: acbe1439c6d8
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: cad4c61cd50b
|
||||
---
|
||||
|
||||
# Inteligentne kadrowanie {#smart-crop}
|
||||
|
||||
Inteligentne kadrowanie uwzględniające obiekt, twarze lub przycinanie tła. Wykorzystuje strategie uwagi/entropii Sharp oraz wykrywanie twarzy przez AI do inteligentnej kompozycji.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/smart-crop`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `face-detection` (200-300 MB) - wymagany tylko dla trybu `face`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| mode | string | Nie | `"subject"` | Tryb kadrowania: `subject`, `face`, `trim`. (Starsze wartości `attention` i `content` są mapowane na `subject` i `trim`) |
|
||||
| strategy | string | Nie | `"attention"` | Strategia dla trybu obiektu: `attention` lub `entropy` |
|
||||
| width | integer | Nie | - | Docelowa szerokość w pikselach |
|
||||
| height | integer | Nie | - | Docelowa wysokość w pikselach |
|
||||
| padding | integer | Nie | `0` | Procent marginesu wokół obiektu (0-50) |
|
||||
| facePreset | string | Nie | `"head-shoulders"` | Ustawienie kadrowania twarzy: `closeup`, `head-shoulders`, `upper-body`, `half-body` |
|
||||
| sensitivity | number | Nie | `0.5` | Czułość wykrywania twarzy (0-1) |
|
||||
| threshold | integer | Nie | `30` | Próg trybu przycinania dla wykrywania tła (0-255) |
|
||||
| padToSquare | boolean | Nie | `false` | Uzupełnij przycięty wynik do kwadratu |
|
||||
| padColor | string | Nie | `"#ffffff"` | Kolor tła dla uzupełnienia |
|
||||
| targetSize | integer | Nie | - | Docelowy rozmiar uzupełnionego wyniku (piksele) |
|
||||
| quality | integer | Nie | - | Jakość wyjściowa (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/smart-crop \
|
||||
-F "file=@portrait.jpg" \
|
||||
-F 'settings={"mode":"face","width":1080,"height":1080,"facePreset":"head-shoulders"}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Wstępna odpowiedź (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","percent":50}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/portrait_smartcrop.jpg",
|
||||
"originalSize": 500000,
|
||||
"processedSize": 320000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Tryby {#modes}
|
||||
|
||||
### Tryb obiektu {#subject-mode}
|
||||
Wykorzystuje strategię uwagi lub entropii Sharp, aby znaleźć najbardziej interesujący wizualnie obszar i kadruje wokół niego.
|
||||
|
||||
### Tryb twarzy {#face-mode}
|
||||
Wykrywa twarze za pomocą AI, a następnie komponuje kadr wokół wykrytych twarzy przy użyciu określonego `facePreset`. Wraca do trybu obiektu (strategia uwagi), jeśli nie wykryto żadnych twarzy.
|
||||
|
||||
### Tryb przycinania {#trim-mode}
|
||||
Usuwa jednolite obramowania/tło z obrazu. Opcjonalnie uzupełnia wynik do kwadratu o określonym kolorze tła i rozmiarze docelowym.
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- To narzędzie używa fabryki `createToolRoute` z `executionHint: "long"`, więc zwraca 202 z postępem przez SSE.
|
||||
- Tryb twarzy wymaga pakietu modeli `face-detection` (200-300 MB).
|
||||
- Tryby obiektu i przycinania działają bez żadnego pakietu modeli AI.
|
||||
- `facePreset` określa, jak ciasno kadr obejmuje wykryte twarze: `closeup` jest najciaśniejszy, a `half-body` najszerszy.
|
||||
- Jeśli nie określono szerokości/wysokości, domyślnie przyjmuje 1080x1080.
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
description: "Podziel jeden obraz na kafelki siatki według wierszy i kolumn lub według rozmiaru w pikselach, zwracane jako archiwum ZIP."
|
||||
i18n_source_hash: 57a2e11e7cce
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: fe0c6f88ea40
|
||||
---
|
||||
|
||||
# Dzielenie obrazu {#image-splitting}
|
||||
|
||||
Podziel pojedynczy obraz na kafelki siatki według liczby kolumn/wierszy lub według konkretnych wymiarów w pikselach. Zwraca archiwum ZIP zawierające wszystkie kafelki.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/split`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| columns | integer | Nie | 3 | Liczba kolumn do podziału (1 do 100) |
|
||||
| rows | integer | Nie | 3 | Liczba wierszy do podziału (1 do 100) |
|
||||
| tileWidth | integer | Nie | - | Szerokość kafelka w pikselach (min 10). Zastępuje `columns`, gdy ustawione są jednocześnie `tileWidth` i `tileHeight`. |
|
||||
| tileHeight | integer | Nie | - | Wysokość kafelka w pikselach (min 10). Zastępuje `rows`, gdy ustawione są jednocześnie `tileWidth` i `tileHeight`. |
|
||||
| outputFormat | string | Nie | `"original"` | Format wyjściowy kafelków: `original`, `png`, `jpg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | Nie | 90 | Jakość wyjściowa dla formatów stratnych (1 do 100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/split \
|
||||
-F "file=@large-image.png" \
|
||||
-F 'settings={"columns":3,"rows":3,"outputFormat":"png"}' \
|
||||
--output split-tiles.zip
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
Odpowiedź jest przesyłana strumieniowo bezpośrednio jako plik ZIP z `Content-Type: application/zip`. Nazwa pliku ma format `split-<jobId>.zip`.
|
||||
|
||||
Każdy kafelek wewnątrz ZIP jest nazwany `<originalBaseName>_r<row>_c<col>.<ext>` (np. `photo_r1_c1.png`, `photo_r2_c3.webp`).
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Przyjmuje pojedynczy plik obrazu.
|
||||
- Obsługuje formaty wejściowe HEIC, RAW, PSD i SVG (automatycznie dekodowane).
|
||||
- Gdy podane są jednocześnie `tileWidth` i `tileHeight`, mają one priorytet nad `columns`/`rows`. Wymiary siatki są obliczane jako `ceil(imageWidth / tileWidth)` i `ceil(imageHeight / tileHeight)`.
|
||||
- Kafelki brzegowe (najbardziej wysunięta w prawo kolumna, dolny wiersz) mogą być mniejsze niż określony rozmiar kafelka, jeśli wymiary obrazu nie dzielą się równo.
|
||||
- Maksymalny rozmiar siatki jest ograniczony do 100x100 (10 000 kafelków).
|
||||
- Odpowiedź przesyła ZIP strumieniowo bezpośrednio, więc nie ma treści odpowiedzi JSON. Użyj `--output` z curl, aby zapisać plik.
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
description: "Połącz wiele obrazów w jedną siatkę arkusza sprite'ów z metadanymi klatek."
|
||||
i18n_source_hash: 1938d7fb100d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 20696c236b46
|
||||
---
|
||||
|
||||
# Arkusz sprite'ów {#sprite-sheet}
|
||||
|
||||
Połącz wiele obrazów w jedną siatkę arkusza sprite'ów. Każdy obraz jest skalowany, aby dopasować się do wymiarów pierwszego obrazu, i umieszczany w siatce. Zwraca obraz arkusza sprite'ów wraz z metadanymi współrzędnych dla każdej klatki.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/sprite-sheet`
|
||||
|
||||
Przyjmuje dane formularza multipart z dwoma lub więcej plikami obrazów i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| columns | integer | Nie | `4` | Liczba kolumn w siatce (1-16) |
|
||||
| padding | integer | Nie | `0` | Odstęp między komórkami w pikselach (0-64) |
|
||||
| background | string | Nie | `"#ffffff"` | Kolor tła w formacie hex |
|
||||
| format | string | Nie | `"png"` | Format wyjściowy: `png`, `webp` lub `jpeg` |
|
||||
| quality | integer | Nie | `90` | Jakość wyjściowa (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/sprite-sheet \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@frame1.png" \
|
||||
-F "file=@frame2.png" \
|
||||
-F "file=@frame3.png" \
|
||||
-F "file=@frame4.png" \
|
||||
-F 'settings={"columns": 2, "padding": 4, "format": "png"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/sprite-sheet.png",
|
||||
"originalSize": 120000,
|
||||
"processedSize": 95000,
|
||||
"frames": [
|
||||
{ "index": 0, "left": 0, "top": 0, "width": 128, "height": 128 },
|
||||
{ "index": 1, "left": 132, "top": 0, "width": 128, "height": 128 },
|
||||
{ "index": 2, "left": 0, "top": 132, "width": 128, "height": 128 },
|
||||
{ "index": 3, "left": 132, "top": 132, "width": 128, "height": 128 }
|
||||
],
|
||||
"cols": 2,
|
||||
"rows": 2,
|
||||
"cellWidth": 128,
|
||||
"cellHeight": 128,
|
||||
"canvasWidth": 260,
|
||||
"canvasHeight": 260
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Przyjmuje od 2 do 64 obrazów. Wszystkie obrazy są skalowane, aby dopasować się do wymiarów pierwszego przesłanego obrazu.
|
||||
- Tablica `frames` podaje dokładne współrzędne pikselowe każdej klatki w wyniku, odpowiednie do definicji sprite'ów CSS lub map klatek silników gier.
|
||||
- Liczba wierszy jest obliczana automatycznie na podstawie liczby obrazów i wartości `columns`.
|
||||
- Użyj parametru `padding`, aby dodać odstęp między komórkami. Kolor `background` jest widoczny w obszarach odstępów oraz we wszelkich pustych końcowych komórkach.
|
||||
- Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
description: "Łącz obrazy obok siebie, jeden nad drugim lub w siatce, z kontrolą wyrównania, odstępów, obramowań i trybu skalowania."
|
||||
i18n_source_hash: 39333210505a
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 74ff73169fd0
|
||||
---
|
||||
|
||||
# Łączenie / Scalanie {#stitch-combine}
|
||||
|
||||
Łącz wiele obrazów obok siebie, ułożonych pionowo lub rozmieszczonych w siatce. Obsługuje wyrównanie, odstępy, obramowanie, zaokrąglenie narożników i wiele trybów skalowania.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/stitch`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| direction | string | Nie | `"horizontal"` | Kierunek układu: `horizontal`, `vertical`, `grid` |
|
||||
| gridColumns | integer | Nie | 2 | Liczba kolumn, gdy kierunek to `grid` (2 do 100) |
|
||||
| resizeMode | string | Nie | `"fit"` | Sposób skalowania obrazów: `fit`, `original`, `stretch`, `crop` |
|
||||
| alignment | string | Nie | `"center"` | Wyrównanie w poprzek osi: `start`, `center`, `end` |
|
||||
| gap | number | Nie | 0 | Odstęp między obrazami w pikselach (0 do 1000) |
|
||||
| border | number | Nie | 0 | Szerokość zewnętrznego obramowania w pikselach (0 do 500) |
|
||||
| cornerRadius | number | Nie | 0 | Zaokrąglenie narożników zastosowane do końcowego wyniku (0 do 500) |
|
||||
| backgroundColor | string | Nie | `"#FFFFFF"` | Kolor tła/obramowania w formacie hex (np. `#FF0000`) |
|
||||
| format | string | Nie | `"png"` | Format wyjściowy: `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | Nie | 90 | Jakość wyjściowa (1 do 100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/stitch \
|
||||
-F "file=@image1.png" \
|
||||
-F "file=@image2.png" \
|
||||
-F "file=@image3.png" \
|
||||
-F 'settings={"direction":"horizontal","resizeMode":"fit","gap":10,"backgroundColor":"#FFFFFF","format":"png"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/stitch.png",
|
||||
"originalSize": 1234567,
|
||||
"processedSize": 987654
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga co najmniej 2 obrazów. Prześlij wiele plików obrazów w żądaniu multipart.
|
||||
- Obsługuje formaty wejściowe HEIC, RAW, PSD i SVG (automatycznie dekodowane).
|
||||
- Tryby skalowania:
|
||||
- `fit` - Skaluje obrazy tak, aby dopasować się do najmniejszego wymiaru wzdłuż osi łączenia.
|
||||
- `original` - Zachowuje oryginalne rozmiary (może dawać nierówne krawędzie).
|
||||
- `stretch` - Wymusza dopasowanie obrazów do najmniejszego wymiaru bez zachowania proporcji.
|
||||
- `crop` - Kadruje obrazy metodą cover, aby dopasować się do najmniejszego wymiaru.
|
||||
- W trybie `grid` komórki są skalowane do median wymiarów wszystkich obrazów.
|
||||
- `cornerRadius` jest stosowane do całego końcowego wyniku, a nie do poszczególnych obrazów.
|
||||
- Rozmiar płótna jest ograniczony konfiguracją serwera `MAX_CANVAS_PIXELS`, aby zapobiec wyczerpaniu pamięci.
|
||||
@@ -0,0 +1,113 @@
|
||||
---
|
||||
description: "Usuń metadane EXIF, GPS, ICC i XMP z obrazów dla prywatności i mniejszego rozmiaru plików."
|
||||
i18n_source_hash: e89147734fd0
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e96a07138b5c
|
||||
---
|
||||
|
||||
# Usuwanie metadanych {#remove-metadata}
|
||||
|
||||
Usuń metadane EXIF, GPS, profile kolorów ICC oraz XMP z obrazów. Przydatne dla prywatności (usuwanie współrzędnych GPS, informacji o aparacie) oraz zmniejszania rozmiaru pliku.
|
||||
|
||||
## Punkty końcowe API {#api-endpoints}
|
||||
|
||||
### Usuwanie metadanych {#strip-metadata}
|
||||
|
||||
`POST /api/v1/tools/image/strip-metadata`
|
||||
|
||||
Przetwarza obraz i zwraca oczyszczoną wersję z usuniętymi wybranymi metadanymi.
|
||||
|
||||
### Inspekcja metadanych {#inspect-metadata}
|
||||
|
||||
`POST /api/v1/tools/image/strip-metadata/inspect`
|
||||
|
||||
Zwraca sparsowane metadane jako JSON bez modyfikowania obrazu. Przydatne do podglądu, jakie metadane istnieją, przed ich usunięciem.
|
||||
|
||||
## Parametry (Usuwanie) {#parameters-strip}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| stripExif | boolean | Nie | `false` | Usuń dane EXIF (ustawienia aparatu, daty itp.) |
|
||||
| stripGps | boolean | Nie | `false` | Usuń tylko dane GPS/lokalizacji |
|
||||
| stripIcc | boolean | Nie | `false` | Usuń profil kolorów ICC |
|
||||
| stripXmp | boolean | Nie | `false` | Usuń metadane XMP (Adobe, IPTC) |
|
||||
| stripAll | boolean | Nie | `true` | Usuń wszystkie metadane naraz |
|
||||
|
||||
Gdy `stripAll` ma wartość `true`, zastępuje ono poszczególne flagi i usuwa wszystko.
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
Usuń wszystkie metadane:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/strip-metadata \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"stripAll": true}'
|
||||
```
|
||||
|
||||
Usuń tylko dane GPS (zachowaj informacje o aparacie i profil kolorów):
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/strip-metadata \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"stripAll": false, "stripGps": true}'
|
||||
```
|
||||
|
||||
Sprawdź metadane bez modyfikowania:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/strip-metadata/inspect \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg"
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź (Usuwanie) {#example-response-strip}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2380000
|
||||
}
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź (Inspekcja) {#example-response-inspect}
|
||||
|
||||
```json
|
||||
{
|
||||
"filename": "photo.jpg",
|
||||
"fileSize": 2450000,
|
||||
"exif": {
|
||||
"Make": "Canon",
|
||||
"Model": "EOS R5",
|
||||
"DateTimeOriginal": "2024:03:15 14:30:00",
|
||||
"ExposureTime": "1/250",
|
||||
"FNumber": 2.8,
|
||||
"ISO": 400
|
||||
},
|
||||
"gps": {
|
||||
"GPSLatitudeRef": "N",
|
||||
"GPSLatitude": [37, 46, 30],
|
||||
"_latitude": 37.775,
|
||||
"_longitude": -122.4183
|
||||
},
|
||||
"icc": {
|
||||
"Profile Size": "3144 bytes",
|
||||
"Color Space": "RGB",
|
||||
"Description": "sRGB IEC61966-2.1"
|
||||
},
|
||||
"xmp": {
|
||||
"CreatorTool": "Adobe Photoshop 25.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Obraz jest ponownie kodowany w oryginalnym formacie po usunięciu metadanych. JPEG używa mozjpeg z jakością 90, PNG używa poziomu kompresji 9, WebP używa jakości 85.
|
||||
- Usunięcie profili ICC może powodować subtelne przesunięcia kolorów, jeśli obraz był oznaczony profilem innym niż sRGB. Użyj `stripIcc: false`, jeśli dokładność kolorów ma znaczenie.
|
||||
- Punkt końcowy inspekcji parsuje współrzędne GPS na dziesiętne wartości szerokości/długości geograficznej (poprzedzone podkreśleniem) dla wygody.
|
||||
- Obsługiwane formaty wejściowe: JPEG, PNG, WebP, AVIF, TIFF, GIF.
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description: "Konwertuj pliki SVG do PNG, JPEG, WebP, AVIF, TIFF, GIF, HEIF lub JXL w niestandardowej rozdzielczości i DPI, z obsługą przetwarzania wsadowego."
|
||||
i18n_source_hash: cf36830f8797
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f2c4302cb6d9
|
||||
---
|
||||
|
||||
# SVG do rastra {#svg-to-raster}
|
||||
|
||||
Konwertuj pliki SVG do rastrowych formatów obrazu (PNG, JPEG, WebP, AVIF, TIFF, GIF, HEIF lub JXL) w niestandardowej rozdzielczości i DPI. Obsługuje również konwersję wsadową wielu plików SVG.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/svg-to-raster`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | Nie | - | Docelowa szerokość w pikselach (1 do 65536). Zachowuje proporcje, jeśli ustawiono tylko jeden wymiar. |
|
||||
| height | integer | Nie | - | Docelowa wysokość w pikselach (1 do 65536). Zachowuje proporcje, jeśli ustawiono tylko jeden wymiar. |
|
||||
| dpi | integer | Nie | 300 | DPI renderowania, kontroluje bazową gęstość rasteryzacji (36 do 2400) |
|
||||
| quality | number | Nie | 90 | Jakość wyjściowa dla formatów stratnych (1 do 100) |
|
||||
| backgroundColor | string | Nie | `"#00000000"` | Kolor tła w formacie hex (6 lub 8 znaków, wersja 8-znakowa zawiera kanał alfa) |
|
||||
| outputFormat | string | Nie | `"png"` | Format wyjściowy: `png`, `jpg`, `webp`, `avif`, `tiff`, `gif`, `heif`, `jxl` |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/svg-to-raster \
|
||||
-F "file=@logo.svg" \
|
||||
-F 'settings={"width":1024,"dpi":300,"outputFormat":"png","backgroundColor":"#FFFFFF"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/logo.png",
|
||||
"previewUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/preview.webp",
|
||||
"originalSize": 12345,
|
||||
"processedSize": 67890
|
||||
}
|
||||
```
|
||||
|
||||
## Punkt końcowy przetwarzania wsadowego {#batch-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/svg-to-raster/batch`
|
||||
|
||||
Konwertuj wiele plików SVG w jednym żądaniu. Zwraca archiwum ZIP.
|
||||
|
||||
### Dodatkowe parametry wsadowe {#additional-batch-parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| clientJobId | string | Nie | - | Opcjonalny identyfikator zadania dostarczony przez klienta do śledzenia postępu (maks. 128 znaków) |
|
||||
|
||||
### Przykładowe żądanie wsadowe {#batch-example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/svg-to-raster/batch \
|
||||
-F "file=@icon1.svg" \
|
||||
-F "file=@icon2.svg" \
|
||||
-F "file=@icon3.svg" \
|
||||
-F 'settings={"width":512,"outputFormat":"png","dpi":150}'
|
||||
```
|
||||
|
||||
### Odpowiedź wsadowa {#batch-response}
|
||||
|
||||
Punkt końcowy przetwarzania wsadowego przesyła strumieniowo plik ZIP bezpośrednio z nagłówkami:
|
||||
- `Content-Type: application/zip`
|
||||
- `X-Job-Id: <jobId>`
|
||||
- `X-File-Results: <url-encoded JSON mapping of index to filename>`
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Przyjmuje wyłącznie pliki SVG i SVGZ (waliduje zawartość, nie tylko rozszerzenie). SVGZ jest automatycznie dekompresowany.
|
||||
- Zawartość SVG jest oczyszczana przed renderowaniem, aby zapobiec atakom XSS i ładowaniu zasobów zewnętrznych.
|
||||
- Ustawienie `dpi` kontroluje gęstość, z jaką SVG jest rasteryzowany. Wyższe DPI daje większe wymiary pikselowe z tego samego widoku SVG.
|
||||
- Gdy podane są jednocześnie `width` i `height`, obraz jest skalowany za pomocą `fit: inside` (zachowuje proporcje w granicach).
|
||||
- `previewUrl` jest dołączany do odpowiedzi dla formatów, których przeglądarki nie mogą natywnie wyświetlić (TIFF, HEIF). Podgląd to miniatura WebP o rozmiarze 1200px.
|
||||
- Domyślne tło `#00000000` jest całkowicie przezroczyste. Ustaw `#FFFFFF` dla białego tła (przydatne przy wyjściu JPEG, który nie obsługuje przezroczystości).
|
||||
- Przetwarzanie wsadowe respektuje konfigurację serwera `MAX_BATCH_SIZE` i wykorzystuje współbieżnych pracowników dla wydajności.
|
||||
- Postęp operacji wsadowych można śledzić przez SSE pod `/api/v1/jobs/:jobId/progress`.
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
description: "Dodawaj stylizowane nakładki tekstowe z cieniami i tłem w formie prostokąta."
|
||||
i18n_source_hash: 9f8e697188fc
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 76614f24d297
|
||||
---
|
||||
|
||||
# Nakładka tekstowa {#text-overlay}
|
||||
|
||||
Dodawaj stylizowany tekst do obrazów z opcjonalnym cieniem i półprzezroczystym prostokątnym tłem. Odpowiednie do tytułów, podpisów lub adnotacji na zdjęciach.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/text-overlay`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Tak | - | Tekst do nałożenia (1 do 500 znaków) |
|
||||
| fontSize | number | Nie | `48` | Rozmiar czcionki w pikselach (8 do 200) |
|
||||
| color | string | Nie | `"#FFFFFF"` | Kolor tekstu w formacie hex (`#RRGGBB`) |
|
||||
| position | string | Nie | `"bottom"` | Umieszczenie w pionie: `top`, `center`, `bottom` |
|
||||
| backgroundBox | boolean | Nie | `false` | Pokaż półprzezroczysty prostokąt tła za tekstem |
|
||||
| backgroundColor | string | Nie | `"#000000"` | Kolor prostokąta tła w formacie hex (`#RRGGBB`) |
|
||||
| shadow | boolean | Nie | `true` | Zastosuj cień za tekstem |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/text-overlay \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"text": "Hello World", "fontSize": 64, "color": "#FFFFFF", "position": "bottom", "shadow": true}'
|
||||
```
|
||||
|
||||
Z prostokątem tła:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/text-overlay \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"text": "Caption", "fontSize": 36, "position": "bottom", "backgroundBox": true, "backgroundColor": "#000000"}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2470000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Tekst jest zawsze wyśrodkowany poziomo w obrębie obrazu.
|
||||
- Cień używa przesunięcia 2px z rozmyciem 3px przy 70% nieprzezroczystości czerni.
|
||||
- Prostokąt tła obejmuje całą szerokość obrazu przy 70% nieprzezroczystości, a jego wysokość jest proporcjonalna do rozmiaru czcionki (1.8x).
|
||||
- Tekst jest renderowany przez kompozyt SVG, więc używana jest domyślna bezszeryfowa czcionka systemu.
|
||||
- Znaki specjalne XML w tekście są bezpiecznie escapowane.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
description: "Napraw fałszywie przezroczyste pliki PNG za pomocą mattingu AI (BiRefNet), aby uzyskać prawdziwy kanał alfa, plus czyszczenie krawędzi metodą defringe."
|
||||
i18n_source_hash: 7eb748b80f93
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e85aa5b620ef
|
||||
---
|
||||
|
||||
# Naprawianie przezroczystości PNG {#png-transparency-fixer}
|
||||
|
||||
Napraw fałszywie przezroczyste pliki PNG jednym kliknięciem. Wykorzystuje matting AI (model BiRefNet HR Matting), aby uzyskać prawdziwą przezroczystość alfa, z przetwarzaniem końcowym defringe do oczyszczania krawędzi.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/transparency-fixer`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `background-removal` (4-5 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| defringe | number | Nie | `30` | Intensywność defringe (0-100). Usuwa półprzezroczyste piksele obwódki wokół krawędzi |
|
||||
| outputFormat | string | Nie | `"png"` | Format wyjściowy: `png` lub `webp` |
|
||||
| removeWatermark | boolean | Nie | `false` | Zastosuj przetwarzanie wstępne usuwające znak wodny (filtr medianowy) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/transparency-fixer \
|
||||
-F "file=@fake-transparent.png" \
|
||||
-F 'settings={"defringe":40,"outputFormat":"png"}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Wstępna odpowiedź (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Processing transparency...","percent":50}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/fake-transparent_fixed.png",
|
||||
"originalSize": 180000,
|
||||
"processedSize": 150000,
|
||||
"filename": "fake-transparent.png"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `background-removal` (4-5 GB).
|
||||
- Używa `birefnet-hr-matting` jako podstawowego modelu do wysokiej jakości mattingu alfa. Wraca do `birefnet-general`, jeśli modelowi HR zabraknie pamięci.
|
||||
- Opcja `defringe` usuwa półprzezroczyste piksele obwódki, które matting AI czasem pozostawia wokół włosów, futra i drobnych krawędzi. Działa przez rozmycie kanału alfa i wyzerowanie pikseli o niskiej pewności.
|
||||
- Opcja `removeWatermark` stosuje krok przetwarzania wstępnego z filtrem medianowym. Jest to podstawowa redukcja znaku wodnego, a nie dedykowane narzędzie do jego usuwania.
|
||||
- Wyprowadza wyłącznie PNG lub bezstratny WebP (oba obsługują przezroczystość alfa).
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,83 @@
|
||||
---
|
||||
description: "Powiększaj obrazy od 2x do 4x za pomocą superrozdzielczości AI Real-ESRGAN, zachowując drobne detale."
|
||||
i18n_source_hash: 150032e99476
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e1778b4b5ecf
|
||||
---
|
||||
|
||||
# Powiększanie obrazu {#image-upscaling}
|
||||
|
||||
Ulepszanie za pomocą superrozdzielczości AI przy użyciu Real-ESRGAN. Powiększa obrazy 2x-4x, zachowując detale.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/upscale`
|
||||
|
||||
**Przetwarzanie:** Asynchroniczne (zwraca 202, odpytuj `/api/v1/jobs/{jobId}/progress` o status przez SSE)
|
||||
|
||||
**Pakiet modeli:** `upscale-enhance` (5-6 GB)
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Tak | - | Plik obrazu (multipart) |
|
||||
| scale | number | Nie | `2` | Współczynnik powiększenia (np. 2, 3, 4) |
|
||||
| model | string | Nie | `"auto"` | Model do użycia (np. `auto`, konkretne nazwy modeli) |
|
||||
| faceEnhance | boolean | Nie | `false` | Zastosuj poprawę twarzy podczas powiększania |
|
||||
| denoise | number | Nie | `0` | Siła odszumiania (0 = wyłączone) |
|
||||
| format | string | Nie | `"auto"` | Format wyjściowy: `auto`, `png`, `jpg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| quality | number | Nie | `95` | Jakość wyjściowa (1-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/upscale \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"scale":4,"model":"auto","faceEnhance":true,"format":"png"}'
|
||||
```
|
||||
|
||||
## Odpowiedź {#response}
|
||||
|
||||
### Wstępna odpowiedź (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Postęp (SSE pod `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Upscaling...","percent":60}
|
||||
```
|
||||
|
||||
### Wynik końcowy (przez SSE) {#final-result-via-sse}
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo_4x.png",
|
||||
"previewUrl": "/api/v1/download/{jobId}/preview.webp",
|
||||
"originalSize": 120000,
|
||||
"processedSize": 2400000,
|
||||
"width": 4096,
|
||||
"height": 4096,
|
||||
"method": "realesrgan-x4plus"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wymaga zainstalowania pakietu modeli `upscale-enhance` (5-6 GB).
|
||||
- Używa Real-ESRGAN, gdy jest dostępny; wraca do interpolacji Lanczosa, jeśli model AI jest niedostępny.
|
||||
- Opcja `faceEnhance` stosuje odtwarzanie twarzy GFPGAN podczas powiększania dla lepszej jakości twarzy.
|
||||
- Dla formatów wyjściowych, których przeglądarka nie może wyświetlić (HEIC, JXL, TIFF), generowany jest podgląd WebP obok głównego wyniku.
|
||||
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
description: "Konwertuj obrazy rastrowe do SVG z wektoryzacją czarno-białą (potrace) oraz pełnokolorową, wielowarstwową."
|
||||
i18n_source_hash: f3e4777188ad
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 9ebb92e9d5f9
|
||||
---
|
||||
|
||||
# Obraz do SVG {#image-to-svg}
|
||||
|
||||
Wektoryzuj obrazy rastrowe do SVG przy użyciu algorytmów śledzenia. Obsługuje śledzenie czarno-białe (potrace) oraz pełnokolorową wektoryzację wielowarstwową.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/vectorize`
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| colorMode | string | Nie | `"bw"` | Tryb śledzenia: `bw` (czarno-biały) lub `color` (wielokolorowe warstwy) |
|
||||
| threshold | number | Nie | 128 | Próg jasności dla trybu czarno-białego (0 do 255). Piksele poniżej stają się czarne. |
|
||||
| colorPrecision | number | Nie | 6 | Precyzja kwantyzacji kolorów dla trybu kolorowego (1 do 16). Wyższe wartości dają więcej odrębnych warstw kolorów. |
|
||||
| layerDifference | number | Nie | 6 | Minimalna różnica kolorów między warstwami w trybie kolorowym (1 do 128) |
|
||||
| filterSpeckle | number | Nie | 4 | Minimalna powierzchnia śledzonych kształtów w pikselach (1 do 256). Usuwa szum/plamki. |
|
||||
| pathMode | string | Nie | `"spline"` | Wygładzanie ścieżek: `none` (postrzępione), `polygon` (proste odcinki), `spline` (gładkie krzywe) |
|
||||
| cornerThreshold | number | Nie | 60 | Próg kąta dla wykrywania narożników w trybie kolorowym (0 do 180 stopni) |
|
||||
| invert | boolean | Nie | `false` | Odwróć obraz przed śledzeniem (zamień czarny/biały) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/vectorize \
|
||||
-F "file=@logo.png" \
|
||||
-F 'settings={"colorMode":"bw","threshold":128,"filterSpeckle":4,"pathMode":"spline"}'
|
||||
```
|
||||
|
||||
### Wektoryzacja kolorowa {#color-vectorization}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/vectorize \
|
||||
-F "file=@illustration.png" \
|
||||
-F 'settings={"colorMode":"color","colorPrecision":8,"layerDifference":6,"filterSpeckle":4}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/logo.svg",
|
||||
"originalSize": 45678,
|
||||
"processedSize": 12345
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Wynikiem jest zawsze plik SVG, niezależnie od formatu wejściowego.
|
||||
- Obsługuje formaty wejściowe HEIC, RAW, PSD i SVG (automatycznie dekodowane do rastra przed śledzeniem).
|
||||
- Tryb czarno-biały używa algorytmu potrace. Obraz jest najpierw konwertowany na skalę szarości, a następnie progowany do czystej czerni/bieli przed śledzeniem.
|
||||
- Tryb kolorowy stosuje podejście wielowarstwowe: obraz jest kwantyzowany na warstwy kolorów, z których każda jest śledzona osobno i układana w wyniku SVG.
|
||||
- Niższe wartości `filterSpeckle` zachowują więcej detali, ale dają większe pliki SVG z większą liczbą ścieżek.
|
||||
- Ustawienie `pathMode` znacząco wpływa na rozmiar pliku: `none` daje najwięcej ścieżek, `spline` daje najgładszy (i zwykle najmniejszy) wynik.
|
||||
- Dla najlepszych rezultatów z logo i ikonami użyj trybu czarno-białego z czystym, wysokokontrastowym wejściem. Dla zdjęć lub ilustracji użyj trybu kolorowego z wyższym `colorPrecision`.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
description: "Dodaj efekt winiety z regulowaną siłą, kolorem i pozycją."
|
||||
i18n_source_hash: 0b9795fea2eb
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 94c41fb69c7e
|
||||
---
|
||||
|
||||
# Winieta {#vignette}
|
||||
|
||||
Dodaj efekt winiety, który przyciemnia lub zabarwia krawędzie obrazu. Obsługuje regulowaną siłę, kolor, promień, miękkość, zaokrąglenie i pozycję środka.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/vignette`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| strength | number | Nie | `0.5` | Nieprzezroczystość winiety (0.1-1) |
|
||||
| color | string | Nie | `"#000000"` | Kolor winiety w formacie hex |
|
||||
| radius | integer | Nie | `70` | Promień zewnętrzny jako procent połowy przekątnej (0-100) |
|
||||
| softness | integer | Nie | `50` | Miękkość wtapiania (0-100); wyższe wartości dają bardziej stopniowe przejście |
|
||||
| roundness | integer | Nie | `100` | Kształt: 100 = koło, 0 = elipsa dopasowana do proporcji obrazu |
|
||||
| centerX | integer | Nie | `50` | Pozioma pozycja środka jako procent (0-100) |
|
||||
| centerY | integer | Nie | `50` | Pionowa pozycja środka jako procent (0-100) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/vignette \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"strength": 0.7, "radius": 60, "softness": 70}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2410000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Mniejszy `radius` przyciemnia większą część obrazu; większy promień ogranicza winietę do skrajnych krawędzi.
|
||||
- Użyj koloru `color` innego niż czarny (np. białego lub w tonach sepii) dla kreatywnych efektów winiety.
|
||||
- Regulacja `centerX` i `centerY` pozwala umieścić czysty obszar poza środkiem, co jest przydatne do skierowania uwagi na obiekt, który nie znajduje się na środku kadru.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
description: "Nałóż logo lub obraz jako znak wodny z konfigurowalną pozycją, nieprzezroczystością i skalą."
|
||||
i18n_source_hash: c73ab0ef8ab9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e20ea49a024c
|
||||
---
|
||||
|
||||
# Znak wodny z obrazu {#image-watermark}
|
||||
|
||||
Nałóż logo lub dodatkowy obraz jako znak wodny na obraz bazowy. Znak wodny jest skalowany względem szerokości obrazu bazowego i umieszczany w narożniku lub na środku.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/watermark-image`
|
||||
|
||||
Przyjmuje dane formularza multipart z **dwoma** plikami obrazów i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| position | string | Nie | `"bottom-right"` | Umieszczenie znaku wodnego: `center`, `top-left`, `top-right`, `bottom-left`, `bottom-right` |
|
||||
| opacity | number | Nie | `50` | Procent nieprzezroczystości znaku wodnego (0 do 100) |
|
||||
| scale | number | Nie | `25` | Szerokość znaku wodnego jako procent szerokości głównego obrazu (1 do 100) |
|
||||
|
||||
### Pola plików {#file-fields}
|
||||
|
||||
| Nazwa pola | Wymagany | Opis |
|
||||
|------------|----------|-------------|
|
||||
| file | Tak | Główny/bazowy obraz |
|
||||
| watermark | Tak | Obraz znaku wodnego/logo |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/watermark-image \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F "watermark=@logo.png" \
|
||||
-F 'settings={"position": "bottom-right", "opacity": 60, "scale": 20}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2520000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Oba obrazy są walidowane i dekodowane (obsługiwane HEIC, RAW, PSD, SVG).
|
||||
- Znak wodny jest skalowany proporcjonalnie tak, aby jego szerokość równała się `scale`% szerokości głównego obrazu.
|
||||
- Nieprzezroczystość jest stosowana przez maskę alfa złożoną z mieszaniem `dest-in`.
|
||||
- Pozycje narożne stosują margines 20px od krawędzi obrazu.
|
||||
- Jeśli obraz znaku wodnego ma przezroczystość (np. logo PNG), jest ona zachowywana podczas komponowania.
|
||||
- Orientacja EXIF jest automatycznie stosowana do obu obrazów przed przetwarzaniem.
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: "Dodawaj tekstowe znaki wodne z konfigurowalną pozycją, nieprzezroczystością, obrotem i kafelkowaniem."
|
||||
i18n_source_hash: b80f12f410e4
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 94060d4844a7
|
||||
---
|
||||
|
||||
# Tekstowy znak wodny {#text-watermark}
|
||||
|
||||
Dodaj nakładkę tekstowego znaku wodnego na obrazy. Obsługuje pojedyncze umieszczenie w narożnikach/na środku lub kafelkowe powtarzanie na całym obrazie, z konfigurowalnym rozmiarem czcionki, kolorem, nieprzezroczystością i obrotem.
|
||||
|
||||
## Punkt końcowy API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/watermark-text`
|
||||
|
||||
Przyjmuje dane formularza multipart z plikiem obrazu i polem JSON `settings`.
|
||||
|
||||
## Parametry {#parameters}
|
||||
|
||||
| Parametr | Typ | Wymagany | Domyślny | Opis |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Tak | - | Tekst znaku wodnego (1 do 500 znaków) |
|
||||
| fontSize | number | Nie | `48` | Rozmiar czcionki w pikselach (8 do 1000) |
|
||||
| color | string | Nie | `"#000000"` | Kolor tekstu w formacie hex (`#RRGGBB`) |
|
||||
| opacity | number | Nie | `50` | Procent nieprzezroczystości tekstu (0 do 100) |
|
||||
| position | string | Nie | `"center"` | Umieszczenie: `center`, `top-left`, `top-right`, `bottom-left`, `bottom-right`, `tiled` |
|
||||
| rotation | number | Nie | `0` | Kąt obrotu tekstu w stopniach (-360 do 360) |
|
||||
|
||||
## Przykładowe żądanie {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/watermark-text \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"text": "SAMPLE", "fontSize": 64, "opacity": 30, "position": "center", "rotation": -30}'
|
||||
```
|
||||
|
||||
Kafelkowy znak wodny na całym obrazie:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/watermark-text \
|
||||
-H "Authorization: Bearer si_your-api-key" \
|
||||
-F "file=@photo.jpg" \
|
||||
-F 'settings={"text": "DRAFT", "fontSize": 36, "opacity": 20, "position": "tiled", "rotation": -45}'
|
||||
```
|
||||
|
||||
## Przykładowa odpowiedź {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2480000
|
||||
}
|
||||
```
|
||||
|
||||
## Uwagi {#notes}
|
||||
|
||||
- Znak wodny jest renderowany jako tekst SVG i komponowany na obrazie, zachowując jakość wyjściową.
|
||||
- Tryb kafelkowy rozmieszcza elementy tekstu na podstawie rozmiaru czcionki (odstęp 6x w poziomie, 4x w pionie), z limitem maksymalnie 500 elementów.
|
||||
- Dla pozycji narożnych margines od krawędzi równa się rozmiarowi czcionki.
|
||||
- Używana czcionka to domyślna bezszeryfowa czcionka systemu.
|
||||
- Znaki specjalne XML w tekście (`&`, `<`, `>`, `"`, `'`) są bezpiecznie escapowane.
|
||||
- Format wyjściowy odpowiada formatowi wejściowemu. Dane wejściowe HEIC, RAW, PSD i SVG są automatycznie dekodowane przed przetwarzaniem.
|
||||
Reference in New Issue
Block a user