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: "Sesuaikan kecerahan, kontras, saturasi, temperatur, rona, kanal, dan terapkan efek warna."
|
||||
i18n_source_hash: 41b35fe5c2ba
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: bec12c2434ea
|
||||
---
|
||||
|
||||
# Sesuaikan Warna {#adjust-colors}
|
||||
|
||||
Alat penyesuaian warna komprehensif yang menggabungkan kecerahan, kontras, eksposur, saturasi, temperatur, tint, rotasi rona, level per kanal, dan efek sekali klik (grayscale, sepia, invert) dalam satu endpoint.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/adjust-colors`
|
||||
|
||||
Menerima data formulir multipart dengan berkas gambar dan bidang JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| brightness | number | Tidak | `0` | Penyesuaian kecerahan (-100 hingga 100) |
|
||||
| contrast | number | Tidak | `0` | Penyesuaian kontras (-100 hingga 100) |
|
||||
| exposure | number | Tidak | `0` | Eksposur / gamma midtone (-100 hingga 100) |
|
||||
| saturation | number | Tidak | `0` | Saturasi warna (-100 hingga 100) |
|
||||
| temperature | number | Tidak | `0` | Keseimbangan putih: dingin/biru hingga hangat/oranye (-100 hingga 100) |
|
||||
| tint | number | Tidak | `0` | Pergeseran tint: hijau hingga magenta (-100 hingga 100) |
|
||||
| hue | number | Tidak | `0` | Rotasi rona dalam derajat (-180 hingga 180) |
|
||||
| sharpness | number | Tidak | `0` | Kekuatan penajaman (0 hingga 100) |
|
||||
| red | number | Tidak | `100` | Level kanal merah (0 hingga 200, 100 = tidak berubah) |
|
||||
| green | number | Tidak | `100` | Level kanal hijau (0 hingga 200, 100 = tidak berubah) |
|
||||
| blue | number | Tidak | `100` | Level kanal biru (0 hingga 200, 100 = tidak berubah) |
|
||||
| effect | string | Tidak | `"none"` | Efek warna: `none`, `grayscale`, `sepia`, `invert` |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
Terapkan tampilan vintage hangat:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2380000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Semua parameter bernilai bawaan netral sehingga Anda dapat menyesuaikan hanya yang Anda perlukan.
|
||||
- Penyesuaian diterapkan dalam urutan ini: kecerahan, kontras, eksposur, saturasi/rona, temperatur/tint, penajaman, kanal, efek.
|
||||
- Temperatur menggunakan matriks rekombinasi warna 3x3 pada sumbu biru-oranye dan hijau-magenta.
|
||||
- Eksposur dipetakan ke fungsi gamma Sharp (positif mencerahkan midtone, negatif menggelapkannya).
|
||||
- Endpoint ini juga merespons pada jalur lama `/api/v1/tools/image/brightness-contrast`, `/api/v1/tools/image/saturation`, `/api/v1/tools/image/color-channels`, dan `/api/v1/tools/image/color-effects`. Semuanya menggunakan skema yang sama.
|
||||
- Format keluaran mengikuti format input. Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
@@ -0,0 +1,84 @@
|
||||
---
|
||||
description: "Perluas kanvas gambar dengan outpainting AI, memperluasnya ke segala arah dan mengisi area baru agar cocok dengan aslinya."
|
||||
i18n_source_hash: 1b00db4ed40d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: a15b402dd0a2
|
||||
---
|
||||
|
||||
# Perluas Kanvas AI {#ai-canvas-expand}
|
||||
|
||||
Perluas kanvas gambar dengan pengisian bertenaga AI (outpainting). Memperluas gambar ke segala arah dan mengisi area baru dengan konten yang dihasilkan AI yang cocok dengan gambar yang ada.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/ai-canvas-expand`
|
||||
|
||||
**Pemrosesan:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status melalui SSE)
|
||||
|
||||
**Bundel model:** `object-eraser-colorize` (1-2 GB)
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Ya | - | Berkas gambar (multipart) |
|
||||
| extendTop | integer | Tidak | `0` | Piksel untuk memperluas di bagian atas |
|
||||
| extendRight | integer | Tidak | `0` | Piksel untuk memperluas di bagian kanan |
|
||||
| extendBottom | integer | Tidak | `0` | Piksel untuk memperluas di bagian bawah |
|
||||
| extendLeft | integer | Tidak | `0` | Piksel untuk memperluas di bagian kiri |
|
||||
| tier | string | Tidak | `"balanced"` | Tingkat kualitas: `fast`, `balanced`, `high` |
|
||||
| format | string | Tidak | `"auto"` | Format keluaran: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| quality | integer | Tidak | `95` | Kualitas keluaran (1-100) |
|
||||
|
||||
Setidaknya satu arah perluasan harus lebih besar dari 0.
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
## Respons {#response}
|
||||
|
||||
### Respons Awal (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progres (SSE di `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Expanding canvas...","percent":50}
|
||||
```
|
||||
|
||||
### Hasil Akhir (melalui 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Memerlukan bundel model `object-eraser-colorize` untuk dipasang (1-2 GB).
|
||||
- Menggunakan outpainting berbasis LaMa untuk menghasilkan konten bagi wilayah yang diperluas.
|
||||
- Parameter `tier` menukar kecepatan dengan kualitas: `fast` menghasilkan hasil dengan cepat dengan kemungkinan artefak, `high` membutuhkan waktu lebih lama tetapi menghasilkan pengisian yang lebih halus dan koheren.
|
||||
- Nilai perluasan dalam piksel. Dimensi gambar akhir akan menjadi: lebar asli + extendLeft + extendRight kali tinggi asli + extendTop + extendBottom.
|
||||
- Untuk format keluaran yang tidak dapat dipratinjau di peramban (HEIC, JXL, TIFF), pratinjau WebP dihasilkan bersama keluaran utama.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui dekode otomatis.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
description: "Ganti latar belakang gambar dengan warna solid atau gradien menggunakan AI."
|
||||
i18n_source_hash: 930fe8890e55
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 1aa421bb864f
|
||||
---
|
||||
|
||||
# Ganti Latar Belakang {#background-replace}
|
||||
|
||||
Ganti latar belakang gambar dengan warna solid atau gradien. Model AI mendeteksi subjek, menghapus latar belakang asli, dan menggabungkan subjek ke latar belakang pilihan Anda.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/background-replace`
|
||||
|
||||
Menerima data formulir multipart dengan berkas gambar dan bidang JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| backgroundType | string | Tidak | `"color"` | Mode latar belakang: `color` atau `gradient` |
|
||||
| color | string | Tidak | `"#ffffff"` | Warna hex latar belakang (ketika backgroundType bernilai `color`) |
|
||||
| gradientColor1 | string | Tidak | - | Warna hex gradien pertama |
|
||||
| gradientColor2 | string | Tidak | - | Warna hex gradien kedua |
|
||||
| gradientAngle | integer | Tidak | `180` | Sudut gradien dalam derajat (0-360) |
|
||||
| feather | integer | Tidak | `0` | Radius pelunakan tepi (0-20) |
|
||||
| format | string | Tidak | `"png"` | Format keluaran: `png` atau `webp` |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
Lacak progres melalui SSE di `GET /api/v1/jobs/{jobId}/progress`. Ketika pekerjaan selesai, aliran SSE memancarkan peristiwa `completed` dengan URL unduhan.
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Ini adalah alat bertenaga AI yang mengembalikan `202 Accepted` dan memproses secara asinkron. Sambungkan ke endpoint SSE untuk menerima pembaruan progres dan hasil akhir.
|
||||
- Memerlukan bundel fitur **background-removal** untuk dipasang. Mengembalikan `501` jika bundel tidak tersedia.
|
||||
- Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
- Keluaran bawaan ke PNG untuk mempertahankan transparansi di sekitar subjek.
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
description: "Hasilkan barcode dalam format Code 128, EAN-13, UPC-A, Code 39, ITF-14, dan Data Matrix."
|
||||
i18n_source_hash: e84b1df40c7e
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e5c89973d5f0
|
||||
---
|
||||
|
||||
# Generator Barcode {#barcode-generator}
|
||||
|
||||
Hasilkan gambar barcode dari input teks. Mendukung format Code 128, EAN-13, UPC-A, Code 39, ITF-14, dan Data Matrix.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/barcode-generate`
|
||||
|
||||
Menerima body `application/json` (bukan multipart). Barcode dihasilkan dari teks yang diberikan, bukan dari berkas yang diunggah.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Ya | - | Teks untuk dienkode dalam barcode (1-256 karakter) |
|
||||
| type | string | Tidak | `"code128"` | Format barcode: `code128`, `ean13`, `upca`, `code39`, `itf14`, `datamatrix` |
|
||||
| scale | integer | Tidak | `3` | Faktor skala gambar (1-8) |
|
||||
| includeText | boolean | Tidak | `true` | Apakah akan merender teks di bawah barcode |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/barcode.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 4520
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Berbeda dari kebanyakan alat, endpoint ini menerima body JSON, bukan data formulir multipart, karena barcode dihasilkan dari teks alih-alih berkas yang diunggah.
|
||||
- EAN-13 memerlukan tepat 12 atau 13 digit. UPC-A memerlukan tepat 11 atau 12 digit. Jika digit cek dihilangkan, digit tersebut dihitung secara otomatis.
|
||||
- Code 128 adalah format paling fleksibel dan mendukung seluruh set karakter ASCII.
|
||||
- Data Matrix menghasilkan barcode 2D yang cocok untuk mengenkode string yang lebih panjang dalam persegi yang kompak.
|
||||
@@ -0,0 +1,97 @@
|
||||
---
|
||||
description: "Pindai gambar untuk kode QR, barcode, dan kode 2D dengan keluaran beranotasi."
|
||||
i18n_source_hash: 97c9d395c257
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 2bab3a516dd4
|
||||
---
|
||||
|
||||
# Pembaca Barcode {#barcode-reader}
|
||||
|
||||
Pindai gambar yang diunggah untuk semua jenis barcode dan kode QR. Mengembalikan teks yang didekode, jenis barcode, dan data posisi untuk setiap kode yang terdeteksi. Juga menghasilkan gambar beranotasi dengan kotak pembatas berwarna di sekitar kode yang terdeteksi.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/barcode-read`
|
||||
|
||||
Menerima data formulir multipart dengan berkas gambar dan bidang JSON `settings` opsional.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| tryHarder | boolean | Tidak | `true` | Aktifkan mode pemindaian agresif untuk barcode yang lebih sulit dibaca (lebih lambat tetapi lebih menyeluruh) |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#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"
|
||||
}
|
||||
```
|
||||
|
||||
## Bidang Respons {#response-fields}
|
||||
|
||||
| Bidang | Tipe | Deskripsi |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Nama berkas asli |
|
||||
| barcodes | array | Larik objek barcode yang terdeteksi |
|
||||
| annotatedUrl | string atau null | URL untuk mengunduh gambar beranotasi (null jika tidak ada barcode ditemukan) |
|
||||
| previewUrl | string atau null | Sama seperti annotatedUrl (untuk kompatibilitas pratinjau frontend) |
|
||||
|
||||
### Objek Barcode {#barcode-object}
|
||||
|
||||
| Bidang | Tipe | Deskripsi |
|
||||
|-------|------|-------------|
|
||||
| type | string | Format barcode (QRCode, EAN-13, Code128, DataMatrix, PDF417, dll.) |
|
||||
| text | string | Konten barcode yang didekode |
|
||||
| position | object | Kotak pembatas dengan koordinat topLeft, topRight, bottomLeft, bottomRight |
|
||||
|
||||
## Jenis Barcode yang Didukung {#supported-barcode-types}
|
||||
|
||||
Barcode 1D: Code128, Code39, Code93, Codabar, EAN-8, EAN-13, ITF, UPC-A, UPC-E
|
||||
|
||||
Barcode 2D: QRCode, DataMatrix, PDF417, Aztec, MaxiCode
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Menggunakan pustaka zxing-wasm untuk deteksi barcode.
|
||||
- Gambar beranotasi menampilkan kotak pembatas poligon berwarna dan label bernomor pada setiap barcode yang terdeteksi.
|
||||
- Hingga 255 barcode dapat dideteksi dalam satu gambar.
|
||||
- Jika tidak ada barcode ditemukan, `barcodes` adalah larik kosong dan `annotatedUrl` adalah null.
|
||||
- Mode `tryHarder` melakukan pemindaian yang lebih menyeluruh dengan mengorbankan waktu pemrosesan. Nonaktifkan untuk pemrosesan yang lebih cepat pada barcode yang bersih dan sejajar dengan baik.
|
||||
- Keluaran beranotasi selalu berformat PNG.
|
||||
- Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum pemindaian.
|
||||
- Orientasi EXIF diterapkan secara otomatis sebelum pemrosesan.
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description: "Ubah tangkapan layar polos menjadi gambar yang dipoles dengan latar belakang gradien, bingkai perangkat, bayangan, dan ukuran media sosial."
|
||||
i18n_source_hash: 8fd8a930a45e
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: cffd8e39cb06
|
||||
---
|
||||
|
||||
# Percantik Tangkapan Layar {#beautify-screenshot}
|
||||
|
||||
Tambahkan latar belakang gradien, bingkai perangkat, bayangan, watermark, dan ukuran media sosial ke tangkapan layar. Ideal untuk membuat gambar yang dipoles untuk pemasaran produk, media sosial, dan dokumentasi.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/beautify`
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| backgroundType | string | Tidak | `"linear-gradient"` | Jenis latar belakang: `solid`, `linear-gradient`, `radial-gradient`, `image`, `transparent` |
|
||||
| backgroundColor | string | Tidak | `"#667eea"` | Warna latar belakang solid (digunakan ketika `backgroundType` bernilai `solid`) |
|
||||
| gradientStops | array | Tidak | `[{"color":"#667eea","position":0},{"color":"#764ba2","position":100}]` | Titik henti warna gradien (min 2). Setiap titik henti memiliki `color` (hex) dan `position` (0-100). |
|
||||
| gradientAngle | number | Tidak | 135 | Sudut gradien dalam derajat (0 hingga 360) |
|
||||
| padding | number | Tidak | 64 | Padding di sekitar gambar dalam piksel (0 hingga 256) |
|
||||
| borderRadius | number | Tidak | 12 | Radius sudut pada tangkapan layar (0 hingga 64) |
|
||||
| shadowPreset | string | Tidak | `"subtle"` | Preset bayangan: `none`, `subtle`, `medium`, `dramatic`, `custom` |
|
||||
| shadowBlur | number | Tidak | 20 | Radius blur bayangan kustom (0 hingga 100, digunakan ketika `shadowPreset` bernilai `custom`) |
|
||||
| shadowOffsetX | number | Tidak | 0 | Offset horizontal bayangan kustom (-50 hingga 50) |
|
||||
| shadowOffsetY | number | Tidak | 10 | Offset vertikal bayangan kustom (-50 hingga 50) |
|
||||
| shadowColor | string | Tidak | `"#000000"` | Warna bayangan kustom sebagai hex |
|
||||
| shadowOpacity | number | Tidak | 30 | Opasitas bayangan kustom (0 hingga 100) |
|
||||
| frame | string | Tidak | `"none"` | Bingkai perangkat atau jendela: `none`, `macos-light`, `macos-dark`, `windows-light`, `windows-dark`, `browser-light`, `browser-dark`, `iphone`, `iphone-dark`, `macbook`, `macbook-dark`, `ipad`, `ipad-dark` |
|
||||
| frameTitle | string | Tidak | - | Teks judul yang ditampilkan di bilah judul bingkai jendela |
|
||||
| socialPreset | string | Tidak | `"none"` | Ubah ukuran ke dimensi media sosial: `none`, `twitter`, `linkedin`, `instagram-square`, `instagram-story`, `facebook`, `producthunt` |
|
||||
| watermarkText | string | Tidak | - | Overlay teks watermark opsional |
|
||||
| watermarkPosition | string | Tidak | `"bottom-right"` | Posisi watermark: `top-left`, `top-right`, `bottom-left`, `bottom-right`, `center` |
|
||||
| watermarkOpacity | number | Tidak | 50 | Opasitas watermark (0 hingga 100) |
|
||||
| outputFormat | string | Tidak | `"png"` | Format keluaran: `png`, `jpeg`, `webp` |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
### Dengan Gambar Latar Belakang {#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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/screenshot.png",
|
||||
"originalSize": 234567,
|
||||
"processedSize": 567890
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Menerima dua bidang berkas: `file` (wajib, tangkapan layar utama) dan `backgroundImage` (opsional, digunakan ketika `backgroundType` bernilai `image`).
|
||||
- Mendukung format input HEIC, RAW, PSD, dan SVG (didekode secara otomatis).
|
||||
- Preset bayangan dipetakan ke nilai spesifik:
|
||||
- `subtle`: blur 20, offsetY 4, opasitas 20%
|
||||
- `medium`: blur 40, offsetY 10, opasitas 35%
|
||||
- `dramatic`: blur 80, offsetY 20, opasitas 50%
|
||||
- Preset media sosial mengubah ukuran keluaran akhir agar sesuai dengan dimensi target menggunakan mode `contain`:
|
||||
- `twitter`: 1600x900
|
||||
- `linkedin`: 1200x627
|
||||
- `instagram-square`: 1080x1080
|
||||
- `instagram-story`: 1080x1920
|
||||
- `facebook`: 1200x630
|
||||
- `producthunt`: 1270x760
|
||||
- Bingkai perangkat (`iphone`, `macbook`, `ipad`) menerapkan bezel perangkat keras di sekitar gambar dan melewati pengaturan `borderRadius`.
|
||||
- Ketika transparansi diperlukan (bayangan, radius tepi, bingkai perangkat, atau latar belakang transparan), keluaran dipaksa menjadi PNG meskipun `jpeg` dipilih.
|
||||
- Gambar latar belakang tidak didukung dalam mode pipeline/batch.
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
description: "Buramkan latar belakang sambil menjaga subjek tetap tajam menggunakan AI."
|
||||
i18n_source_hash: 9073f10e6e9d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: a952409ad00b
|
||||
---
|
||||
|
||||
# Buramkan Latar Belakang {#blur-background}
|
||||
|
||||
Buramkan latar belakang gambar sambil menjaga subjek tetap tajam. Model AI mengisolasi subjek, menerapkan blur pada latar belakang asli, dan menggabungkan subjek tajam di atasnya.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/blur-background`
|
||||
|
||||
Menerima data formulir multipart dengan berkas gambar dan bidang JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| intensity | integer | Tidak | `50` | Intensitas blur (1-100) |
|
||||
| feather | integer | Tidak | `0` | Radius pelunakan tepi (0-20) |
|
||||
| format | string | Tidak | `"png"` | Format keluaran: `png` atau `webp` |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
Lacak progres melalui SSE di `GET /api/v1/jobs/{jobId}/progress`. Ketika pekerjaan selesai, aliran SSE memancarkan peristiwa `completed` dengan URL unduhan.
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Ini adalah alat bertenaga AI yang mengembalikan `202 Accepted` dan memproses secara asinkron. Sambungkan ke endpoint SSE untuk menerima pembaruan progres dan hasil akhir.
|
||||
- Memerlukan bundel fitur **background-removal** untuk dipasang. Mengembalikan `501` jika bundel tidak tersedia.
|
||||
- Nilai intensitas yang lebih tinggi menghasilkan efek blur yang lebih kuat. Nilai di atas 80 menciptakan pemisahan mirip bokeh yang jelas.
|
||||
- Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Deteksi dan buramkan wajah dalam gambar secara otomatis dengan deteksi wajah AI untuk privasi dan anonimisasi yang patuh GDPR."
|
||||
i18n_source_hash: fb861c12aea5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: a2d660c6993d
|
||||
---
|
||||
|
||||
# Buramkan Wajah / PII {#face-pii-blur}
|
||||
|
||||
Deteksi dan buramkan wajah dalam gambar secara otomatis menggunakan deteksi wajah bertenaga AI (MediaPipe).
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/blur-faces`
|
||||
|
||||
**Pemrosesan:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status melalui SSE)
|
||||
|
||||
**Bundel model:** `face-detection` (200-300 MB)
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Ya | - | Berkas gambar (multipart) |
|
||||
| blurRadius | number | Tidak | `30` | Radius blur yang diterapkan pada wajah yang terdeteksi (1-100) |
|
||||
| sensitivity | number | Tidak | `0.5` | Sensitivitas deteksi wajah (0-1). Nilai lebih rendah mendeteksi lebih sedikit wajah dengan keyakinan lebih tinggi |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Respons {#response}
|
||||
|
||||
### Respons Awal (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progres (SSE di `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Detecting faces...","percent":40}
|
||||
```
|
||||
|
||||
### Hasil Akhir (melalui 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Tidak Ada Wajah Terdeteksi {#no-faces-detected}
|
||||
|
||||
Jika tidak ada wajah ditemukan, hasil menyertakan peringatan:
|
||||
|
||||
```json
|
||||
{
|
||||
"phase": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"facesDetected": 0,
|
||||
"warning": "No faces detected in this image. Try increasing detection sensitivity."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Memerlukan bundel model `face-detection` untuk dipasang (200-300 MB).
|
||||
- Format keluaran mengikuti format input secara otomatis.
|
||||
- Larik `faces` berisi koordinat kotak pembatas (x, y, width, height) untuk setiap wajah yang terdeteksi.
|
||||
- Naikkan `sensitivity` (lebih dekat ke 1,0) untuk mendeteksi lebih banyak wajah, termasuk yang sebagian terhalang.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui dekode otomatis.
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
description: "Tambahkan bingkai, padding, sudut membulat, dan bayangan jatuh ke gambar dalam urutan yang dapat diprediksi dan dikendalikan."
|
||||
i18n_source_hash: 8845150736a9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 5945278283d8
|
||||
---
|
||||
|
||||
# Bingkai & Frame {#border-frame}
|
||||
|
||||
Tambahkan bingkai, padding, sudut membulat, dan bayangan jatuh ke gambar. Alat ini menerapkan efek dalam urutan: padding, bingkai, radius sudut, lalu bayangan.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/border`
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| borderWidth | number | Tidak | 10 | Ketebalan bingkai dalam piksel (0 hingga 2000) |
|
||||
| borderColor | string | Tidak | `"#000000"` | Warna bingkai sebagai hex (mis. `#FF0000`) |
|
||||
| padding | number | Tidak | 0 | Padding dalam antara gambar dan bingkai dalam piksel (0 hingga 200) |
|
||||
| paddingColor | string | Tidak | `"#FFFFFF"` | Warna isian padding sebagai hex |
|
||||
| cornerRadius | number | Tidak | 0 | Radius sudut dalam piksel (0 hingga 2000) |
|
||||
| shadow | boolean | Tidak | `false` | Apakah akan menambahkan bayangan jatuh |
|
||||
| shadowBlur | number | Tidak | 15 | Radius blur bayangan (1 hingga 200) |
|
||||
| shadowOffsetX | number | Tidak | 0 | Offset horizontal bayangan (-50 hingga 50) |
|
||||
| shadowOffsetY | number | Tidak | 5 | Offset vertikal bayangan (-50 hingga 50) |
|
||||
| shadowColor | string | Tidak | `"#000000"` | Warna bayangan sebagai hex |
|
||||
| shadowOpacity | number | Tidak | 40 | Persentase opasitas bayangan (0 hingga 100) |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.png",
|
||||
"originalSize": 456789,
|
||||
"processedSize": 523456
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Menggunakan factory `createToolRoute` standar. Menerima satu berkas gambar melalui unggahan multipart.
|
||||
- Mendukung format input HEIC, RAW, PSD, dan SVG (didekode secara otomatis).
|
||||
- Urutan pemrosesan: padding ditambahkan terlebih dahulu, lalu bingkai membungkus di sekelilingnya, lalu radius sudut diterapkan, lalu bayangan digabungkan.
|
||||
- Ketika `cornerRadius` atau `shadow` diaktifkan, keluaran dipaksa menjadi PNG (terlepas dari format input) untuk mempertahankan transparansi. Format yang mendukung alfa (PNG, WebP, AVIF) mempertahankan format aslinya.
|
||||
- Bayangan sadar bentuk: bayangan mengikuti sudut membulat alih-alih membuat bayangan persegi panjang.
|
||||
- Menetapkan `borderWidth` ke 0 dan hanya menggunakan `cornerRadius` + `shadow` menciptakan efek bayangan membulat tanpa bingkai.
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
description: "Ganti nama beberapa berkas menggunakan templat pola dan unduh sebagai ZIP."
|
||||
i18n_source_hash: 2776dcc2f71c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 76f871222bea
|
||||
---
|
||||
|
||||
# Ganti Nama Massal {#bulk-rename}
|
||||
|
||||
Ganti nama beberapa berkas menggunakan templat pola dengan placeholder untuk indeks, indeks berpad, dan nama berkas asli. Mengembalikan arsip ZIP yang berisi semua berkas yang telah diganti namanya.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/bulk-rename`
|
||||
|
||||
Menerima data formulir multipart dengan beberapa berkas dan bidang JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| pattern | string | Tidak | `"image-{{index}}"` | Pola penamaan dengan placeholder (maks 1000 karakter) |
|
||||
| startIndex | number | Tidak | `1` | Nomor indeks awal |
|
||||
|
||||
### Placeholder Pola {#pattern-placeholders}
|
||||
|
||||
| Placeholder | Deskripsi | Contoh |
|
||||
|-------------|-------------|---------|
|
||||
| `{{index}}` | Nomor berurutan mulai dari `startIndex` | `1`, `2`, `3` |
|
||||
| `{{padded}}` | Nomor berurutan berpad nol | `01`, `02`, `03` |
|
||||
| `{{original}}` | Nama berkas asli tanpa ekstensi | `photo`, `IMG_001` |
|
||||
|
||||
Ekstensi berkas asli selalu dipertahankan.
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
Ini menghasilkan: `vacation-1.jpg`, `vacation-2.jpg`, `vacation-3.jpg`
|
||||
|
||||
Menggunakan nama berkas asli:
|
||||
|
||||
```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}}"}'
|
||||
```
|
||||
|
||||
Ini menghasilkan: `2024-trip-IMG_001-1.jpg`, `2024-trip-IMG_002-2.jpg`
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
Respons berupa berkas ZIP yang dialirkan langsung (bukan respons JSON). Header respons adalah:
|
||||
|
||||
```
|
||||
Content-Type: application/zip
|
||||
Content-Disposition: attachment; filename="renamed-a1b2c3d4.zip"
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Alat ini tidak memproses gambar. Alat ini hanya mengganti nama berkas dan mengemasnya ke dalam arsip ZIP.
|
||||
- Lebar pad-nol untuk `{{padded}}` ditentukan secara otomatis berdasarkan jumlah total berkas (mis. 100 berkas akan menggunakan pad 3 digit: `001`, `002`, dll.).
|
||||
- Ekstensi berkas dipertahankan dari nama berkas asli.
|
||||
- Nama berkas dibersihkan untuk menghapus karakter yang tidak aman.
|
||||
- Setidaknya satu berkas harus disediakan.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
description: "Pangkas gambar menjadi lingkaran terpusat dengan sudut transparan."
|
||||
i18n_source_hash: 06c50ccd96b2
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 47639e7d5704
|
||||
---
|
||||
|
||||
# Pangkas Lingkaran {#circle-crop}
|
||||
|
||||
Pangkas gambar menjadi lingkaran terpusat dengan sudut transparan. Mendukung zoom, offset, bingkai, dan ukuran keluaran yang dapat disesuaikan.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/circle-crop`
|
||||
|
||||
Menerima data formulir multipart dengan berkas gambar dan bidang JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Bawaan | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| zoom | number | Tidak | `1` | Faktor zoom (1-5); nilai lebih tinggi memangkas lebih rapat |
|
||||
| offsetX | number | Tidak | `0.5` | Posisi tengah horizontal (0-1) |
|
||||
| offsetY | number | Tidak | `0.5` | Posisi tengah vertikal (0-1) |
|
||||
| borderWidth | integer | Tidak | `0` | Lebar bingkai dalam piksel (0-200) |
|
||||
| borderColor | string | Tidak | `"#ffffff"` | Warna hex bingkai |
|
||||
| background | string | Tidak | `"transparent"` | Isian sudut: `"transparent"` atau warna hex |
|
||||
| outputSize | integer | Tidak | - | Dimensi persegi akhir dalam piksel (16-4096) |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.png",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 185000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Keluaran selalu berupa PNG untuk mempertahankan sudut transparan (kecuali `background` diatur ke warna solid).
|
||||
- Lingkaran diinskripsikan di dalam dimensi terpendek gambar. Gunakan `zoom` untuk memangkas lebih rapat dan `offsetX`/`offsetY` untuk menggeser area yang terlihat.
|
||||
- Ketika `outputSize` disediakan, hasilnya diubah ukurannya ke dimensi persegi tersebut setelah pemangkasan.
|
||||
- Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
description: "Gabungkan beberapa gambar menjadi kolase grid dengan 25+ template, jarak dan sudut yang dapat disesuaikan, serta pan dan zoom per sel."
|
||||
i18n_source_hash: 96f2055717df
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e7c79856f0ca
|
||||
---
|
||||
|
||||
# Kolase / Grid {#collage-grid}
|
||||
|
||||
Gabungkan beberapa gambar menjadi kolase grid yang indah dengan 25+ template. Mendukung tata letak 2-9 gambar dengan kontrol jarak, radius sudut, warna latar belakang, dan pan/zoom per sel yang dapat disesuaikan.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/collage`
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| templateId | string | Ya | - | ID tata letak template (mis. `2-h-equal`, `3-left-large`, `4-grid`, `9-grid`) |
|
||||
| cells | array | Tidak | - | Array pengaturan per sel dengan `imageIndex`, `panX`, `panY`, `zoom`, `objectFit` |
|
||||
| cells[].imageIndex | integer | Ya | - | Indeks gambar yang ditempatkan di sel ini (berbasis 0) |
|
||||
| cells[].panX | number | Tidak | 0 | Offset pan horizontal (-100 hingga 100) |
|
||||
| cells[].panY | number | Tidak | 0 | Offset pan vertikal (-100 hingga 100) |
|
||||
| cells[].zoom | number | Tidak | 1 | Level zoom (1 hingga 10) |
|
||||
| cells[].objectFit | string | Tidak | `"cover"` | Cara gambar mengisi sel: `cover` atau `contain` |
|
||||
| gap | number | Tidak | 8 | Jarak antar sel dalam piksel (0 hingga 500) |
|
||||
| cornerRadius | number | Tidak | 0 | Radius sudut untuk setiap sel dalam piksel (0 hingga 500) |
|
||||
| backgroundColor | string | Tidak | `"#FFFFFF"` | Warna latar belakang sebagai hex atau `"transparent"` |
|
||||
| aspectRatio | string | Tidak | `"free"` | Rasio aspek kanvas: `free`, `1:1`, `4:3`, `3:2`, `16:9`, `9:16`, `4:5` |
|
||||
| outputFormat | string | Tidak | `"png"` | Format output: `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | Tidak | 90 | Kualitas output (1 hingga 100) |
|
||||
|
||||
## Template yang Tersedia {#available-templates}
|
||||
|
||||
| ID Template | Gambar | Tata Letak |
|
||||
|-------------|--------|--------|
|
||||
| `2-h-equal` | 2 | Dua kolom sama besar |
|
||||
| `2-v-equal` | 2 | Dua baris sama besar |
|
||||
| `2-h-left-large` | 2 | Kiri 2/3, kanan 1/3 |
|
||||
| `2-h-right-large` | 2 | Kiri 1/3, kanan 2/3 |
|
||||
| `3-left-large` | 3 | Besar di kiri, dua bertumpuk di kanan |
|
||||
| `3-right-large` | 3 | Dua bertumpuk di kiri, besar di kanan |
|
||||
| `3-top-large` | 3 | Besar di atas, dua kolom di bawah |
|
||||
| `3-h-equal` | 3 | Tiga kolom sama besar |
|
||||
| `3-v-equal` | 3 | Tiga baris sama besar |
|
||||
| `4-grid` | 4 | Grid 2x2 |
|
||||
| `4-left-large` | 4 | Besar di kiri, tiga bertumpuk di kanan |
|
||||
| `4-top-large` | 4 | Besar di atas, tiga kolom di bawah |
|
||||
| `4-bottom-large` | 4 | Tiga kolom di atas, besar di bawah |
|
||||
| `5-top2-bottom3` | 5 | Dua di atas, tiga di bawah |
|
||||
| `5-top3-bottom2` | 5 | Tiga di atas, dua di bawah |
|
||||
| `5-left-large` | 5 | Besar di kiri, empat bertumpuk di kanan |
|
||||
| `5-center-large` | 5 | Besar di tengah, empat di sudut |
|
||||
| `6-grid-2x3` | 6 | 2 kolom x 3 baris |
|
||||
| `6-grid-3x2` | 6 | 3 kolom x 2 baris |
|
||||
| `6-top-large` | 6 | Besar di atas, lima kolom di bawah |
|
||||
| `7-mosaic` | 7 | Tata letak mosaik |
|
||||
| `8-mosaic` | 8 | Tata letak mosaik |
|
||||
| `9-grid` | 9 | Grid 3x3 |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/collage.png",
|
||||
"originalSize": 2456789,
|
||||
"processedSize": 1823456
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Unggah beberapa file gambar dalam permintaan multipart. Gambar ditempatkan ke sel template sesuai urutan unggahan.
|
||||
- Jika jumlah gambar yang diunggah lebih banyak dari yang didukung template, gambar tambahan diabaikan.
|
||||
- Mendukung format input HEIC, RAW, PSD, dan SVG (didekode otomatis).
|
||||
- Ukuran dasar kanvas adalah 2400px pada sisi terpanjang, diskalakan sesuai rasio aspek yang dipilih.
|
||||
- Ketika `aspectRatio` adalah `"free"`, kanvas secara default menggunakan 4:3 (2400x1800).
|
||||
- Nilai `panX`/`panY` per sel menggeser jendela crop di dalam sel. Nilai 100 menggeser sepenuhnya ke satu tepi, -100 ke tepi lainnya.
|
||||
- Warna latar belakang `"transparent"` hanya dipertahankan dengan format output `png`, `webp`, atau `avif`.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Simulasikan bagaimana gambar terlihat oleh orang dengan berbagai jenis defisiensi penglihatan warna."
|
||||
i18n_source_hash: 0b537628ba79
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d31ae9921a9d
|
||||
---
|
||||
|
||||
# Simulasi Buta Warna {#color-blindness-simulation}
|
||||
|
||||
Simulasikan defisiensi penglihatan warna (CVD) untuk melihat pratinjau bagaimana gambar tampak bagi orang dengan berbagai jenis buta warna. Berguna untuk pengujian aksesibilitas desain, bagan, dan UI.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/color-blindness`
|
||||
|
||||
Menerima data formulir multipart dengan file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| simulationType | string | Tidak | `"deuteranomaly"` | Jenis defisiensi penglihatan warna yang disimulasikan |
|
||||
|
||||
### Jenis Simulasi {#simulation-types}
|
||||
|
||||
| Nilai | Kondisi | Deskripsi |
|
||||
|-------|-----------|-------------|
|
||||
| `protanopia` | Buta merah | Ketiadaan total sel kerucut merah |
|
||||
| `deuteranopia` | Buta hijau | Ketiadaan total sel kerucut hijau |
|
||||
| `tritanopia` | Buta biru | Ketiadaan total sel kerucut biru |
|
||||
| `protanomaly` | Lemah merah | Sensitivitas kerucut merah berkurang |
|
||||
| `deuteranomaly` | Lemah hijau | Sensitivitas kerucut hijau berkurang (paling umum) |
|
||||
| `tritanomaly` | Lemah biru | Sensitivitas kerucut biru berkurang |
|
||||
| `achromatopsia` | Buta warna total | Ketiadaan total penglihatan warna |
|
||||
| `blueConeMonochromacy` | Hanya kerucut biru | Hanya kerucut biru yang berfungsi |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/design.png",
|
||||
"originalSize": 1850000,
|
||||
"processedSize": 1820000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Deuteranomali (lemah hijau) adalah default karena merupakan bentuk defisiensi penglihatan warna yang paling umum, memengaruhi sekitar 6% pria.
|
||||
- Simulasi menggunakan matriks transformasi warna yang memodelkan bagaimana fotoreseptor kerucut yang berkurang atau tidak ada mengubah warna yang dipersepsikan.
|
||||
- Alat ini bersifat non-destruktif dan hanya menghasilkan pratinjau. Alat ini tidak memodifikasi gambar asli untuk aksesibilitas.
|
||||
- Format output sesuai dengan format input. Input HEIC, RAW, PSD, dan SVG didekode otomatis sebelum diproses.
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
description: "Ekstrak warna dominan dari gambar sebagai palet warna."
|
||||
i18n_source_hash: 65ab22dd75a9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f5e6cff88bc4
|
||||
---
|
||||
|
||||
# Palet Warna {#color-palette}
|
||||
|
||||
Ekstrak warna dominan dari gambar dan kembalikan sebagai nilai warna hex. Menggunakan analisis frekuensi terkuantisasi untuk mengidentifikasi warna yang paling menonjol dan berbeda secara visual.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/color-palette`
|
||||
|
||||
Menerima data formulir multipart dengan file gambar dan field JSON `settings` opsional.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| count | integer | Tidak | `8` | Jumlah warna yang diekstrak (2-16) |
|
||||
| format | string | Tidak | `"hex"` | Format warna: `hex`, `rgb`, `hsl` |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"filename": "photo.jpg",
|
||||
"colors": [
|
||||
"#304080",
|
||||
"#e0a060",
|
||||
"#f0f0f0",
|
||||
"#203020",
|
||||
"#a0c0e0",
|
||||
"#806040"
|
||||
],
|
||||
"hex": [
|
||||
"#304080",
|
||||
"#e0a060",
|
||||
"#f0f0f0",
|
||||
"#203020",
|
||||
"#a0c0e0",
|
||||
"#806040"
|
||||
],
|
||||
"count": 6
|
||||
}
|
||||
```
|
||||
|
||||
## Field Respons {#response-fields}
|
||||
|
||||
| Field | Tipe | Deskripsi |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Nama file yang disanitasi |
|
||||
| colors | array | Array string warna dalam format yang diminta, diurutkan berdasarkan dominasi (paling sering muncul lebih dulu) |
|
||||
| hex | array | Array string warna hex (selalu hex, terlepas dari pengaturan `format`) |
|
||||
| count | number | Jumlah warna yang diekstrak |
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Mengembalikan hingga `count` warna dominan (default 8, rentang 2-16), diurutkan berdasarkan frekuensi (paling umum lebih dulu).
|
||||
- Gambar diubah ukurannya secara internal menjadi 100x100 piksel untuk analisis, sehingga palet merepresentasikan distribusi warna keseluruhan alih-alih detail kecil.
|
||||
- Warna diekstrak menggunakan kuantisasi median-cut, yang secara rekursif membagi populasi piksel di sepanjang kanal dengan rentang terlebar.
|
||||
- Kanal alfa dihapus sebelum analisis, sehingga area transparan tidak diperhitungkan.
|
||||
- Ini adalah endpoint hanya-baca. Ia tidak menghasilkan file output yang dapat diunduh atau `jobId`.
|
||||
- Input HEIC, RAW, PSD, dan SVG didekode otomatis sebelum analisis.
|
||||
@@ -0,0 +1,80 @@
|
||||
---
|
||||
description: "Warnai foto hitam-putih atau grayscale secara otomatis dengan model AI DDColor."
|
||||
i18n_source_hash: 688aa3abbdae
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ed945fdf25f4
|
||||
---
|
||||
|
||||
# Pewarnaan AI {#ai-colorization}
|
||||
|
||||
Ubah foto hitam-putih atau grayscale menjadi berwarna penuh menggunakan AI (model DDColor dengan fallback OpenCV DNN).
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/colorize`
|
||||
|
||||
**Pemrosesan:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `object-eraser-colorize` (1-2 GB)
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Ya | - | File gambar (multipart) |
|
||||
| intensity | number | Tidak | `1.0` | Intensitas warna (0-1). Nilai lebih rendah menghasilkan pewarnaan yang lebih halus |
|
||||
| model | string | Tidak | `"auto"` | Model yang digunakan: `auto`, `ddcolor`, `opencv` |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
## Respons {#response}
|
||||
|
||||
### Respons Awal (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progres (SSE di `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Colorizing...","percent":55}
|
||||
```
|
||||
|
||||
### Hasil Akhir (via 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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Memerlukan model bundle `object-eraser-colorize` terpasang (1-2 GB).
|
||||
- DDColor menghasilkan hasil berkualitas lebih tinggi tetapi lebih lambat; OpenCV DNN lebih cepat dengan kualitas sedikit lebih rendah. `auto` menggunakan DDColor jika tersedia dengan fallback OpenCV.
|
||||
- Parameter `intensity` memadukan antara grayscale asli dan hasil pewarnaan AI. Gunakan 1.0 untuk warna penuh, nilai lebih rendah untuk tampilan vintage yang sebagian tersaturasi.
|
||||
- Format output otomatis sesuai dengan format input.
|
||||
- Untuk format output yang tidak dapat dipratinjau di browser, pratinjau WebP dihasilkan bersama output utama.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui dekode otomatis.
|
||||
@@ -0,0 +1,68 @@
|
||||
---
|
||||
description: "Bandingkan dua gambar berdampingan dengan visualisasi diff tingkat piksel dan skor kemiripan."
|
||||
i18n_source_hash: cc0a02bd75c6
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 8f37f0388351
|
||||
---
|
||||
|
||||
# Bandingkan Gambar {#image-compare}
|
||||
|
||||
Unggah dua gambar untuk menghitung peta perbedaan tingkat piksel dan persentase kemiripan numerik. Outputnya adalah gambar diff yang menyoroti area yang berubah dengan warna merah.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/compare`
|
||||
|
||||
Menerima data formulir multipart dengan **dua** file gambar. Tidak diperlukan field pengaturan.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
Alat ini tidak memiliki parameter yang dapat dikonfigurasi. Unggah tepat dua file gambar.
|
||||
|
||||
| Field | Tipe | Wajib | Deskripsi |
|
||||
|-------|------|----------|-------------|
|
||||
| file (pertama) | file | Ya | Gambar pertama |
|
||||
| file (kedua) | file | Ya | Gambar kedua |
|
||||
|
||||
## Contoh Permintaan {#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"
|
||||
```
|
||||
|
||||
## Contoh Respons {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Field Respons {#response-fields}
|
||||
|
||||
| Field | Tipe | Deskripsi |
|
||||
|-------|------|-------------|
|
||||
| jobId | string | Pengenal pekerjaan untuk mengunduh gambar diff |
|
||||
| similarity | number | Persentase kemiripan antara kedua gambar (0 hingga 100) |
|
||||
| dimensions | object | Lebar dan tinggi yang digunakan untuk perbandingan |
|
||||
| downloadUrl | string | URL untuk mengunduh gambar diff yang dihasilkan |
|
||||
| originalSize | number | Gabungan ukuran kedua gambar input dalam byte |
|
||||
| processedSize | number | Ukuran gambar diff output dalam byte |
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Kedua gambar diubah ukurannya menjadi dimensi yang sama (maksimum dari masing-masing sumbu) sebelum dibandingkan.
|
||||
- Gambar diff menyoroti perbedaan dengan warna merah dengan opasitas sebanding dengan besarnya perubahan. Piksel yang identik atau hampir identik (perbedaan < 10) ditampilkan sebagai versi semi-transparan dari gambar asli.
|
||||
- Kemiripan dihitung sebagai kebalikan dari rata-rata perbedaan piksel di seluruh piksel, dinyatakan sebagai persentase.
|
||||
- Kemiripan 100% berarti gambar-gambar tersebut identik secara piksel (pada resolusi perbandingan).
|
||||
- Output diff selalu berformat PNG terlepas dari format input.
|
||||
- Kedua gambar divalidasi dan didekode (HEIC, RAW, PSD, SVG didukung) sebelum dibandingkan.
|
||||
- Orientasi EXIF diterapkan otomatis pada kedua gambar sebelum diproses.
|
||||
@@ -0,0 +1,87 @@
|
||||
---
|
||||
description: "Susun gambar berlapis dengan posisi, opasitas, dan mode blend untuk komposit."
|
||||
i18n_source_hash: c5d09eb13fde
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ce63a02afd4f
|
||||
---
|
||||
|
||||
# Komposisi Gambar {#image-composition}
|
||||
|
||||
Susun gambar overlay di atas gambar dasar dengan posisi, opasitas, dan mode blend yang dapat dikonfigurasi. Berguna untuk mengomposit logo, grafik, atau menggabungkan beberapa gambar.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/compose`
|
||||
|
||||
Menerima data formulir multipart dengan **dua** file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| x | number | Tidak | `0` | Offset horizontal overlay dari sudut kiri atas dalam piksel (min 0) |
|
||||
| y | number | Tidak | `0` | Offset vertikal overlay dari sudut kiri atas dalam piksel (min 0) |
|
||||
| opacity | number | Tidak | `100` | Persentase opasitas overlay (0 hingga 100) |
|
||||
| blendMode | string | Tidak | `"over"` | Mode blend komposit |
|
||||
|
||||
### Mode Blend {#blend-modes}
|
||||
|
||||
| Nilai | Deskripsi |
|
||||
|-------|-------------|
|
||||
| `over` | Overlay normal (default) |
|
||||
| `multiply` | Menggelapkan dengan mengalikan nilai piksel |
|
||||
| `screen` | Mencerahkan dengan membalik, mengalikan, lalu membalik lagi |
|
||||
| `overlay` | Menggabungkan multiply dan screen berdasarkan kecerahan dasar |
|
||||
| `darken` | Pertahankan piksel yang lebih gelap dari setiap lapisan |
|
||||
| `lighten` | Pertahankan piksel yang lebih terang dari setiap lapisan |
|
||||
| `hard-light` | Overlay kontras kuat |
|
||||
| `soft-light` | Overlay kontras halus |
|
||||
| `difference` | Perbedaan absolut antar lapisan |
|
||||
| `exclusion` | Mirip dengan difference tetapi kontras lebih rendah |
|
||||
|
||||
### Field File {#file-fields}
|
||||
|
||||
| Nama Field | Wajib | Deskripsi |
|
||||
|------------|----------|-------------|
|
||||
| file | Ya | Gambar dasar/latar belakang |
|
||||
| overlay | Ya | Gambar overlay/latar depan |
|
||||
|
||||
## Contoh Permintaan {#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"}'
|
||||
```
|
||||
|
||||
Menggunakan mode blend 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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/background.jpg",
|
||||
"originalSize": 3200000,
|
||||
"processedSize": 3450000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Kedua gambar divalidasi dan didekode (HEIC, RAW, PSD, SVG didukung) sebelum komposit.
|
||||
- Overlay ditempatkan pada koordinat piksel tepat yang ditentukan oleh `x` dan `y`. Overlay tidak diubah ukurannya agar pas.
|
||||
- Jika opasitas kurang dari 100, masker alfa diterapkan pada overlay sebelum blending.
|
||||
- Overlay dapat melampaui batas gambar dasar (akan dipotong).
|
||||
- Orientasi EXIF diterapkan otomatis pada kedua gambar sebelum diproses.
|
||||
- Dimensi output sesuai dengan dimensi gambar dasar.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Kurangi ukuran file gambar berdasarkan level kualitas atau ke ukuran file target."
|
||||
i18n_source_hash: af4685da7e64
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 327a0ac6cf15
|
||||
---
|
||||
|
||||
# Kompres {#compress}
|
||||
|
||||
Kurangi ukuran file gambar dengan menentukan level kualitas atau ukuran file target dalam kilobyte. Alat ini menggunakan pencarian biner iteratif untuk mencapai target ukuran secara akurat.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/compress`
|
||||
|
||||
Menerima data formulir multipart dengan file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| mode | string | Tidak | `"quality"` | Mode kompresi: `quality` atau `targetSize` |
|
||||
| quality | number | Tidak | `80` | Level kualitas (1-100). Digunakan ketika mode adalah `quality`. |
|
||||
| targetSizeKb | number | Tidak | - | Ukuran file target dalam kilobyte. Digunakan ketika mode adalah `targetSize`. |
|
||||
|
||||
## Contoh Permintaan {#example-request}
|
||||
|
||||
Kompres ke kualitas 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}'
|
||||
```
|
||||
|
||||
Kompres ke ukuran target 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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 204800
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Dalam mode `quality`, nilai lebih rendah menghasilkan file lebih kecil dengan lebih banyak artefak kompresi. Nilai 80 adalah default yang baik untuk penggunaan web.
|
||||
- Dalam mode `targetSize`, engine melakukan kompresi iteratif untuk mendekati target semaksimal mungkin tanpa melampauinya.
|
||||
- Format output sesuai dengan format input. Kompresi diterapkan pada encoding native format tersebut (mis. kualitas JPEG untuk file JPEG, kualitas WebP untuk file WebP).
|
||||
- Jika kualitas default (80) dapat diterima, Anda dapat menghilangkan parameter `quality` sepenuhnya.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
description: "Pengubahan ukuran seam-carving yang menambah atau menghapus piksel di sepanjang jalur berkepentingan rendah untuk mempertahankan konten kunci dan wajah."
|
||||
i18n_source_hash: f383b28ab62a
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 3f4e4fe5b1bb
|
||||
---
|
||||
|
||||
# Pengubahan Ukuran Sadar-Konten {#content-aware-resize}
|
||||
|
||||
Pengubahan ukuran seam carving yang secara cerdas menghapus atau menambahkan piksel di sepanjang jalur dengan kepentingan visual paling rendah, mempertahankan konten penting dan secara opsional melindungi wajah.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/content-aware-resize`
|
||||
|
||||
**Pemrosesan:** Sinkron (mengembalikan hasil secara langsung)
|
||||
|
||||
**Model bundle:** Tidak diperlukan untuk operasi dasar. Perlindungan wajah menggunakan bundle `face-detection` (200-300 MB) jika diaktifkan.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Ya | - | File gambar (multipart) |
|
||||
| width | number | Tidak | - | Lebar target dalam piksel |
|
||||
| height | number | Tidak | - | Tinggi target dalam piksel |
|
||||
| protectFaces | boolean | Tidak | `false` | Deteksi dan lindungi wajah dari penghapusan seam |
|
||||
| blurRadius | number | Tidak | `4` | Radius blur pra-pemrosesan untuk perhitungan energi (0-20) |
|
||||
| sobelThreshold | number | Tidak | `2` | Ambang batas deteksi tepi Sobel (1-20). Nilai lebih tinggi membuat algoritma lebih agresif |
|
||||
| square | boolean | Tidak | `false` | Ubah ukuran menjadi persegi (menggunakan dimensi yang lebih kecil) |
|
||||
|
||||
Setidaknya salah satu dari `width`, `height`, atau `square` harus ditentukan.
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Respons (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
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Rute kustom ini saat ini mengembalikan respons 200 sinkron.
|
||||
- Menggunakan pustaka seam carving `caire` untuk pengubahan ukuran sadar-konten.
|
||||
- Hanya mengurangi dimensi (menghapus seam). Tidak dapat memperluas gambar melampaui ukuran aslinya.
|
||||
- Opsi `protectFaces` menggunakan deteksi wajah AI untuk menandai area wajah sebagai berenergi tinggi, mencegah seam melewati wajah.
|
||||
- `blurRadius` mengontrol penghalusan sebelum perhitungan peta energi. Nilai lebih tinggi membuat peta energi lebih seragam, yang dapat membantu pada gambar berderau.
|
||||
- `sobelThreshold` memengaruhi seberapa agresif tepi dideteksi. Nilai lebih rendah mempertahankan lebih banyak tepi halus.
|
||||
- Output selalu berformat PNG.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui dekode otomatis.
|
||||
@@ -0,0 +1,84 @@
|
||||
---
|
||||
description: "Konversi gambar antar format termasuk format modern seperti AVIF, JXL, dan HEIC."
|
||||
i18n_source_hash: 562f8270e8c3
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: c8ad4d0044bd
|
||||
---
|
||||
|
||||
# Konversi {#convert}
|
||||
|
||||
Konversi gambar antar format. Mendukung format web umum serta format khusus seperti HEIC, JXL, BMP, ICO, JP2, QOI, dan PSD.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/convert`
|
||||
|
||||
Menerima data formulir multipart dengan file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| format | string | Ya | - | Format target: `jpg`, `png`, `webp`, `avif`, `tiff`, `gif`, `heic`, `heif`, `jxl`, `bmp`, `ico`, `jp2`, `qoi`, `psd`, `ppm`, `eps`, `tga` |
|
||||
| quality | number | Tidak | - | Kualitas output (1-100). Berlaku untuk format lossy seperti jpg, webp, avif, heic. |
|
||||
|
||||
## Format Output yang Didukung {#supported-output-formats}
|
||||
|
||||
| Format | Tipe | Catatan |
|
||||
|--------|------|-------|
|
||||
| jpg | Lossy | JPEG, kompatibilitas terbaik |
|
||||
| png | Lossless | Mendukung transparansi |
|
||||
| webp | Keduanya | Format web modern, kompresi baik |
|
||||
| avif | Lossy | Format generasi baru, kompresi sangat baik |
|
||||
| tiff | Keduanya | Alur kerja cetak/penerbitan |
|
||||
| gif | Lossless | Terbatas hingga 256 warna |
|
||||
| heic / heif | Lossy | Format ekosistem Apple |
|
||||
| jxl | Keduanya | JPEG XL, format generasi baru |
|
||||
| bmp | Lossless | Bitmap tanpa kompresi |
|
||||
| ico | Lossless | Format ikon Windows |
|
||||
| jp2 | Lossy | JPEG 2000 |
|
||||
| qoi | Lossless | Format Quite OK Image |
|
||||
| psd | Berlapis | Adobe Photoshop (memerlukan ImageMagick) |
|
||||
| ppm | Lossless | Portable Pixmap (PPM/PGM/PBM) |
|
||||
| eps | Vektor | Encapsulated PostScript |
|
||||
| tga | Lossless | Format gambar Targa |
|
||||
|
||||
## Contoh Permintaan {#example-request}
|
||||
|
||||
Konversi ke 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}'
|
||||
```
|
||||
|
||||
Konversi ke PNG (lossless):
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.webp",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 680000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Ekstensi nama file output diperbarui otomatis agar sesuai dengan format target.
|
||||
- Input SVG dirasterisasi pada 300 DPI sebelum konversi.
|
||||
- Konversi PSD memerlukan ImageMagick terpasang di server.
|
||||
- BMP, EPS, ICO, JP2, JXL, PPM, QOI, dan TGA menggunakan encoder CLI khusus dan melewati pemrosesan Sharp.
|
||||
- Encoding HEIC/HEIF menggunakan pustaka encoder HEIC sistem.
|
||||
- Format input beragam: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC, RAW (CR2, NEF, ARW, dll.), PSD, SVG, BMP, dan lainnya.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Potong gambar dengan menentukan area menggunakan posisi dan dimensi."
|
||||
i18n_source_hash: aab38ccd7c53
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 9d19b11b1cf9
|
||||
---
|
||||
|
||||
# Potong {#crop}
|
||||
|
||||
Potong gambar dengan mendefinisikan area persegi panjang menggunakan posisi dan ukuran. Mendukung satuan piksel dan persentase.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/crop`
|
||||
|
||||
Menerima data formulir multipart dengan file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| left | number | Ya | - | Offset X area potong (dari tepi kiri) |
|
||||
| top | number | Ya | - | Offset Y area potong (dari tepi atas) |
|
||||
| width | number | Ya | - | Lebar area potong |
|
||||
| height | number | Ya | - | Tinggi area potong |
|
||||
| unit | string | Tidak | `"px"` | Satuan untuk nilai: `px` atau `percent` |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
Potong menggunakan nilai persentase:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 1200000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Area potong harus berada di dalam batas gambar. Jika area melampaui gambar, permintaan akan gagal.
|
||||
- Saat menggunakan satuan `percent`, nilai merepresentasikan persentase dari dimensi gambar (mis. `left: 10` berarti 10% dari tepi kiri).
|
||||
- Format output sesuai dengan format input.
|
||||
- Orientasi EXIF diterapkan otomatis sebelum pemotongan, sehingga koordinat sesuai dengan orientasi yang benar secara visual.
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
description: "Terapkan efek duotone dua warna dengan warna bayangan dan sorotan kustom."
|
||||
i18n_source_hash: ab99c4f0152c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f4bfce768b25
|
||||
---
|
||||
|
||||
# Duotone {#duotone}
|
||||
|
||||
Terapkan efek duotone dua warna pada gambar. Gambar diubah menjadi grayscale, lalu dipetakan ke gradien antara warna bayangan (nada gelap) dan warna sorotan (nada terang).
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/duotone`
|
||||
|
||||
Menerima data formulir multipart dengan file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| shadow | string | Tidak | `"#1e3a8a"` | Warna hex bayangan (diterapkan pada nada gelap) |
|
||||
| highlight | string | Tidak | `"#fbbf24"` | Warna hex sorotan (diterapkan pada nada terang) |
|
||||
| intensity | integer | Tidak | `100` | Intensitas efek (0-100); 0 mengembalikan gambar asli, 100 menerapkan duotone penuh |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Contoh Respons {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 1870000
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Format output sesuai dengan format input. Input HEIC, RAW, PSD, dan SVG didekode otomatis sebelum diproses.
|
||||
- `intensity` kurang dari 100 memadukan hasil duotone dengan gambar asli, memungkinkan efek yang lebih halus.
|
||||
- Kombinasi duotone populer meliputi navy/emas, teal/coral, dan ungu/pink.
|
||||
@@ -0,0 +1,108 @@
|
||||
---
|
||||
description: "Edit field metadata EXIF, IPTC, GPS, dan XMP dalam gambar tanpa mengenkode ulang piksel."
|
||||
i18n_source_hash: a37746db11c3
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 9e6badffd745
|
||||
---
|
||||
|
||||
# Edit Metadata {#edit-metadata}
|
||||
|
||||
Edit field metadata gambar termasuk EXIF, IPTC, koordinat GPS, tanggal, dan kata kunci. Menggunakan ExifTool di baliknya, sehingga metadata ditulis di tempat tanpa mengenkode ulang piksel, mempertahankan kualitas gambar penuh.
|
||||
|
||||
## API Endpoint {#api-endpoints}
|
||||
|
||||
### Edit Metadata {#edit-metadata-1}
|
||||
|
||||
`POST /api/v1/tools/image/edit-metadata`
|
||||
|
||||
Menulis field metadata ke gambar dan mengembalikan file yang dimodifikasi.
|
||||
|
||||
### Inspeksi Metadata {#inspect-metadata}
|
||||
|
||||
`POST /api/v1/tools/image/edit-metadata/inspect`
|
||||
|
||||
Mengembalikan metadata lengkap dari gambar via ExifTool sebagai JSON. Tidak memodifikasi gambar.
|
||||
|
||||
## Parameter (Edit) {#parameters-edit}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| title | string | Tidak | - | Judul gambar (XMP/EXIF) |
|
||||
| author | string | Tidak | - | Nama penulis |
|
||||
| artist | string | Tidak | - | Nama artis (tag EXIF Artist) |
|
||||
| copyright | string | Tidak | - | Pemberitahuan hak cipta |
|
||||
| imageDescription | string | Tidak | - | Deskripsi gambar (EXIF) |
|
||||
| software | string | Tidak | - | Tag perangkat lunak |
|
||||
| dateTime | string | Tidak | - | Nilai EXIF DateTime |
|
||||
| dateTimeOriginal | string | Tidak | - | Nilai EXIF DateTimeOriginal |
|
||||
| setAllDates | string | Tidak | - | Atur semua field tanggal sekaligus |
|
||||
| dateShift | string | Tidak | - | Geser semua tanggal berdasarkan offset (format: `+HH:MM` atau `-HH:MM`) |
|
||||
| clearGps | boolean | Tidak | `false` | Hapus semua data GPS |
|
||||
| gpsLatitude | number | Tidak | - | Atur lintang GPS (-90 hingga 90) |
|
||||
| gpsLongitude | number | Tidak | - | Atur bujur GPS (-180 hingga 180) |
|
||||
| gpsAltitude | number | Tidak | - | Atur ketinggian GPS dalam meter |
|
||||
| keywords | string[] | Tidak | - | Kata kunci/tag yang ditambahkan atau diatur |
|
||||
| keywordsMode | string | Tidak | `"add"` | Cara menangani kata kunci: `add` (tambahkan) atau `set` (ganti) |
|
||||
| fieldsToRemove | string[] | Tidak | `[]` | Daftar nama field metadata spesifik yang dihapus |
|
||||
| iptcTitle | string | Tidak | - | IPTC Object Name |
|
||||
| iptcHeadline | string | Tidak | - | IPTC Headline |
|
||||
| iptcCity | string | Tidak | - | IPTC City |
|
||||
| iptcState | string | Tidak | - | IPTC Province/State |
|
||||
| iptcCountry | string | Tidak | - | IPTC Country |
|
||||
|
||||
## Contoh Permintaan {#example-request}
|
||||
|
||||
Atur penulis dan hak cipta:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
Atur koordinat 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}'
|
||||
```
|
||||
|
||||
Hapus GPS dan tambahkan kata kunci:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
Inspeksi metadata:
|
||||
|
||||
```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"
|
||||
```
|
||||
|
||||
## Contoh Respons (Edit) {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Alat ini memerlukan ExifTool terpasang di server. Ini sudah disertakan dalam image Docker.
|
||||
- Metadata ditulis di tempat, sehingga tidak terjadi enkode ulang piksel. Perubahan ukuran file minimal (hanya byte metadata).
|
||||
- Parameter `dateShift` menggeser semua field tanggal berdasarkan offset yang ditentukan, berguna untuk memperbaiki kesalahan zona waktu (mis. `+02:00` atau `-05:30`).
|
||||
- Jika tidak ada perubahan yang diminta (semua parameter dihilangkan atau kosong), file asli dikembalikan tanpa perubahan.
|
||||
- Format yang didukung: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC/HEIF.
|
||||
- Untuk format yang tidak dapat dipratinjau di browser (HEIF, TIFF), respons menyertakan field `previewUrl` dengan pratinjau WebP.
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description: "Pulihkan dan pertajam wajah buram atau berkualitas rendah dalam gambar dengan model AI GFPGAN dan CodeFormer."
|
||||
i18n_source_hash: 7f9f6af8ebda
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 66445313eca4
|
||||
---
|
||||
|
||||
# Peningkatan Wajah {#face-enhancement}
|
||||
|
||||
Pulihkan dan tingkatkan wajah dalam gambar menggunakan model AI (GFPGAN/CodeFormer).
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/enhance-faces`
|
||||
|
||||
**Pemrosesan:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `upscale-enhance` (5-6 GB) dan `face-detection` (200-300 MB)
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Ya | - | File gambar (multipart) |
|
||||
| model | string | Tidak | `"auto"` | Model yang digunakan: `auto`, `gfpgan`, `codeformer` |
|
||||
| strength | number | Tidak | `0.8` | Kekuatan peningkatan (0-1). Nilai lebih tinggi menghasilkan peningkatan lebih kuat |
|
||||
| onlyCenterFace | boolean | Tidak | `false` | Hanya tingkatkan wajah yang paling sentral/menonjol |
|
||||
| sensitivity | number | Tidak | `0.5` | Sensitivitas deteksi wajah (0-1) |
|
||||
|
||||
## Contoh Permintaan {#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}'
|
||||
```
|
||||
|
||||
## Respons {#response}
|
||||
|
||||
### Respons Awal (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progres (SSE di `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Enhancing faces...","percent":60}
|
||||
```
|
||||
|
||||
### Hasil Akhir (via 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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Memerlukan model bundle `upscale-enhance` (5-6 GB) dan model bundle `face-detection` (200-300 MB).
|
||||
- GFPGAN menghasilkan peningkatan yang lebih agresif; CodeFormer lebih baik mempertahankan identitas. `auto` memilih model terbaik untuk input.
|
||||
- Output selalu berformat PNG untuk kualitas maksimal.
|
||||
- Pratinjau WebP dihasilkan bersama output resolusi penuh untuk tampilan frontend yang lebih cepat.
|
||||
- Parameter `strength` memadukan wajah yang ditingkatkan dengan aslinya. Gunakan nilai lebih rendah (0.3-0.5) untuk perbaikan halus, nilai lebih tinggi (0.7-1.0) untuk restorasi lebih kuat.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui dekode otomatis.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: "Hapus objek yang tidak diinginkan dari gambar dengan inpainting AI (LaMa), dipandu oleh masker area yang akan dihapus."
|
||||
i18n_source_hash: 8e2e42a5e4f9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 30170741c99e
|
||||
---
|
||||
|
||||
# Penghapus Objek {#object-eraser}
|
||||
|
||||
Hapus objek yang tidak diinginkan dari gambar menggunakan inpainting AI (model LaMa). Menerima gambar dan masker yang menunjukkan area yang akan dihapus.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/erase-object`
|
||||
|
||||
**Pemrosesan:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `object-eraser-colorize` (1-2 GB)
|
||||
|
||||
## Parameter {#parameters}
|
||||
|
||||
| Parameter | Tipe | Wajib | Default | Deskripsi |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Ya | - | File gambar sumber (multipart) |
|
||||
| mask | file | Ya | - | Gambar masker (putih = area yang dihapus, hitam = dipertahankan). Harus diunggah dengan fieldname `mask` |
|
||||
| format | string | Tidak | `"auto"` | Format output: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| quality | integer | Tidak | `95` | Kualitas output (1-100) |
|
||||
|
||||
## Contoh Permintaan {#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"
|
||||
```
|
||||
|
||||
## Respons {#response}
|
||||
|
||||
### Respons Awal (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progres (SSE di `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Inpainting...","percent":70}
|
||||
```
|
||||
|
||||
### Hasil Akhir (via 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Catatan {#notes}
|
||||
|
||||
- Memerlukan model bundle `object-eraser-colorize` terpasang (1-2 GB).
|
||||
- Masker harus berdimensi sama dengan gambar sumber. Piksel putih menunjukkan area yang dihapus; AI mengisinya dengan konten yang masuk akal.
|
||||
- Menggunakan LaMa (Large Mask Inpainting) untuk penghapusan objek berkualitas tinggi.
|
||||
- Untuk format output yang tidak dapat dipratinjau di browser, pratinjau WebP dihasilkan bersama output utama.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui dekode otomatis.
|
||||
@@ -0,0 +1,93 @@
|
||||
---
|
||||
description: "Hasilkan semua ukuran favicon dan ikon aplikasi standar dari gambar sumber."
|
||||
i18n_source_hash: 3a6451a94b7a
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 8d0c0e40c85d
|
||||
---
|
||||
|
||||
# Favicon Generator {#favicon-generator}
|
||||
|
||||
Hasilkan satu set lengkap file favicon dan ikon aplikasi dari gambar sumber. Menghasilkan semua ukuran standar yang dibutuhkan untuk browser, perangkat Apple, dan Android, beserta web manifest dan cuplikan HTML.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/favicon`
|
||||
|
||||
Menerima multipart form data dengan satu atau lebih file gambar dan sebuah field JSON `settings` opsional.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| background | string | No | - | Warna hex latar belakang (mis. `"#ffffff"`). Bila diatur, ikon akan diratakan ke warna ini. |
|
||||
| padding | integer | No | `0` | Persentase padding di sekitar konten ikon (0 hingga 40) |
|
||||
| radius | integer | No | `0` | Persentase radius sudut untuk ikon dengan sudut membulat (0 hingga 50) |
|
||||
| sizes | integer[] | No | - | Batasi output ke ukuran piksel tertentu (mis. `[16, 32, 180]`). Kosongkan untuk menghasilkan semua ukuran standar. |
|
||||
| themeColor | string | No | `"#ffffff"` | Warna hex tema untuk web manifest |
|
||||
|
||||
## Generated Files {#generated-files}
|
||||
|
||||
Untuk setiap gambar input, file-file berikut dihasilkan:
|
||||
|
||||
| File | Size | Purpose |
|
||||
|------|------|---------|
|
||||
| `favicon-16x16.png` | 16x16 | Ikon tab browser |
|
||||
| `favicon-32x32.png` | 32x32 | Ikon tab browser (HiDPI) |
|
||||
| `favicon-48x48.png` | 48x48 | Pintasan desktop |
|
||||
| `apple-touch-icon.png` | 180x180 | Layar utama iOS |
|
||||
| `android-chrome-192x192.png` | 192x192 | Layar utama Android |
|
||||
| `android-chrome-512x512.png` | 512x512 | Splash screen Android |
|
||||
| `favicon.ico` | 32x32 | Format ICO lawas |
|
||||
| `manifest.json` | - | Web app manifest dengan referensi ikon |
|
||||
| `favicon-snippet.html` | - | Tag link HTML siap pakai |
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
Gambar sumber tunggal dengan sudut membulat dan padding:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
Beberapa gambar sumber (masing-masing mendapat setnya sendiri di subfolder):
|
||||
|
||||
```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"
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
Responsnya adalah file ZIP yang di-stream langsung. Header respons adalah:
|
||||
|
||||
```
|
||||
Content-Type: application/zip
|
||||
Content-Disposition: attachment; filename="favicons-a1b2c3d4.zip"
|
||||
```
|
||||
|
||||
## HTML Snippet Included {#html-snippet-included}
|
||||
|
||||
ZIP menyertakan sebuah file `favicon-snippet.html` yang bisa Anda tempelkan ke `<head>` HTML Anda:
|
||||
|
||||
```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">
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Gambar sumber diubah ukurannya menggunakan mode fit `cover`, artinya gambar dipotong untuk mengisi setiap ukuran persegi. Untuk hasil terbaik, gunakan gambar sumber berbentuk persegi.
|
||||
- Bila beberapa file diunggah, masing-masing mendapat subfoldernya sendiri di ZIP (dinamai sesuai file sumber).
|
||||
- Untuk unggahan satu file, semua output berada di root ZIP tanpa subfolder.
|
||||
- File yang gagal validasi atau decoding akan dilewati, dan sebuah `skipped-files.txt` disertakan di ZIP untuk menjelaskan masalahnya.
|
||||
- Format input yang didukung: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC, SVG, RAW, PSD, dan lainnya.
|
||||
- Orientasi EXIF diterapkan otomatis sebelum pengubahan ukuran.
|
||||
@@ -0,0 +1,115 @@
|
||||
---
|
||||
description: "Deteksi gambar duplikat dan nyaris-duplikat menggunakan perceptual hashing."
|
||||
i18n_source_hash: 4e1f4413f90f
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: a40dc543bfa4
|
||||
---
|
||||
|
||||
# Find Duplicates {#find-duplicates}
|
||||
|
||||
Unggah beberapa gambar untuk mendeteksi duplikat dan nyaris-duplikat menggunakan perceptual hashing (dHash). Mengelompokkan gambar serupa, mengidentifikasi versi berkualitas terbaik di setiap grup, dan menghitung potensi penghematan ruang.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/find-duplicates`
|
||||
|
||||
Menerima multipart form data dengan beberapa file gambar dan sebuah field JSON `settings` opsional.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| threshold | number | No | `8` | Jarak Hamming maksimum untuk menganggap gambar sebagai duplikat (0 hingga 20). Lebih rendah = pencocokan lebih ketat |
|
||||
|
||||
### File Fields {#file-fields}
|
||||
|
||||
Unggah setidaknya 2 file gambar dalam permintaan multipart (semuanya menggunakan nama field `file` atau nama field apa pun untuk bagian file).
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Example Response {#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": []
|
||||
}
|
||||
```
|
||||
|
||||
## Response Fields {#response-fields}
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| totalImages | number | Jumlah gambar yang berhasil dianalisis |
|
||||
| duplicateGroups | array | Grup gambar duplikat |
|
||||
| uniqueImages | number | Jumlah gambar yang bukan bagian dari grup duplikat mana pun |
|
||||
| spaceSaveable | number | Total byte yang bisa dihemat dengan menghapus duplikat non-terbaik |
|
||||
| skippedFiles | array | File yang tidak dapat diproses (dengan nama file dan alasannya) |
|
||||
|
||||
### Duplicate Group Object {#duplicate-group-object}
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| groupId | number | Pengenal grup |
|
||||
| files | array | Gambar dalam grup duplikat ini |
|
||||
|
||||
### File Object (within a group) {#file-object-within-a-group}
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Nama file asli |
|
||||
| similarity | number | Persentase kemiripan terhadap gambar referensi (yang pertama dalam grup) |
|
||||
| width | number | Lebar gambar dalam piksel |
|
||||
| height | number | Tinggi gambar dalam piksel |
|
||||
| fileSize | number | Ukuran file dalam byte |
|
||||
| format | string | Format gambar |
|
||||
| isBest | boolean | Apakah ini versi berkualitas tertinggi (piksel terbanyak, file terbesar) |
|
||||
| thumbnail | string or null | Thumbnail JPEG base64 (lebar 200px) untuk pratinjau |
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Menggunakan dHash 128-bit (baris 64-bit + kolom 64-bit) untuk deteksi kemiripan perseptual. Ini menangkap duplikat bahkan lintas pengubahan ukuran, kompresi ulang, dan penyuntingan kecil.
|
||||
- Threshold mewakili jarak Hamming maksimum antar hash. Nilai default 8 menangkap nyaris-duplikat sambil menghindari positif palsu. Gunakan 0 untuk yang identik piksel saja, atau 15-20 untuk pencocokan yang sangat longgar.
|
||||
- Gambar "terbaik" di setiap grup adalah yang memiliki piksel terbanyak (lebar x tinggi), dengan ukuran file sebagai pemecah seri.
|
||||
- Diperlukan setidaknya 2 gambar. File yang gagal validasi atau decoding dilaporkan di `skippedFiles` alih-alih menyebabkan seluruh permintaan gagal.
|
||||
- Thumbnail adalah pratinjau JPEG selebar 200px yang dikodekan sebagai data URI.
|
||||
- Semua format umum didukung (HEIC, RAW, PSD, SVG di-decode otomatis).
|
||||
@@ -0,0 +1,147 @@
|
||||
---
|
||||
description: "Ubah ukuran, optimalkan, ubah kecepatan, balik, putar, dan ekstrak frame dari GIF beranimasi dalam satu alat."
|
||||
i18n_source_hash: 5e525e80db92
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: eda9be0ce6e7
|
||||
---
|
||||
|
||||
# GIF Tools {#gif-tools}
|
||||
|
||||
Ubah ukuran, optimalkan, ubah kecepatan, balik, ekstrak frame, dan putar GIF beranimasi. Menyediakan beberapa mode operasi dalam satu alat.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/gif-tools`
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
### Common Parameters {#common-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| mode | string | No | `"resize"` | Mode operasi: `resize`, `optimize`, `speed`, `reverse`, `extract`, `rotate` |
|
||||
| loop | number | No | 0 | Jumlah loop untuk GIF output (0 = tak terbatas, 1-100 = loop terbatas) |
|
||||
|
||||
### Resize Mode Parameters {#resize-mode-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | No | - | Lebar target dalam piksel (1 hingga 16384) |
|
||||
| height | integer | No | - | Tinggi target dalam piksel (1 hingga 16384) |
|
||||
| percentage | number | No | - | Skala berdasarkan persentase (1 hingga 500). Mengesampingkan width/height bila diatur. |
|
||||
|
||||
### Optimize Mode Parameters {#optimize-mode-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| colors | number | No | 256 | Jumlah warna maksimum dalam palet (2 hingga 256) |
|
||||
| dither | number | No | 1.0 | Kekuatan dithering (0 hingga 1, di mana 0 menonaktifkan dithering) |
|
||||
| effort | number | No | 7 | Tingkat upaya optimasi (1 hingga 10, lebih tinggi = lebih lambat tetapi lebih kecil) |
|
||||
|
||||
### Speed Mode Parameters {#speed-mode-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| speedFactor | number | No | 1.0 | Pengali kecepatan (0.1 hingga 10). Nilai > 1 mempercepat, < 1 memperlambat. |
|
||||
|
||||
### Extract Mode Parameters {#extract-mode-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| extractMode | string | No | `"single"` | Mode ekstraksi: `single`, `range`, `all` |
|
||||
| frameNumber | number | No | 0 | Indeks frame yang akan diekstrak dalam mode `single` (berbasis 0) |
|
||||
| frameStart | number | No | 0 | Indeks frame awal untuk mode `range` (berbasis 0) |
|
||||
| frameEnd | number | No | - | Indeks frame akhir untuk mode `range` (berbasis 0, inklusif) |
|
||||
| extractFormat | string | No | `"png"` | Format untuk frame yang diekstrak: `png`, `webp` |
|
||||
|
||||
### Rotate Mode Parameters {#rotate-mode-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| angle | number | No | - | Sudut rotasi: `90`, `180`, atau `270` derajat |
|
||||
| flipH | boolean | No | `false` | Balik horizontal |
|
||||
| flipV | boolean | No | `false` | Balik vertikal |
|
||||
|
||||
## Example Requests {#example-requests}
|
||||
|
||||
### Resize {#resize}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools \
|
||||
-F "file=@animation.gif" \
|
||||
-F 'settings={"mode":"resize","percentage":50}'
|
||||
```
|
||||
|
||||
### Optimize {#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}'
|
||||
```
|
||||
|
||||
### Speed Up {#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}'
|
||||
```
|
||||
|
||||
### Extract Single Frame {#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"}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/animation.gif",
|
||||
"originalSize": 2345678,
|
||||
"processedSize": 1234567
|
||||
}
|
||||
```
|
||||
|
||||
## Info Sub-Route {#info-sub-route}
|
||||
|
||||
`POST /api/v1/tools/image/gif-tools/info`
|
||||
|
||||
Mengembalikan metadata tentang GIF beranimasi tanpa memprosesnya.
|
||||
|
||||
### Info Request {#info-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/gif-tools/info \
|
||||
-F "file=@animation.gif"
|
||||
```
|
||||
|
||||
### Info Response {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Menggunakan factory `createToolRoute` standar untuk endpoint pemrosesan utama.
|
||||
- Endpoint info hanya memerlukan unggahan file (tidak perlu pengaturan).
|
||||
- Dalam mode `resize`, bila `percentage` disediakan, ia diprioritaskan di atas `width`/`height`. Pengubahan ukuran menggunakan `fit: inside` untuk mempertahankan rasio aspek.
|
||||
- Dalam mode `speed`, delay frame dibagi dengan faktor kecepatan. Delay minimum per frame adalah 20ms (batasan spesifikasi GIF).
|
||||
- Dalam mode `reverse`, parameter `speedFactor` juga tersedia untuk menyesuaikan kecepatan sekaligus membalik.
|
||||
- Dalam mode `extract` dengan `range` atau `all`, output berupa file ZIP yang berisi frame-frame individual.
|
||||
- Dalam mode `rotate`, setiap frame diproses secara individual dan dirakit ulang menjadi animasi.
|
||||
- Parameter `loop` mengontrol berapa kali GIF output berputar. Gunakan 0 untuk perulangan tak terbatas.
|
||||
- Field `duration` dalam respons info adalah total durasi animasi dalam milidetik.
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
description: "Konversi GIF beranimasi ke WebP dan sebaliknya, mempertahankan semua frame."
|
||||
i18n_source_hash: 20946e5001cb
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: c056ac167026
|
||||
---
|
||||
|
||||
# GIF/WebP Converter {#gif-webp-converter}
|
||||
|
||||
Konversi file GIF beranimasi ke WebP dan sebaliknya, mempertahankan semua frame dan timing animasi. Animasi WebP umumnya 25-35% lebih kecil daripada GIF yang setara.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/gif-webp`
|
||||
|
||||
Menerima multipart form data dengan file GIF atau WebP dan sebuah field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| quality | integer | No | `80` | Kualitas output untuk encoding WebP (1-100) |
|
||||
| lossless | boolean | No | `false` | Gunakan kompresi WebP lossless |
|
||||
| resizePercent | integer | No | `100` | Skala output berdasarkan persentase (10-100) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/animation.webp",
|
||||
"originalSize": 3500000,
|
||||
"processedSize": 2200000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Hanya file `.gif` dan `.webp` yang diterima. Format gambar lain tidak didukung oleh alat ini.
|
||||
- Arah konversi bersifat otomatis: input GIF menghasilkan output WebP, dan input WebP menghasilkan output GIF.
|
||||
- Opsi `quality` dan `lossless` hanya berlaku saat encoding ke WebP. Saat mengonversi ke GIF, output menggunakan palet GIF standar.
|
||||
- Gunakan `resizePercent` untuk memperkecil dimensi (dan ukuran file) animasi berukuran besar.
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: "Hasilkan bagan histogram RGB dengan statistik per-channel dari sebuah gambar."
|
||||
i18n_source_hash: 57aa610206a5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 3694326d0131
|
||||
---
|
||||
|
||||
# Histogram {#histogram}
|
||||
|
||||
Hasilkan bagan histogram RGB dari sebuah gambar. Mengembalikan gambar histogram PNG beserta statistik per-channel dan data histogram 256-bin mentah dalam JSON respons.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/histogram`
|
||||
|
||||
Menerima multipart form data dengan file gambar dan sebuah field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| scale | string | No | `"linear"` | Skala sumbu Y: `linear` atau `log` |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Example Response {#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 }
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- `downloadUrl` menunjuk ke bagan histogram PNG yang telah dirender, menampilkan distribusi R, G, B, dan luminansi.
|
||||
- `bins` berisi array 256-nilai mentah untuk setiap channel (red, green, blue, luminance), cocok untuk merender visualisasi kustom.
|
||||
- `stats` menyediakan mean, median, dan deviasi standar per channel.
|
||||
- `mean` dan `max` adalah field ringkas yang kompatibel-mundur.
|
||||
- Gunakan skala `log` ketika histogram didominasi beberapa puncak dan Anda ingin melihat detail pada bin yang lebih rendah.
|
||||
- Input HEIC, RAW, PSD, dan SVG di-decode otomatis sebelum analisis.
|
||||
@@ -0,0 +1,81 @@
|
||||
---
|
||||
description: "Tangkap halaman web atau cuplikan HTML sebagai gambar berkualitas tinggi dengan emulasi perangkat."
|
||||
i18n_source_hash: 1e49d070ea2e
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 5dc54905d599
|
||||
---
|
||||
|
||||
# HTML to Image {#html-to-image}
|
||||
|
||||
Tangkap URL halaman web atau konten HTML mentah sebagai gambar screenshot. Mendukung emulasi perangkat (desktop, tablet, mobile), tangkapan halaman penuh, dan beberapa format output.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/html-to-image`
|
||||
|
||||
Menerima sebuah **body JSON** (bukan multipart). Tidak diperlukan unggahan file.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| url | string | Conditional | - | URL yang akan ditangkap (harus berupa URL valid) |
|
||||
| html | string | Conditional | - | Konten HTML mentah yang akan dirender (1 hingga 5.000.000 karakter) |
|
||||
| format | string | No | `"png"` | Format output: `jpg`, `png`, `webp` |
|
||||
| quality | number | No | `90` | Kualitas output untuk format lossy (1 hingga 100) |
|
||||
| fullPage | boolean | No | `false` | Tangkap seluruh halaman yang dapat digulir, bukan hanya viewport |
|
||||
| devicePreset | string | No | `"desktop"` | Emulasi perangkat: `desktop`, `tablet`, `mobile`, `custom` |
|
||||
| viewportWidth | number | No | `1280` | Lebar viewport kustom dalam piksel (320 hingga 3840, digunakan saat devicePreset adalah `custom`) |
|
||||
| viewportHeight | number | No | `720` | Tinggi viewport kustom dalam piksel (320 hingga 2160, digunakan saat devicePreset adalah `custom`) |
|
||||
|
||||
Salah satu dari `url` atau `html` harus disediakan, tetapi tidak keduanya.
|
||||
|
||||
### Device Presets {#device-presets}
|
||||
|
||||
| Preset | Width | Height | Mobile UA |
|
||||
|--------|-------|--------|-----------|
|
||||
| `desktop` | 1280 | 720 | No |
|
||||
| `tablet` | 768 | 1024 | No |
|
||||
| `mobile` | 375 | 812 | Yes |
|
||||
| `custom` | (ditentukan pengguna) | (ditentukan pengguna) | No |
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
Tangkap halaman web:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
Render konten 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"}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/screenshot.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 145000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan Chromium terpasang di server. Mengembalikan HTTP 503 bila layanan browser tidak tersedia.
|
||||
- URL divalidasi terhadap serangan SSRF (alamat jaringan privat/internal diblokir).
|
||||
- Endpoint ini dibatasi laju hingga 120 permintaan per jam.
|
||||
- `originalSize` selalu 0 karena alat ini menghasilkan gambar dari URL/HTML.
|
||||
- Nama file output adalah `screenshot.<format>`.
|
||||
- Bila halaman terlalu lama dimuat, permintaan mengembalikan HTTP 504 (gateway timeout).
|
||||
- Bila layanan browser berulang kali crash, ia dinonaktifkan sementara dan mengembalikan HTTP 503 dengan kode `BROWSER_CRASHED`.
|
||||
@@ -0,0 +1,99 @@
|
||||
---
|
||||
description: "Auto-enhance sekali klik yang menganalisis gambar dan mengoreksi eksposur, kontras, white balance, saturasi, dan ketajaman."
|
||||
i18n_source_hash: 42b6ab956f91
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 166ad1e1880f
|
||||
---
|
||||
|
||||
# Image Enhancement {#image-enhancement}
|
||||
|
||||
Peningkatan otomatis sekali klik dengan analisis cerdas. Menganalisis gambar dan menerapkan koreksi eksposur, kontras, white balance, saturasi, ketajaman, dan denoising.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-enhancement`
|
||||
|
||||
**Processing:** Sinkron (menggunakan factory `createToolRoute`, mengembalikan hasil secara langsung)
|
||||
|
||||
**Model bundle:** Tidak diperlukan untuk peningkatan dasar. Bundle `upscale-enhance` (5-6 GB) hanya digunakan ketika `deepEnhance` diaktifkan (untuk penghilangan noise AI melalui SCUNet).
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | File gambar (multipart) |
|
||||
| mode | string | No | `"auto"` | Mode peningkatan: `auto`, `portrait`, `landscape`, `low-light`, `food`, `document` |
|
||||
| intensity | number | No | `50` | Intensitas peningkatan keseluruhan (0-100) |
|
||||
| corrections | object | No | semua `true` | Koreksi selektif yang akan diterapkan (lihat di bawah) |
|
||||
| deepEnhance | boolean | No | `false` | Aktifkan penghilangan noise bertenaga AI (membutuhkan alat `noise-removal` terpasang) |
|
||||
|
||||
### Corrections Object {#corrections-object}
|
||||
|
||||
| Field | Type | Default | Description |
|
||||
|-------|------|---------|-------------|
|
||||
| exposure | boolean | `true` | Koreksi eksposur otomatis |
|
||||
| contrast | boolean | `true` | Koreksi kontras otomatis |
|
||||
| whiteBalance | boolean | `true` | Koreksi white balance otomatis |
|
||||
| saturation | boolean | `true` | Koreksi saturasi otomatis |
|
||||
| sharpness | boolean | `true` | Penajaman otomatis |
|
||||
| denoise | boolean | `true` | Denoising ringan |
|
||||
|
||||
## Example Request {#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}}'
|
||||
```
|
||||
|
||||
## Response (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo.jpg",
|
||||
"originalSize": 300000,
|
||||
"processedSize": 310000
|
||||
}
|
||||
```
|
||||
|
||||
## Analyze Endpoint {#analyze-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-enhancement/analyze`
|
||||
|
||||
Menganalisis gambar dan mengembalikan rekomendasi koreksi tanpa menerapkannya.
|
||||
|
||||
### Parameters {#parameters-1}
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| file | file | Yes | File gambar (multipart) |
|
||||
|
||||
### Example Request {#example-request-1}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/image-enhancement/analyze \
|
||||
-F "file=@photo.jpg"
|
||||
```
|
||||
|
||||
### Response (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" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Alat ini menggunakan factory sinkron `createToolRoute`, jadi ia mengembalikan respons standar (bukan 202 async).
|
||||
- Parameter `mode` menyesuaikan bagaimana koreksi dibobotkan (mis., mode portrait lebih lembut pada rona kulit, mode landscape meningkatkan saturasi).
|
||||
- Ketika `deepEnhance` diaktifkan dan alat `noise-removal` (SCUNet) terpasang, satu tahap denoising AI tambahan diterapkan setelah koreksi standar.
|
||||
- Endpoint analyze berguna untuk melihat pratinjau koreksi apa yang akan diterapkan sebelum menetapkannya.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui decoding otomatis.
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
description: "Tambahkan padding pada gambar ke rasio aspek target dengan latar belakang warna solid, transparan, atau buram."
|
||||
i18n_source_hash: 796122da3dae
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 79d2efad26d9
|
||||
---
|
||||
|
||||
# Image Pad {#image-pad}
|
||||
|
||||
Tambahkan padding pada gambar ke rasio aspek target dengan menambahkan latar belakang warna solid, transparan, atau buram di sekitarnya. Berguna untuk menyesuaikan gambar ke rasio aspek tetap untuk media sosial atau cetak tanpa pemotongan.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-pad`
|
||||
|
||||
Menerima multipart form data dengan file gambar dan sebuah field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| target | string | No | `"1:1"` | Rasio aspek target: `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, atau `custom` |
|
||||
| ratioW | integer | No | `1` | Lebar rasio kustom (1-100, digunakan saat target adalah `custom`) |
|
||||
| ratioH | integer | No | `1` | Tinggi rasio kustom (1-100, digunakan saat target adalah `custom`) |
|
||||
| background | string | No | `"color"` | Mode latar belakang: `color`, `transparent`, atau `blur` |
|
||||
| color | string | No | `"#ffffff"` | Warna hex latar belakang (saat background adalah `color`) |
|
||||
| padding | integer | No | `0` | Padding tambahan sebagai persentase kanvas (0-50) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 3100000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Mode latar belakang `blur` membuat salinan buram dari gambar asli sebagai pengisi padding, menghasilkan hasil yang kohesif secara visual.
|
||||
- Saat menggunakan latar belakang `transparent`, output dikonversi ke PNG untuk mempertahankan alpha.
|
||||
- Format output mengikuti format input kecuali bila transparansi terlibat. Input HEIC, RAW, PSD, dan SVG di-decode otomatis sebelum pemrosesan.
|
||||
- Atur `target` ke `custom` dan sediakan `ratioW` serta `ratioH` untuk rasio aspek sembarang (mis., `ratioW: 3, ratioH: 2` untuk 3:2).
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Konversi gambar menjadi data URI base64 untuk disematkan di HTML, CSS, dan lainnya."
|
||||
i18n_source_hash: ba4b8f3b4ece
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 227c40249375
|
||||
---
|
||||
|
||||
# Image to Base64 {#image-to-base64}
|
||||
|
||||
Konversi satu atau lebih gambar menjadi string dan data URI berenkode base64. Mendukung konversi format opsional, kontrol kualitas, dan pengubahan ukuran. Berguna untuk menyematkan gambar langsung di HTML, CSS, JSON, atau template email.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-to-base64`
|
||||
|
||||
Menerima multipart form data dengan satu atau lebih file gambar dan sebuah field JSON `settings` opsional.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| outputFormat | string | No | `"original"` | Konversi sebelum encoding: `original`, `jpeg`, `png`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | No | `80` | Kualitas output untuk format lossy (1 hingga 100) |
|
||||
| maxWidth | number | No | `0` | Lebar maksimum dalam piksel (0 = tanpa pengubahan ukuran, tidak akan memperbesar) |
|
||||
| maxHeight | number | No | `0` | Tinggi maksimum dalam piksel (0 = tanpa pengubahan ukuran, tidak akan memperbesar) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
Beberapa file:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
## Example Response {#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": []
|
||||
}
|
||||
```
|
||||
|
||||
## Response Fields {#response-fields}
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| results | array | Gambar yang berhasil dikonversi |
|
||||
| errors | array | Gambar yang gagal diproses (dengan nama file dan pesan error) |
|
||||
|
||||
### Result Object {#result-object}
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Nama file asli |
|
||||
| mimeType | string | Tipe MIME dari output yang dikodekan |
|
||||
| width | number | Lebar akhir dalam piksel (setelah pengubahan ukuran, jika ada) |
|
||||
| height | number | Tinggi akhir dalam piksel (setelah pengubahan ukuran, jika ada) |
|
||||
| originalSize | number | Ukuran file asli dalam byte |
|
||||
| encodedSize | number | Ukuran string base64 dalam byte |
|
||||
| overheadPercent | number | Persentase perbedaan ukuran vs asli (positif = lebih besar, negatif = lebih kecil) |
|
||||
| base64 | string | Data gambar berenkode base64 mentah |
|
||||
| dataUri | string | Data URI lengkap siap digunakan pada atribut `src` |
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Encoding base64 umumnya menaikkan ukuran sekitar 33% dibandingkan file biner. Field `overheadPercent` menunjukkan perbedaan yang sebenarnya.
|
||||
- Ketika `outputFormat` adalah `"original"`, file HEIC/HEIF dikonversi ke JPEG (karena browser tidak dapat menampilkan HEIC dalam data URI).
|
||||
- Opsi `maxWidth` dan `maxHeight` mengubah ukuran menggunakan `fit: inside` dengan `withoutEnlargement`, sehingga gambar yang lebih kecil dari dimensi yang ditentukan tidak diperbesar.
|
||||
- Beberapa file dapat diproses dalam satu permintaan. Setiap file diproses secara independen, dan kegagalan tidak menghalangi file lain untuk berhasil.
|
||||
- File SVG diteruskan sebagai `image/svg+xml` tanpa encoding ulang (kecuali konversi format diminta).
|
||||
- Ini adalah endpoint read-only. Ia tidak menghasilkan file yang dapat diunduh atau sebuah `jobId`. Data base64 dikembalikan langsung di body respons.
|
||||
@@ -0,0 +1,119 @@
|
||||
---
|
||||
description: "Gabungkan satu atau lebih gambar menjadi dokumen PDF dengan opsi ukuran halaman, orientasi, dan ukuran file target."
|
||||
i18n_source_hash: f659c7e7f56b
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 968ad5429bc4
|
||||
---
|
||||
|
||||
# Image to PDF {#image-to-pdf}
|
||||
|
||||
Gabungkan satu atau lebih gambar menjadi dokumen PDF. Mendukung beberapa ukuran halaman, orientasi, margin, dan penargetan ukuran file opsional melalui penyesuaian kualitas.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/image-to-pdf`
|
||||
|
||||
Menerima multipart form data dengan satu atau lebih file gambar dan sebuah field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| pageSize | string | No | `"A4"` | Ukuran halaman: `A4`, `Letter`, `A3`, `A5` |
|
||||
| orientation | string | No | `"portrait"` | Orientasi halaman: `portrait` atau `landscape` |
|
||||
| margin | number | No | `20` | Margin halaman dalam poin (0-500) |
|
||||
| targetSize | object | No | - | Batasan ukuran file target (lihat di bawah) |
|
||||
| collate | boolean | No | `true` | Gabungkan semua gambar menjadi satu PDF. Bila `false`, membuat satu PDF per gambar. |
|
||||
|
||||
### Target Size Object {#target-size-object}
|
||||
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| value | number | Yes | Nilai ukuran target |
|
||||
| unit | string | Yes | Unit: `KB` atau `MB` |
|
||||
|
||||
Ukuran target minimum adalah 50 KB.
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
PDF multi-gambar dasar:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Dengan target ukuran file:
|
||||
|
||||
```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"}}'
|
||||
```
|
||||
|
||||
Satu PDF per gambar:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response (Collated) {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Example Response (Non-Collated) {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Example Response (With Target Size) {#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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Gambar dipusatkan pada halaman dan diskalakan agar pas di dalam margin sambil mempertahankan rasio aspek. Gambar tidak pernah diperbesar.
|
||||
- Ketika `collate` adalah `false`, setiap gambar menjadi file PDF terpisah, dan unduhannya berupa arsip ZIP yang berisi semua PDF.
|
||||
- Fitur ukuran target menggunakan pencarian biner iteratif atas tingkat kualitas JPEG (10-95) untuk menemukan kualitas terbaik yang pas dalam anggaran.
|
||||
- Gambar transparan diratakan ke putih sebelum disematkan ke PDF.
|
||||
- Format input yang didukung: JPEG, PNG, WebP, AVIF, TIFF, GIF, HEIC, RAW, PSD, SVG, dan lainnya.
|
||||
- Orientasi EXIF diterapkan otomatis sebelum penyematan.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
description: "Lihat metadata gambar terperinci, properti, dan statistik histogram per-channel."
|
||||
i18n_source_hash: 8a0f7a0b0153
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d007549742c9
|
||||
---
|
||||
|
||||
# Image Info {#image-info}
|
||||
|
||||
Alat analisis read-only yang mengembalikan metadata gambar komprehensif termasuk dimensi, format, ruang warna, keberadaan EXIF/ICC/XMP, dan statistik histogram per-channel. Tidak menghasilkan file output yang telah diproses.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/info`
|
||||
|
||||
Menerima multipart form data dengan file gambar. Tidak diperlukan field pengaturan.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
Alat ini tidak memiliki parameter yang dapat dikonfigurasi. Cukup unggah file gambar.
|
||||
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| file | file | Yes | Gambar yang akan dianalisis |
|
||||
|
||||
## Example Request {#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"
|
||||
```
|
||||
|
||||
## Example Response {#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 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Response Fields {#response-fields}
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| filename | string | Nama file yang telah disanitasi |
|
||||
| fileSize | number | Ukuran file dalam byte |
|
||||
| width | number | Lebar gambar dalam piksel |
|
||||
| height | number | Tinggi gambar dalam piksel |
|
||||
| format | string | Format yang terdeteksi (jpeg, png, webp, dll.) |
|
||||
| channels | number | Jumlah channel warna |
|
||||
| hasAlpha | boolean | Apakah gambar memiliki channel alpha |
|
||||
| colorSpace | string | Ruang warna (srgb, cmyk, dll.) |
|
||||
| density | number or null | Resolusi DPI/PPI |
|
||||
| isProgressive | boolean | Apakah JPEG menggunakan encoding progresif |
|
||||
| orientation | number or null | Nilai orientasi EXIF (1-8) |
|
||||
| hasProfile | boolean | Apakah ada profil ICC yang tersemat |
|
||||
| hasExif | boolean | Apakah metadata EXIF ada |
|
||||
| hasIcc | boolean | Apakah profil warna ICC ada |
|
||||
| hasXmp | boolean | Apakah metadata XMP ada |
|
||||
| bitDepth | string or null | Bit per sampel |
|
||||
| pages | number | Jumlah halaman (untuk format multi-halaman seperti TIFF, GIF) |
|
||||
| histogram | array | Statistik per-channel (min, max, mean, deviasi standar) |
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Ini adalah endpoint read-only. Ia tidak menghasilkan file output yang dapat diunduh atau sebuah `jobId`.
|
||||
- Untuk gambar format RAW (DNG, CR2, NEF, ARW, dll.), ExifTool digunakan untuk mengekstrak dimensi sensor asli dan flag metadata yang tidak dapat dibaca Sharp secara langsung.
|
||||
- File HEIC/HEIF di-decode ke PNG secara internal untuk mengekstrak statistik piksel, karena Sharp tidak dapat men-decode piksel HEVC.
|
||||
- Histogram menyediakan min/max/mean/stdev per channel, bukan distribusi 256-bin penuh.
|
||||
- Field `density` mencerminkan metadata DPI yang tersemat, bila ada.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Hasilkan placeholder gambar berkualitas rendah berukuran mungil dengan data URI base64."
|
||||
i18n_source_hash: f8a27c8021f5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: b64493b73d7c
|
||||
---
|
||||
|
||||
# LQIP Placeholder {#lqip-placeholder}
|
||||
|
||||
Hasilkan placeholder gambar berkualitas rendah (LQIP) berukuran mungil dari gambar sumber. Mengembalikan file placeholder kecil beserta data URI base64, tag `<img>` HTML siap pakai, dan cuplikan `background-image` CSS untuk penyematan langsung.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/lqip-placeholder`
|
||||
|
||||
Menerima multipart form data dengan file gambar dan sebuah field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | No | `16` | Lebar target dalam piksel (4-64) |
|
||||
| blur | number | No | `2` | Radius blur untuk strategi blur (0-20) |
|
||||
| strategy | string | No | `"blur"` | Strategi placeholder: `blur`, `pixelate`, atau `solid` |
|
||||
| format | string | No | `"webp"` | Format output: `webp`, `png`, atau `jpeg` |
|
||||
| quality | integer | No | `50` | Kualitas output (1-100) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Example Response {#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;"
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Field `dataUri` berisi data URI lengkap, siap digunakan pada atribut `src` atau CSS tanpa permintaan tambahan.
|
||||
- Field `html` dan `css` menyediakan cuplikan salin-tempel untuk kasus penggunaan umum.
|
||||
- Strategi `blur` menghasilkan thumbnail lembut yang buram. Strategi `pixelate` membuat mosaik berkotak-kotak. Strategi `solid` mengembalikan satu warna rata-rata.
|
||||
- Ukuran placeholder tipikal adalah 200-500 byte, sehingga cocok untuk disisipkan langsung di HTML.
|
||||
- Tinggi dihitung secara otomatis untuk mempertahankan rasio aspek gambar sumber.
|
||||
- Input HEIC, RAW, PSD, dan SVG di-decode otomatis sebelum pemrosesan.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
description: "Buat meme dengan template atau gambar kustom, kotak teks bergaya, dan opsi font."
|
||||
i18n_source_hash: 0a4970112ca6
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d7f0e92faa8c
|
||||
---
|
||||
|
||||
# Meme Generator {#meme-generator}
|
||||
|
||||
Buat meme menggunakan template bawaan atau gambar kustom. Tambahkan teks dengan gaya meme klasik (teks tebal dengan garis tepi), beberapa preset tata letak, dan pilihan font.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/meme-generator`
|
||||
|
||||
Menerima salah satu dari:
|
||||
- **Multipart form data** dengan berkas gambar dan field JSON `settings` (mode gambar kustom)
|
||||
- **JSON body** dengan `templateId` (mode template, tanpa perlu unggah berkas)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| templateId | string | No | - | ID template meme bawaan. Jika disediakan, tidak perlu mengunggah gambar |
|
||||
| textLayout | string | No | `"top-bottom"` | Tata letak kotak teks: `top-bottom`, `top-only`, `bottom-only`, `center`, `side-by-side` |
|
||||
| textBoxes | array | No | `[]` | Array objek kotak teks dengan field `id` dan `text` |
|
||||
| fontFamily | string | No | `"anton"` | Font: `anton`, `arial-black`, `comic-sans`, `montserrat`, `bebas-neue`, `permanent-marker`, `roboto` |
|
||||
| fontSize | number | No | auto | Ukuran font dalam piksel (8 hingga 200). Dihitung otomatis jika dihilangkan |
|
||||
| textColor | string | No | `"#ffffff"` | Warna isi teks |
|
||||
| strokeColor | string | No | `"#000000"` | Warna garis tepi/outline teks |
|
||||
| textAlign | string | No | `"center"` | Perataan teks: `left`, `center`, `right` |
|
||||
| allCaps | boolean | No | `true` | Ubah teks menjadi huruf besar |
|
||||
|
||||
### Text Boxes {#text-boxes}
|
||||
|
||||
Setiap entri dalam array `textBoxes` harus memiliki:
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| id | string | Pengenal kotak yang cocok dengan tata letak (mis., `"top"`, `"bottom"`, `"left"`, `"right"`, `"center"`) |
|
||||
| text | string | Teks meme yang akan ditampilkan |
|
||||
|
||||
### Text Layout Box IDs {#text-layout-box-ids}
|
||||
|
||||
| Layout | Available Box IDs |
|
||||
|--------|-------------------|
|
||||
| `top-bottom` | `top`, `bottom` |
|
||||
| `top-only` | `top` |
|
||||
| `bottom-only` | `bottom` |
|
||||
| `center` | `center` |
|
||||
| `side-by-side` | `left`, `right` |
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
Gambar kustom dengan teks atas dan bawah:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Menggunakan template bawaan (JSON body, tanpa unggah berkas):
|
||||
|
||||
```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"}]}'
|
||||
```
|
||||
|
||||
## Example Response {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Salah satu dari `templateId` atau berkas gambar yang diunggah wajib disediakan. Menyediakan keduanya akan menggunakan template.
|
||||
- Template menentukan posisi kotak teksnya sendiri; parameter `textLayout` diabaikan saat menggunakan template.
|
||||
- Teks dirender sebagai SVG dengan outline garis tepi untuk tampilan meme klasik.
|
||||
- Ukuran font dihitung otomatis agar pas dengan kotak teks jika tidak diatur secara eksplisit.
|
||||
- Kotak teks kosong dilewati (tidak ada rendering yang terjadi jika semua kotak kosong).
|
||||
- Nama berkas output menyertakan ID template saat menggunakan template (mis., `meme-drake.png`).
|
||||
- Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: "Penghilangan noise dan grain bertenaga AI dengan opsi kualitas multi-tingkat."
|
||||
i18n_source_hash: f0dfc876e0e0
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 0d5fc72e4c42
|
||||
---
|
||||
|
||||
# Noise Removal {#noise-removal}
|
||||
|
||||
Penghilangan noise dan grain bertenaga AI dengan opsi kualitas multi-tingkat, menggunakan sidecar Python (model SCUNet).
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/noise-removal`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `upscale-enhance` (5-6 GB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | Berkas gambar (multipart) |
|
||||
| tier | string | No | `"balanced"` | Tingkat kualitas: `quick`, `balanced`, `quality`, `maximum` |
|
||||
| strength | number | No | `50` | Kekuatan denoising (0-100) |
|
||||
| detailPreservation | number | No | `50` | Seberapa banyak detail yang dipertahankan (0-100). Nilai lebih tinggi menyimpan lebih banyak tekstur |
|
||||
| colorNoise | number | No | `30` | Kekuatan pengurangan noise warna (0-100) |
|
||||
| format | string | No | `"original"` | Format output: `original`, `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | No | `90` | Kualitas enkode output (1-100) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Denoising...","percent":65}
|
||||
```
|
||||
|
||||
### Final Result (via 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan model bundle `upscale-enhance` terpasang (5-6 GB).
|
||||
- Tingkat kualitas menukar kecepatan dengan kualitas: `quick` paling cepat dengan denoising dasar, `maximum` menggunakan pendekatan multi-pass paling menyeluruh.
|
||||
- Parameter `detailPreservation` krusial untuk subjek bertekstur (kain, rambut, dedaunan). Nilai lebih tinggi mencegah denoiser menghaluskan detail halus.
|
||||
- Saat `format` diatur ke `"original"`, format output mengikuti format berkas input.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR via dekode otomatis.
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: "Ekstrak teks dari gambar menggunakan pengenalan karakter optik bertenaga AI."
|
||||
i18n_source_hash: 3d85d423b82c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 150d020adc2e
|
||||
---
|
||||
|
||||
# OCR / Text Extraction {#ocr-text-extraction}
|
||||
|
||||
Ekstrak teks dari gambar menggunakan pengenalan karakter optik bertenaga AI. Mendukung banyak bahasa dan tingkat kualitas.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/ocr`
|
||||
|
||||
**Processing:** Respons JSON sinkron. Jika `clientJobId` disediakan, progres juga dilaporkan melalui SSE.
|
||||
|
||||
**Model bundle:** `ocr` (5-6 GB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | Berkas gambar (multipart) |
|
||||
| quality | string | No | `"balanced"` | Tingkat kualitas: `fast` (Tesseract), `balanced` (PaddleOCR v5), `best` (PaddleOCR VL) |
|
||||
| language | string | No | `"auto"` | Petunjuk bahasa: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
|
||||
| enhance | boolean | No | `true` | Praproses gambar untuk akurasi OCR yang lebih baik |
|
||||
| engine | string | No | - | Usang. Gunakan `quality` sebagai gantinya. Memetakan `tesseract` ke `fast`, `paddleocr` ke `balanced` |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Response (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"
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE, optional) {#progress-sse-optional}
|
||||
|
||||
Jika field form `clientJobId` disediakan, event progres dialirkan:
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Recognizing text...","percent":50}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan model bundle `ocr` terpasang (5-6 GB).
|
||||
- OCR mengembalikan teks yang diekstraksi secara langsung, bukan URL unduhan gambar.
|
||||
- Menggunakan rantai fallback: jika tingkat kualitas lebih tinggi crash (mis., PaddleOCR segfault), akan otomatis mencoba ulang dengan tingkat yang lebih rendah.
|
||||
- Jika suatu tingkat mengembalikan teks kosong tanpa crash, juga akan jatuh ke tingkat berikutnya.
|
||||
- Tingkat kualitas dipetakan ke engine: `fast` = Tesseract, `balanced` = PaddleOCR v5, `best` = PaddleOCR VL.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR via dekode otomatis.
|
||||
@@ -0,0 +1,74 @@
|
||||
---
|
||||
description: "Optimalkan gambar untuk pengiriman web dengan konversi format, kontrol kualitas, pengubahan ukuran, dan penghapusan metadata."
|
||||
i18n_source_hash: c327bbbce768
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: a0eddef99d35
|
||||
---
|
||||
|
||||
# Optimize for Web {#optimize-for-web}
|
||||
|
||||
Optimalkan gambar untuk pengiriman web dalam satu langkah. Menggabungkan konversi format, penyesuaian kualitas, pengubahan ukuran opsional, enkode progresif, dan penghapusan metadata.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/optimize-for-web`
|
||||
|
||||
Menerima multipart form data dengan berkas gambar dan field JSON `settings`.
|
||||
|
||||
Endpoint live preview juga tersedia di `POST /api/v1/tools/image/optimize-for-web/preview`, yang mengembalikan gambar yang telah diproses secara langsung sebagai biner (tanpa membuat workspace) untuk penyetelan parameter secara real-time.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| format | string | No | `"webp"` | Format output: `webp`, `jpeg`, `avif`, `png`, `jxl` |
|
||||
| quality | number | No | `80` | Kualitas output (1-100) |
|
||||
| maxWidth | number | No | - | Lebar maksimum dalam piksel. Gambar diperkecil jika lebih lebar. |
|
||||
| maxHeight | number | No | - | Tinggi maksimum dalam piksel. Gambar diperkecil jika lebih tinggi. |
|
||||
| progressive | boolean | No | `true` | Aktifkan enkode progresif/interlaced |
|
||||
| stripMetadata | boolean | No | `true` | Hapus metadata EXIF, GPS, ICC, dan XMP |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
Optimalkan untuk AVIF dengan kompresi agresif:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.webp",
|
||||
"originalSize": 4500000,
|
||||
"processedSize": 320000
|
||||
}
|
||||
```
|
||||
|
||||
### Preview Endpoint Response {#preview-endpoint-response}
|
||||
|
||||
Endpoint preview (`/api/v1/tools/image/optimize-for-web/preview`) mengembalikan gambar biner secara langsung dengan header informasional:
|
||||
|
||||
- `X-Original-Size` - Ukuran berkas asli dalam byte
|
||||
- `X-Processed-Size` - Ukuran berkas yang telah diproses dalam byte
|
||||
- `X-Output-Filename` - Nama berkas output yang telah di-encode URL
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Alat ini dirancang sebagai pipeline optimasi satu-atap untuk aset web. Alat ini menangani konversi format, penyetelan kualitas, pembatasan dimensi maksimum, dan penghapusan metadata dalam satu lintasan.
|
||||
- Ekstensi nama berkas output diperbarui agar sesuai dengan format yang dipilih.
|
||||
- Enkode JXL (JPEG XL) menggunakan enkoder CLI khusus. Gambar diproses terlebih dahulu sebagai PNG, lalu di-encode ke JXL.
|
||||
- Enkode progresif memperbaiki waktu muat yang dirasakan untuk JPEG dan PNG dengan memungkinkan peramban merender pratinjau kualitas rendah sebelum gambar penuh selesai dimuat.
|
||||
- Endpoint preview lebih ringan (tanpa pembuatan workspace/job) dan ditujukan untuk UI penyetelan parameter live di frontend.
|
||||
@@ -0,0 +1,173 @@
|
||||
---
|
||||
description: "Pembuat foto paspor dan ID bertenaga AI dengan deteksi wajah, penghapusan latar belakang, dan penataan lembar cetak."
|
||||
i18n_source_hash: d4b4f4ced988
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e4dd75bbe828
|
||||
---
|
||||
|
||||
# Passport Photo {#passport-photo}
|
||||
|
||||
Pembuat foto paspor dan ID bertenaga AI. Alur kerja dua fase: analisis (deteksi wajah + penghapusan latar belakang) lalu generasi (pemotongan, pengubahan ukuran, dan penataan untuk pencetakan).
|
||||
|
||||
## API Endpoints {#api-endpoints}
|
||||
|
||||
Alat ini menggunakan alur dua fase dengan endpoint terpisah untuk analisis dan generasi.
|
||||
|
||||
**Model bundles:** `background-removal` dan `face-detection`
|
||||
|
||||
---
|
||||
|
||||
### Phase 1: Analyze {#phase-1-analyze}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo/analyze`
|
||||
|
||||
Mendeteksi landmark wajah dan menghapus latar belakang. Mengembalikan data landmark dan pratinjau agar frontend dapat menampilkan pratinjau pemotongan.
|
||||
|
||||
#### Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | Berkas gambar (multipart) |
|
||||
| clientJobId | string | No | - | ID job opsional untuk pelacakan progres via SSE |
|
||||
|
||||
#### Example Request {#example-request}
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/passport-photo/analyze \
|
||||
-F "file=@headshot.jpg"
|
||||
```
|
||||
|
||||
#### Response (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
|
||||
}
|
||||
```
|
||||
|
||||
#### Progress (SSE, optional) {#progress-sse-optional}
|
||||
|
||||
Jika `clientJobId` disediakan, progres dialirkan (0-30% untuk deteksi wajah, 30-95% untuk penghapusan latar belakang).
|
||||
|
||||
#### Error: No Face Detected (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."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: Generate {#phase-2-generate}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo/generate`
|
||||
|
||||
Memotong, mengubah ukuran, dan secara opsional menata foto ke lembar cetak. Menggunakan gambar yang di-cache dari Fase 1 (tanpa menjalankan ulang AI).
|
||||
|
||||
#### Parameters (JSON body) {#parameters-json-body}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| jobId | string | Yes | - | ID job dari Fase 1 |
|
||||
| filename | string | Yes | - | Nama berkas asli dari Fase 1 |
|
||||
| countryCode | string | Yes | - | Kode negara untuk spesifikasi paspor (mis., `US`, `GB`, `IN`) |
|
||||
| documentType | string | No | `"passport"` | Jenis dokumen (dari spesifikasi negara) |
|
||||
| bgColor | string | No | `"#FFFFFF"` | Warna latar belakang hex |
|
||||
| printLayout | string | No | `"none"` | Tata letak kertas cetak: `none`, `4x6`, `a4` |
|
||||
| maxFileSizeKb | number | No | `0` | Batasan ukuran berkas maksimum dalam KB (0 = tanpa batas) |
|
||||
| dpi | number | No | `300` | DPI output (72-1200) |
|
||||
| customWidthMm | number | No | - | Lebar foto kustom dalam mm (menimpa spesifikasi negara) |
|
||||
| customHeightMm | number | No | - | Tinggi foto kustom dalam mm (menimpa spesifikasi negara) |
|
||||
| zoom | number | No | `1` | Faktor zoom (0.5-3). Nilai > 1 memotong lebih ketat |
|
||||
| adjustX | number | No | `0` | Penyesuaian posisi horizontal |
|
||||
| adjustY | number | No | `0` | Penyesuaian posisi vertikal |
|
||||
| landmarks | object | Yes | - | Objek landmark dari respons Fase 1 |
|
||||
| imageWidth | number | Yes | - | Lebar gambar dari respons Fase 1 |
|
||||
| imageHeight | number | Yes | - | Tinggi gambar dari respons Fase 1 |
|
||||
|
||||
#### Example Request {#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
|
||||
}'
|
||||
```
|
||||
|
||||
#### Response (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"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Base Route {#base-route}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo`
|
||||
|
||||
Mengembalikan panduan untuk menggunakan sub-endpoint yang benar.
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "Use /api/v1/tools/image/passport-photo/analyze or /generate"
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan model bundle `background-removal` dan `face-detection` terpasang.
|
||||
- Fase 1 menjalankan AI (landmark wajah + penghapusan latar belakang) dan meng-cache hasilnya. Fase 2 adalah manipulasi gambar Sharp murni (cepat, tanpa perlu AI).
|
||||
- Landmark dikembalikan sebagai koordinat ternormalisasi (rentang 0-1 relatif terhadap dimensi gambar).
|
||||
- Field `preview` dalam respons analisis adalah PNG yang di-encode base64 (maks lebar 800px) untuk tampilan cepat.
|
||||
- Spesifikasi negara mencakup dimensi dokumen, rasio tinggi kepala, dan penempatan garis mata berdasarkan persyaratan foto paspor resmi.
|
||||
- Opsi `printLayout` menghasilkan lembar yang ditata pada kertas 4x6\" atau A4 dengan gutter 2mm di antara foto.
|
||||
- Saat `maxFileSizeKb` diatur, output dikompresi secara iteratif agar pas dalam batas ukuran.
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
description: "Terapkan efek pikselasi ke seluruh gambar atau area tertentu."
|
||||
i18n_source_hash: a3ad29841f7b
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 64397dfa435a
|
||||
---
|
||||
|
||||
# Pixelate {#pixelate}
|
||||
|
||||
Terapkan efek pikselasi ke seluruh gambar atau area persegi panjang tertentu. Berguna untuk mengaburkan konten sensitif seperti wajah, pelat nomor, atau informasi pribadi.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/pixelate`
|
||||
|
||||
Menerima multipart form data dengan berkas gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| blockSize | integer | No | `12` | Ukuran blok piksel (2-128); nilai lebih besar menghasilkan pikselasi lebih kasar |
|
||||
| region | object | No | - | Batasi pikselasi ke sebuah persegi panjang (lihat di bawah) |
|
||||
|
||||
### Region Object {#region-object}
|
||||
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| left | integer | Yes | Offset kiri dalam piksel (>= 0) |
|
||||
| top | integer | Yes | Offset atas dalam piksel (>= 0) |
|
||||
| width | integer | Yes | Lebar area dalam piksel (>= 1) |
|
||||
| height | integer | Yes | Tinggi area dalam piksel (>= 1) |
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
Pikselasikan seluruh gambar:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Pikselasikan area tertentu:
|
||||
|
||||
```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}}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2380000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Saat `region` dihilangkan, seluruh gambar dipikselasi.
|
||||
- Koordinat area dalam piksel relatif terhadap sudut kiri atas gambar. Area harus berada dalam batas gambar.
|
||||
- Format output mengikuti format input. Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
description: "Buat kode QR dengan warna kustom dan tingkat koreksi kesalahan."
|
||||
i18n_source_hash: 096ef4d90da5
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f2de527b0127
|
||||
---
|
||||
|
||||
# QR Code Generator {#qr-code-generator}
|
||||
|
||||
Buat gambar kode QR dari teks atau URL dengan ukuran, tingkat koreksi kesalahan, dan warna latar depan/latar belakang kustom yang dapat dikonfigurasi.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/qr-generate`
|
||||
|
||||
Menerima **JSON body** (bukan multipart). Tidak perlu unggah berkas.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Yes | - | Konten yang di-encode dalam kode QR (1 hingga 2000 karakter) |
|
||||
| size | number | No | `400` | Lebar/tinggi gambar output dalam piksel (100 hingga 10000) |
|
||||
| errorCorrection | string | No | `"M"` | Tingkat koreksi kesalahan: `L` (7%), `M` (15%), `Q` (25%), `H` (30%) |
|
||||
| foreground | string | No | `"#000000"` | Warna latar depan/modul kode QR dalam hex (`#RRGGBB`) |
|
||||
| background | string | No | `"#FFFFFF"` | Warna latar belakang kode QR dalam hex (`#RRGGBB`) |
|
||||
| logoDataUri | string | No | - | Gambar logo sebagai data URI (`data:image/png;base64,...` atau `data:image/jpeg;base64,...`, maks 700 KB). Diposisikan di tengah kode QR pada 22% dari ukuran QR. Memaksa koreksi kesalahan ke `H` |
|
||||
|
||||
### Error Correction Levels {#error-correction-levels}
|
||||
|
||||
| Level | Recovery | Use Case |
|
||||
|-------|----------|----------|
|
||||
| `L` | ~7% | Kepadatan data maksimum |
|
||||
| `M` | ~15% | Seimbang (default) |
|
||||
| `Q` | ~25% | Baik untuk kode cetak |
|
||||
| `H` | ~30% | Terbaik untuk kode dengan overlay logo |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
Kode QR bermerek dengan warna kustom:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/qrcode.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 4520
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Endpoint ini menerima JSON, bukan multipart form data, karena tidak perlu unggah gambar.
|
||||
- Output selalu berupa gambar PNG.
|
||||
- Nama berkas output selalu `qrcode.png`.
|
||||
- `originalSize` selalu 0 karena alat ini menghasilkan gambar dari awal.
|
||||
- Zona sunyi 2 modul (margin) disertakan di sekitar kode QR.
|
||||
- Panjang teks maksimum adalah 2000 karakter. Kapasitas sebenarnya bergantung pada tingkat koreksi kesalahan dan enkode karakter.
|
||||
- Tingkat koreksi kesalahan yang lebih tinggi memungkinkan kode QR tetap dapat dipindai meskipun sebagian tertutup, tetapi mengurangi kapasitas data.
|
||||
- Saat `logoDataUri` disediakan, koreksi kesalahan secara otomatis dipaksa ke `H` (30%) agar kode QR tetap dapat dipindai meskipun logo menutupi bagian tengah.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: "Deteksi dan koreksi mata merah bertenaga AI yang disebabkan oleh flash kamera."
|
||||
i18n_source_hash: 647c6ff1ef7c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: ca509f56b766
|
||||
---
|
||||
|
||||
# Red Eye Removal {#red-eye-removal}
|
||||
|
||||
Deteksi dan koreksi mata merah bertenaga AI yang disebabkan oleh flash kamera.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/red-eye-removal`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `face-detection` (200-300 MB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | Berkas gambar (multipart) |
|
||||
| sensitivity | number | No | `50` | Sensitivitas deteksi mata merah (0-100). Nilai lebih tinggi mendeteksi mata merah yang lebih halus |
|
||||
| strength | number | No | `70` | Kekuatan koreksi (0-100). Seberapa agresif menetralkan warna merah |
|
||||
| format | string | No | - | Format output (penimpaan opsional) |
|
||||
| quality | number | No | `90` | Kualitas output (1-100) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Detecting red eyes...","percent":40}
|
||||
```
|
||||
|
||||
### Final Result (via 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan model bundle `face-detection` terpasang (200-300 MB).
|
||||
- Pertama mendeteksi wajah, lalu menemukan area mata dalam setiap wajah, dan akhirnya mengidentifikasi serta mengoreksi piksel mata merah.
|
||||
- Jumlah `facesDetected` menunjukkan berapa banyak wajah yang ditemukan; `eyesCorrected` adalah jumlah total mata individu yang mata merahnya dikoreksi.
|
||||
- Output selalu PNG untuk pelestarian kualitas maksimum.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR via dekode otomatis.
|
||||
@@ -0,0 +1,136 @@
|
||||
---
|
||||
description: "Penghapusan latar belakang bertenaga AI dengan efek opsional (blur, bayangan, gradien, latar belakang kustom)."
|
||||
i18n_source_hash: 326a91284529
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f546e405fee9
|
||||
---
|
||||
|
||||
# Remove Background {#remove-background}
|
||||
|
||||
Penghapusan latar belakang bertenaga AI dengan efek opsional (blur, bayangan, gradien, latar belakang kustom).
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/remove-background`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `background-removal` (4-5 GB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | Berkas gambar (multipart) |
|
||||
| model | string | No | - | Varian model AI yang digunakan |
|
||||
| backgroundType | string | No | `"transparent"` | Salah satu dari: `transparent`, `color`, `gradient`, `blur`, `image` |
|
||||
| backgroundColor | string | No | - | Warna hex untuk latar belakang solid |
|
||||
| gradientColor1 | string | No | - | Warna gradien pertama |
|
||||
| gradientColor2 | string | No | - | Warna gradien kedua |
|
||||
| gradientAngle | number | No | - | Sudut gradien dalam derajat |
|
||||
| blurEnabled | boolean | No | - | Aktifkan efek blur latar belakang |
|
||||
| blurIntensity | number | No | - | Intensitas blur (0-100) |
|
||||
| shadowEnabled | boolean | No | - | Aktifkan drop shadow pada subjek |
|
||||
| shadowOpacity | number | No | - | Opasitas bayangan (0-100) |
|
||||
| outputFormat | string | No | - | Format output: `png`, `webp`, atau `avif` |
|
||||
| edgeRefine | integer | No | - | Tingkat penghalusan tepi (0-3) |
|
||||
| decontaminate | boolean | No | - | Hapus rembesan warna dari tepi |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Removing background...","percent":50}
|
||||
```
|
||||
|
||||
### Final Result (via 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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Effects Endpoint (Phase 2) {#effects-endpoint-phase-2}
|
||||
|
||||
`POST /api/v1/tools/image/remove-background/effects`
|
||||
|
||||
Menerapkan ulang efek latar belakang tanpa menjalankan ulang model AI. Menggunakan mask dan gambar asli yang di-cache dari Fase 1.
|
||||
|
||||
### Parameters {#parameters-1}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| settings | JSON | Yes | - | JSON dengan pengaturan efek (lihat di bawah) |
|
||||
| backgroundImage | file | No | - | Gambar latar belakang kustom (saat backgroundType adalah `image`) |
|
||||
|
||||
#### Settings JSON fields {#settings-json-fields}
|
||||
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| jobId | string | Yes | ID job dari Fase 1 |
|
||||
| filename | string | Yes | Nama berkas asli dari Fase 1 |
|
||||
| backgroundType | string | No | `transparent`, `color`, `gradient`, `blur`, `image` |
|
||||
| backgroundColor | string | No | Warna hex untuk latar belakang solid |
|
||||
| gradientColor1 | string | No | Warna gradien pertama |
|
||||
| gradientColor2 | string | No | Warna gradien kedua |
|
||||
| gradientAngle | number | No | Sudut gradien dalam derajat |
|
||||
| blurEnabled | boolean | No | Aktifkan blur latar belakang |
|
||||
| blurIntensity | number | No | Intensitas blur (0-100) |
|
||||
| shadowEnabled | boolean | No | Aktifkan drop shadow |
|
||||
| shadowOpacity | number | No | Opasitas bayangan (0-100) |
|
||||
| outputFormat | string | No | `png`, `webp`, atau `avif` |
|
||||
|
||||
### Example Request {#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"}'
|
||||
```
|
||||
|
||||
### Response (200 OK) {#response-200-ok}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/photo_nobg.png",
|
||||
"processedSize": 195000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan model bundle `background-removal` terpasang (4-5 GB).
|
||||
- Fase 1 meng-cache mask transparan dan gambar asli sehingga Fase 2 (efek) dapat menerapkan ulang latar belakang berbeda secara instan tanpa menjalankan ulang model AI.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR via dekode otomatis.
|
||||
- Rotasi EXIF dikoreksi otomatis sebelum diproses.
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
description: "Ganti warna tertentu dalam gambar dengan warna lain atau jadikan transparan."
|
||||
i18n_source_hash: df55ac451ecb
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 878c14435dbc
|
||||
---
|
||||
|
||||
# Replace & Invert Color {#replace-invert-color}
|
||||
|
||||
Ganti piksel yang cocok dengan warna sumber dengan warna target, atau jadikan transparan. Menggunakan jarak Euclidean dalam ruang RGB dengan toleransi yang dapat dikonfigurasi untuk pemaduan mulus di batas warna.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/replace-color`
|
||||
|
||||
Menerima multipart form data dengan berkas gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| sourceColor | string | No | `"#FF0000"` | Warna hex yang dicari (format: `#RRGGBB`) |
|
||||
| targetColor | string | No | `"#00FF00"` | Warna hex pengganti (format: `#RRGGBB`) |
|
||||
| makeTransparent | boolean | No | `false` | Jadikan piksel yang cocok transparan alih-alih menggantinya dengan warna target |
|
||||
| tolerance | number | No | `30` | Toleransi pencocokan warna (0 hingga 255). Nilai lebih tinggi mencocokkan rentang warna serupa yang lebih luas |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
Jadikan latar belakang hijau transparan:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.png",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2100000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Pencocokan warna menggunakan jarak Euclidean dalam ruang RGB, diskalakan oleh `tolerance * sqrt(3)`.
|
||||
- Pemaduan penggantian proporsional terhadap jarak warna: piksel yang lebih dekat ke warna sumber menerima lebih banyak warna target, menciptakan transisi mulus.
|
||||
- Saat `makeTransparent` bernilai `true`, output dipaksa ke PNG (atau WebP/AVIF) jika format input tidak mendukung kanal alfa (mis., JPEG).
|
||||
- Toleransi 0 hanya mencocokkan warna sumber yang persis. Nilai lebih tinggi (50+) akan mencocokkan rentang rona serupa yang lebih luas.
|
||||
- Format output mengikuti format input kecuali transparansi diperlukan dan format input tidak mendukung alfa.
|
||||
@@ -0,0 +1,72 @@
|
||||
---
|
||||
description: "Ubah ukuran gambar berdasarkan piksel, persentase, atau dengan mode fit."
|
||||
i18n_source_hash: 00d1bffa4d38
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: c35e9fa1bead
|
||||
---
|
||||
|
||||
# Resize {#resize}
|
||||
|
||||
Ubah ukuran gambar dengan menentukan dimensi piksel persis, faktor skala persentase, atau mode fit yang mengontrol bagaimana gambar menyesuaikan dengan dimensi target.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/resize`
|
||||
|
||||
Menerima multipart form data dengan berkas gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | No | - | Lebar target dalam piksel (maks 16383) |
|
||||
| height | integer | No | - | Tinggi target dalam piksel (maks 16383) |
|
||||
| fit | string | No | `"contain"` | Bagaimana gambar disesuaikan dengan dimensi: `contain`, `cover`, `fill`, `inside`, `outside` |
|
||||
| withoutEnlargement | boolean | No | `false` | Cegah pembesaran jika gambar lebih kecil dari target |
|
||||
| percentage | number | No | - | Skalakan berdasarkan persentase (mis. 50 untuk setengah ukuran) |
|
||||
|
||||
Setidaknya salah satu dari `width`, `height`, atau `percentage` harus disediakan.
|
||||
|
||||
### Fit Modes {#fit-modes}
|
||||
|
||||
- **contain** - Ubah ukuran agar pas di dalam dimensi, mempertahankan rasio aspek (mungkin menyisakan ruang kosong)
|
||||
- **cover** - Ubah ukuran agar menutupi dimensi, mempertahankan rasio aspek (mungkin memotong)
|
||||
- **fill** - Regangkan agar persis sesuai dimensi (mengabaikan rasio aspek)
|
||||
- **inside** - Seperti `contain`, tetapi hanya memperkecil, tidak pernah memperbesar
|
||||
- **outside** - Seperti `cover`, tetapi hanya memperkecil, tidak pernah memperbesar
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
Ubah ukuran berdasarkan persentase:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 980000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Dimensi maksimum adalah 16383 piksel pada salah satu sumbu (batas Sharp/libvips).
|
||||
- Format output mengikuti format input. Input HEIC, RAW, PSD, dan SVG didekode secara otomatis sebelum diproses.
|
||||
- Orientasi EXIF diterapkan otomatis sebelum pengubahan ukuran.
|
||||
- Flag `withoutEnlargement` berguna untuk pemrosesan batch di mana beberapa gambar mungkin sudah lebih kecil dari target.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Perbaiki goresan, robekan, dan kerusakan pada foto lama dengan pipeline AI untuk restorasi, peningkatan wajah, dan warna."
|
||||
i18n_source_hash: 3de13284216c
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f8edc268c513
|
||||
---
|
||||
|
||||
# Photo Restoration {#photo-restoration}
|
||||
|
||||
Perbaiki goresan, robekan, dan kerusakan pada foto lama menggunakan pipeline AI multi-langkah. Menggabungkan perbaikan goresan, peningkatan wajah, denoising, dan pewarnaan opsional.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/restore-photo`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, polling `/api/v1/jobs/{jobId}/progress` untuk status via SSE)
|
||||
|
||||
**Model bundle:** `photo-restoration` (4-5 GB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | Berkas gambar (multipart) |
|
||||
| scratchRemoval | boolean | No | `true` | Hapus goresan dan kerusakan permukaan |
|
||||
| faceEnhancement | boolean | No | `true` | Tingkatkan wajah dalam foto yang direstorasi |
|
||||
| fidelity | number | No | `0.7` | Fidelitas peningkatan wajah (0-1). Nilai lebih tinggi lebih mempertahankan fitur asli |
|
||||
| denoise | boolean | No | `true` | Terapkan denoising pada hasil yang direstorasi |
|
||||
| denoiseStrength | number | No | `25` | Kekuatan denoising (0-100) |
|
||||
| colorize | boolean | No | `false` | Warnai foto yang direstorasi (untuk gambar grayscale) |
|
||||
| colorizeStrength | number | No | `85` | Intensitas pewarnaan (0-100) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/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}
|
||||
```
|
||||
|
||||
### Final Result (via 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Membutuhkan model bundle `photo-restoration` terpasang (4-5 GB).
|
||||
- Pipeline menjalankan beberapa langkah AI secara berurutan: perbaikan goresan, peningkatan wajah (GFPGAN), denoising, dan opsional pewarnaan.
|
||||
- Array `steps` dalam hasil menunjukkan langkah pemrosesan mana yang benar-benar dieksekusi.
|
||||
- `scratchCoverage` adalah estimasi persentase area gambar yang mengalami kerusakan goresan.
|
||||
- `fidelity` mengontrol seberapa kuat wajah ditingkatkan vs. mempertahankan tampilan asli. Nilai lebih rendah menghasilkan peningkatan lebih agresif; nilai lebih tinggi lebih konservatif.
|
||||
- Opsi `colorize` secara otomatis mendeteksi apakah gambar berupa grayscale. Flag `isGrayscale` dalam hasil mengonfirmasi deteksi ini.
|
||||
- Format output mengikuti format input secara otomatis.
|
||||
- Mendukung format input HEIC/HEIF, RAW, TGA, PSD, EXR, HDR, dan AVIF via dekode otomatis.
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
description: "Putar gambar pada sudut mana pun dan balik secara horizontal atau vertikal."
|
||||
i18n_source_hash: af2581d7cd8d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: daef1621cb61
|
||||
---
|
||||
|
||||
# Rotate & Flip {#rotate-flip}
|
||||
|
||||
Putar gambar pada sudut sembarang dan/atau balik secara horizontal atau vertikal. Operasi rotasi dan pembalikan dapat digabungkan dalam satu permintaan.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/rotate`
|
||||
|
||||
Menerima multipart form data dengan berkas gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| angle | number | No | `0` | Sudut rotasi dalam derajat (searah jarum jam). Menerima nilai numerik apa pun. |
|
||||
| horizontal | boolean | No | `false` | Balik gambar secara horizontal (cermin) |
|
||||
| vertical | boolean | No | `false` | Balik gambar secara vertikal |
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
Putar 90 derajat searah jarum jam:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Balik secara horizontal:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Putar dan balik sekaligus:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2480000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Rotasi diterapkan terlebih dahulu, lalu operasi pembalikan.
|
||||
- Rotasi non-90-derajat (mis. 45 derajat) akan memperbesar kanvas agar pas dengan gambar yang diputar, dengan isian transparan atau hitam tergantung format output.
|
||||
- Nilai umum: 90, 180, 270 untuk rotasi seperempat putaran.
|
||||
- Orientasi EXIF diterapkan otomatis sebelum diproses, sehingga rotasi relatif terhadap orientasi visual.
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
description: "Menajamkan gambar menggunakan metode adaptive, unsharp mask, atau high-pass dengan pengurangan noise opsional."
|
||||
i18n_source_hash: ccb60af9faae
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 1990226b51e3
|
||||
---
|
||||
|
||||
# Sharpening {#sharpening}
|
||||
|
||||
Alat penajaman lanjutan dengan tiga metode: adaptive (cerdas dan sadar-tepi), unsharp mask (radius/amount klasik), dan high-pass (penekanan tekstur). Menyertakan pengurangan noise bawaan untuk mencegah artefak penajaman.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/sharpening`
|
||||
|
||||
Menerima data formulir multipart dengan sebuah file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| method | string | No | `"adaptive"` | Algoritma penajaman: `adaptive`, `unsharp-mask`, `high-pass` |
|
||||
| sigma | number | No | `1.0` | Adaptive: sigma Gaussian (0.5 hingga 10) |
|
||||
| m1 | number | No | `1.0` | Adaptive: penajaman area datar (0 hingga 10) |
|
||||
| m2 | number | No | `3.0` | Adaptive: penajaman area bergerigi (0 hingga 20) |
|
||||
| x1 | number | No | `2.0` | Adaptive: ambang datar/bergerigi (0 hingga 10) |
|
||||
| y2 | number | No | `12` | Adaptive: penajaman datar maksimum (0 hingga 50) |
|
||||
| y3 | number | No | `20` | Adaptive: penajaman bergerigi maksimum (0 hingga 50) |
|
||||
| amount | number | No | `100` | Unsharp mask: jumlah penajaman (0 hingga 1000) |
|
||||
| radius | number | No | `1.0` | Unsharp mask: radius blur dalam piksel (0.1 hingga 5) |
|
||||
| threshold | number | No | `0` | Unsharp mask: perbedaan kecerahan minimum untuk menajamkan (0 hingga 255) |
|
||||
| strength | number | No | `50` | High-pass: kekuatan filter (0 hingga 100) |
|
||||
| kernelSize | number | No | `3` | High-pass: ukuran kernel konvolusi (3 atau 5) |
|
||||
| denoise | string | No | `"off"` | Pengurangan noise sebelum penajaman: `off`, `light`, `medium`, `strong` |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
Unsharp mask dengan threshold untuk melindungi area yang halus:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2510000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Hanya parameter yang relevan dengan metode yang dipilih yang digunakan. Misalnya, `amount`, `radius`, dan `threshold` diabaikan ketika `method` bernilai `adaptive`.
|
||||
- Metode adaptive menggunakan penajaman adaptif bawaan Sharp dengan perilaku area datar/bergerigi yang dapat dikonfigurasi.
|
||||
- Opsi `denoise` menerapkan pengurangan noise sebelum penajaman untuk mencegah penguatan noise/grain.
|
||||
- Penajaman high-pass mengekstrak detail halus dengan mengurangi versi yang di-blur dari gambar asli, lalu memadukannya kembali.
|
||||
- Format keluaran mengikuti format masukan. Masukan HEIC, RAW, PSD, dan SVG otomatis didekode sebelum diproses.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description: "Pemangkasan yang sadar-subjek, sadar-wajah, dan sadar-entropi yang membingkai gambar secara cerdas menggunakan Sharp dan deteksi wajah AI."
|
||||
i18n_source_hash: acbe1439c6d8
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 3ad43a9300be
|
||||
---
|
||||
|
||||
# Smart Crop {#smart-crop}
|
||||
|
||||
Pemangkasan cerdas yang sadar-subjek, sadar-wajah, atau berbasis trim. Menggunakan strategi attention/entropy dari Sharp dan deteksi wajah AI untuk pembingkaian yang cerdas.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/smart-crop`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, poll `/api/v1/jobs/{jobId}/progress` untuk status melalui SSE)
|
||||
|
||||
**Model bundle:** `face-detection` (200-300 MB) - hanya diperlukan untuk mode `face`
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | File gambar (multipart) |
|
||||
| mode | string | No | `"subject"` | Mode pemangkasan: `subject`, `face`, `trim`. (Nilai lama `attention` dan `content` dipetakan ke `subject` dan `trim`) |
|
||||
| strategy | string | No | `"attention"` | Strategi untuk mode subject: `attention` atau `entropy` |
|
||||
| width | integer | No | - | Lebar target dalam piksel |
|
||||
| height | integer | No | - | Tinggi target dalam piksel |
|
||||
| padding | integer | No | `0` | Persentase padding di sekitar subjek (0-50) |
|
||||
| facePreset | string | No | `"head-shoulders"` | Preset pembingkaian wajah: `closeup`, `head-shoulders`, `upper-body`, `half-body` |
|
||||
| sensitivity | number | No | `0.5` | Sensitivitas deteksi wajah (0-1) |
|
||||
| threshold | integer | No | `30` | Ambang mode trim untuk deteksi latar belakang (0-255) |
|
||||
| padToSquare | boolean | No | `false` | Melapisi hasil yang di-trim menjadi persegi |
|
||||
| padColor | string | No | `"#ffffff"` | Warna latar belakang untuk padding |
|
||||
| targetSize | integer | No | - | Ukuran target untuk keluaran yang dipadding (piksel) |
|
||||
| quality | integer | No | - | Kualitas keluaran (1-100) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","percent":50}
|
||||
```
|
||||
|
||||
### Final Result (via 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Modes {#modes}
|
||||
|
||||
### Subject Mode {#subject-mode}
|
||||
Menggunakan strategi attention atau entropy dari Sharp untuk menemukan area yang paling menarik secara visual dan memangkas di sekitarnya.
|
||||
|
||||
### Face Mode {#face-mode}
|
||||
Mendeteksi wajah menggunakan AI, lalu membingkai pemangkasan di sekitar wajah yang terdeteksi menggunakan `facePreset` yang ditentukan. Kembali ke mode subject (strategi attention) jika tidak ada wajah yang terdeteksi.
|
||||
|
||||
### Trim Mode {#trim-mode}
|
||||
Menghapus tepi/latar belakang yang seragam dari gambar. Secara opsional melapisi hasil menjadi persegi dengan warna latar belakang dan ukuran target yang ditentukan.
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Alat ini menggunakan factory `createToolRoute` dengan `executionHint: "long"`, sehingga mengembalikan 202 dengan progres SSE.
|
||||
- Mode face memerlukan model bundle `face-detection` (200-300 MB).
|
||||
- Mode subject dan trim bekerja tanpa model bundle AI apa pun.
|
||||
- `facePreset` menentukan seberapa ketat pemangkasan membingkai wajah yang terdeteksi: `closeup` adalah yang paling ketat, `half-body` adalah yang paling luas.
|
||||
- Jika tidak ada width/height yang ditentukan, default ke 1080x1080.
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
description: "Membagi satu gambar menjadi petak-petak grid berdasarkan baris dan kolom atau berdasarkan ukuran piksel, dikembalikan sebagai arsip ZIP."
|
||||
i18n_source_hash: 57a2e11e7cce
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 8fcbdb41456e
|
||||
---
|
||||
|
||||
# Image Splitting {#image-splitting}
|
||||
|
||||
Membagi satu gambar menjadi petak-petak grid berdasarkan jumlah kolom/baris atau berdasarkan dimensi piksel tertentu. Mengembalikan arsip ZIP yang berisi semua petak.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/split`
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| columns | integer | No | 3 | Jumlah kolom untuk membagi (1 hingga 100) |
|
||||
| rows | integer | No | 3 | Jumlah baris untuk membagi (1 hingga 100) |
|
||||
| tileWidth | integer | No | - | Lebar petak dalam piksel (min 10). Menggantikan `columns` ketika `tileWidth` dan `tileHeight` keduanya diatur. |
|
||||
| tileHeight | integer | No | - | Tinggi petak dalam piksel (min 10). Menggantikan `rows` ketika `tileWidth` dan `tileHeight` keduanya diatur. |
|
||||
| outputFormat | string | No | `"original"` | Format keluaran untuk petak: `original`, `png`, `jpg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | No | 90 | Kualitas keluaran untuk format lossy (1 hingga 100) |
|
||||
|
||||
## Example Request {#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
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
Responsnya dialirkan langsung sebagai file ZIP dengan `Content-Type: application/zip`. Nama file mengikuti pola `split-<jobId>.zip`.
|
||||
|
||||
Setiap petak di dalam ZIP diberi nama `<originalBaseName>_r<row>_c<col>.<ext>` (mis. `photo_r1_c1.png`, `photo_r2_c3.webp`).
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Menerima satu file gambar.
|
||||
- Mendukung format masukan HEIC, RAW, PSD, dan SVG (otomatis didekode).
|
||||
- Ketika `tileWidth` dan `tileHeight` keduanya diberikan, keduanya diprioritaskan di atas `columns`/`rows`. Dimensi grid dihitung sebagai `ceil(imageWidth / tileWidth)` dan `ceil(imageHeight / tileHeight)`.
|
||||
- Petak tepi (kolom paling kanan, baris bawah) mungkin lebih kecil dari ukuran petak yang ditentukan jika dimensi gambar tidak habis dibagi rata.
|
||||
- Ukuran grid maksimum dibatasi hingga 100x100 (10.000 petak).
|
||||
- Responsnya mengalirkan ZIP secara langsung, sehingga tidak ada body respons JSON. Gunakan `--output` dengan curl untuk menyimpan file.
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
description: "Menggabungkan beberapa gambar menjadi satu grid sprite sheet dengan metadata frame."
|
||||
i18n_source_hash: 1938d7fb100d
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: f84631451fea
|
||||
---
|
||||
|
||||
# Sprite Sheet {#sprite-sheet}
|
||||
|
||||
Menggabungkan beberapa gambar menjadi satu grid sprite sheet. Setiap gambar diubah ukurannya agar sesuai dengan dimensi gambar pertama dan ditempatkan ke dalam grid. Mengembalikan gambar sprite sheet beserta metadata koordinat per frame.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/sprite-sheet`
|
||||
|
||||
Menerima data formulir multipart dengan dua atau lebih file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| columns | integer | No | `4` | Jumlah kolom dalam grid (1-16) |
|
||||
| padding | integer | No | `0` | Padding antar sel dalam piksel (0-64) |
|
||||
| background | string | No | `"#ffffff"` | Warna latar belakang hex |
|
||||
| format | string | No | `"png"` | Format keluaran: `png`, `webp`, atau `jpeg` |
|
||||
| quality | integer | No | `90` | Kualitas keluaran (1-100) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Example Response {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Menerima 2 hingga 64 gambar. Semua gambar diubah ukurannya agar sesuai dengan dimensi gambar pertama yang diunggah.
|
||||
- Array `frames` memberikan koordinat piksel yang tepat dari setiap frame dalam keluaran, cocok untuk definisi sprite CSS atau peta frame game engine.
|
||||
- Jumlah baris dihitung secara otomatis dari jumlah gambar dan nilai `columns`.
|
||||
- Gunakan parameter `padding` untuk menambahkan jarak antar sel. Warna `background` terlihat di area padding dan sel-sel kosong yang tersisa di bagian akhir.
|
||||
- Masukan HEIC, RAW, PSD, dan SVG otomatis didekode sebelum diproses.
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
description: "Menggabungkan gambar berdampingan, ditumpuk, atau dalam grid dengan kontrol atas perataan, celah, tepi, dan mode pengubahan ukuran."
|
||||
i18n_source_hash: 39333210505a
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 22d6b7c3538e
|
||||
---
|
||||
|
||||
# Stitch / Combine {#stitch-combine}
|
||||
|
||||
Menggabungkan beberapa gambar berdampingan, ditumpuk secara vertikal, atau disusun dalam grid. Mendukung perataan, celah, tepi, radius sudut, dan beberapa mode pengubahan ukuran.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/stitch`
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| direction | string | No | `"horizontal"` | Arah tata letak: `horizontal`, `vertical`, `grid` |
|
||||
| gridColumns | integer | No | 2 | Jumlah kolom ketika direction adalah `grid` (2 hingga 100) |
|
||||
| resizeMode | string | No | `"fit"` | Cara gambar diubah ukurannya: `fit`, `original`, `stretch`, `crop` |
|
||||
| alignment | string | No | `"center"` | Perataan sumbu-silang: `start`, `center`, `end` |
|
||||
| gap | number | No | 0 | Celah antar gambar dalam piksel (0 hingga 1000) |
|
||||
| border | number | No | 0 | Lebar tepi luar dalam piksel (0 hingga 500) |
|
||||
| cornerRadius | number | No | 0 | Radius sudut yang diterapkan pada keluaran akhir (0 hingga 500) |
|
||||
| backgroundColor | string | No | `"#FFFFFF"` | Warna latar belakang/tepi sebagai hex (mis. `#FF0000`) |
|
||||
| format | string | No | `"png"` | Format keluaran: `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| quality | number | No | 90 | Kualitas keluaran (1 hingga 100) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/stitch.png",
|
||||
"originalSize": 1234567,
|
||||
"processedSize": 987654
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Memerlukan setidaknya 2 gambar. Unggah beberapa file gambar dalam permintaan multipart.
|
||||
- Mendukung format masukan HEIC, RAW, PSD, dan SVG (otomatis didekode).
|
||||
- Mode pengubahan ukuran:
|
||||
- `fit` - Menskalakan gambar agar sesuai dengan dimensi terkecil di sepanjang sumbu penggabungan.
|
||||
- `original` - Mempertahankan ukuran asli (dapat menghasilkan tepi yang tidak rata).
|
||||
- `stretch` - Memaksa gambar agar sesuai dengan dimensi terkecil tanpa mempertahankan rasio aspek.
|
||||
- `crop` - Memangkas-menutupi gambar agar sesuai dengan dimensi terkecil.
|
||||
- Dalam mode `grid`, sel diukur sesuai dimensi median dari semua gambar.
|
||||
- `cornerRadius` diterapkan ke seluruh keluaran akhir, bukan gambar individual.
|
||||
- Ukuran kanvas dibatasi oleh konfigurasi server `MAX_CANVAS_PIXELS` untuk mencegah kehabisan memori.
|
||||
@@ -0,0 +1,113 @@
|
||||
---
|
||||
description: "Menghapus metadata EXIF, GPS, ICC, dan XMP dari gambar untuk privasi dan ukuran file yang lebih kecil."
|
||||
i18n_source_hash: e89147734fd0
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 522e570f7a41
|
||||
---
|
||||
|
||||
# Remove Metadata {#remove-metadata}
|
||||
|
||||
Menghapus metadata EXIF, GPS, profil warna ICC, dan XMP dari gambar. Berguna untuk privasi (menghapus koordinat GPS, info kamera) dan mengurangi ukuran file.
|
||||
|
||||
## API Endpoints {#api-endpoints}
|
||||
|
||||
### Strip Metadata {#strip-metadata}
|
||||
|
||||
`POST /api/v1/tools/image/strip-metadata`
|
||||
|
||||
Memproses gambar dan mengembalikan versi bersih dengan metadata yang dipilih dihapus.
|
||||
|
||||
### Inspect Metadata {#inspect-metadata}
|
||||
|
||||
`POST /api/v1/tools/image/strip-metadata/inspect`
|
||||
|
||||
Mengembalikan metadata yang telah diurai sebagai JSON tanpa memodifikasi gambar. Berguna untuk melihat pratinjau metadata apa saja yang ada sebelum dihapus.
|
||||
|
||||
## Parameters (Strip) {#parameters-strip}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| stripExif | boolean | No | `false` | Menghapus data EXIF (pengaturan kamera, tanggal, dll.) |
|
||||
| stripGps | boolean | No | `false` | Menghapus data GPS/lokasi saja |
|
||||
| stripIcc | boolean | No | `false` | Menghapus profil warna ICC |
|
||||
| stripXmp | boolean | No | `false` | Menghapus metadata XMP (Adobe, IPTC) |
|
||||
| stripAll | boolean | No | `true` | Menghapus semua metadata sekaligus |
|
||||
|
||||
Ketika `stripAll` bernilai `true`, itu menggantikan flag individual dan menghapus segalanya.
|
||||
|
||||
## Example Request {#example-request}
|
||||
|
||||
Menghapus semua metadata:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Menghapus hanya data GPS (mempertahankan info kamera dan profil warna):
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
Memeriksa metadata tanpa memodifikasi:
|
||||
|
||||
```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"
|
||||
```
|
||||
|
||||
## Example Response (Strip) {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Example Response (Inspect) {#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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Gambar dienkode ulang dalam format aslinya setelah dihapus. JPEG menggunakan mozjpeg pada kualitas 90, PNG menggunakan level kompresi 9, WebP menggunakan kualitas 85.
|
||||
- Menghapus profil ICC dapat menyebabkan pergeseran warna yang halus jika gambar ditandai dengan profil non-sRGB. Gunakan `stripIcc: false` jika akurasi warna penting.
|
||||
- Endpoint inspect mengurai koordinat GPS menjadi nilai lintang/bujur desimal (diawali dengan garis bawah) untuk kemudahan.
|
||||
- Format masukan yang didukung: JPEG, PNG, WebP, AVIF, TIFF, GIF.
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description: "Mengonversi file SVG ke PNG, JPEG, WebP, AVIF, TIFF, GIF, HEIF, atau JXL pada resolusi dan DPI kustom, dengan dukungan batch."
|
||||
i18n_source_hash: cf36830f8797
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: d468d971804b
|
||||
---
|
||||
|
||||
# SVG to Raster {#svg-to-raster}
|
||||
|
||||
Mengonversi file SVG ke format gambar raster (PNG, JPEG, WebP, AVIF, TIFF, GIF, HEIF, atau JXL) pada resolusi dan DPI kustom. Juga mendukung konversi batch dari beberapa SVG.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/svg-to-raster`
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| width | integer | No | - | Lebar target dalam piksel (1 hingga 65536). Mempertahankan rasio aspek jika hanya satu dimensi yang diatur. |
|
||||
| height | integer | No | - | Tinggi target dalam piksel (1 hingga 65536). Mempertahankan rasio aspek jika hanya satu dimensi yang diatur. |
|
||||
| dpi | integer | No | 300 | DPI render, mengontrol kepadatan rasterisasi dasar (36 hingga 2400) |
|
||||
| quality | number | No | 90 | Kualitas keluaran untuk format lossy (1 hingga 100) |
|
||||
| backgroundColor | string | No | `"#00000000"` | Warna latar belakang sebagai hex (6 atau 8 karakter, 8 karakter menyertakan alfa) |
|
||||
| outputFormat | string | No | `"png"` | Format keluaran: `png`, `jpg`, `webp`, `avif`, `tiff`, `gif`, `heif`, `jxl` |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Example Response {#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
|
||||
}
|
||||
```
|
||||
|
||||
## Batch Endpoint {#batch-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/svg-to-raster/batch`
|
||||
|
||||
Mengonversi beberapa file SVG dalam satu permintaan. Mengembalikan arsip ZIP.
|
||||
|
||||
### Additional Batch Parameters {#additional-batch-parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| clientJobId | string | No | - | ID job opsional yang disediakan klien untuk pelacakan progres (maks 128 karakter) |
|
||||
|
||||
### Batch Example Request {#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}'
|
||||
```
|
||||
|
||||
### Batch Response {#batch-response}
|
||||
|
||||
Endpoint batch mengalirkan file ZIP secara langsung dengan header:
|
||||
- `Content-Type: application/zip`
|
||||
- `X-Job-Id: <jobId>`
|
||||
- `X-File-Results: <url-encoded JSON mapping of index to filename>`
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Hanya menerima file SVG dan SVGZ (memvalidasi konten, bukan hanya ekstensi). SVGZ otomatis didekompresi.
|
||||
- Konten SVG disanitasi sebelum di-render untuk mencegah XSS dan pemuatan sumber daya eksternal.
|
||||
- Pengaturan `dpi` mengontrol kepadatan saat SVG dirasterisasi. DPI yang lebih tinggi menghasilkan dimensi piksel yang lebih besar dari viewport SVG yang sama.
|
||||
- Ketika `width` dan `height` keduanya diberikan, gambar diubah ukurannya menggunakan `fit: inside` (mempertahankan rasio aspek dalam batas yang ada).
|
||||
- Sebuah `previewUrl` disertakan dalam respons untuk format yang tidak dapat ditampilkan browser secara native (TIFF, HEIF). Pratinjaunya adalah thumbnail WebP 1200px.
|
||||
- Latar belakang default `#00000000` sepenuhnya transparan. Atur ke `#FFFFFF` untuk latar belakang putih (berguna dengan keluaran JPEG yang tidak mendukung transparansi).
|
||||
- Pemrosesan batch mematuhi konfigurasi server `MAX_BATCH_SIZE` dan menggunakan worker konkuren untuk performa.
|
||||
- Progres untuk operasi batch dapat dilacak melalui SSE di `/api/v1/jobs/:jobId/progress`.
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
description: "Menambahkan overlay teks bergaya dengan bayangan jatuh dan kotak latar belakang."
|
||||
i18n_source_hash: 9f8e697188fc
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 3aca1be1081d
|
||||
---
|
||||
|
||||
# Text Overlay {#text-overlay}
|
||||
|
||||
Menambahkan teks bergaya ke gambar dengan bayangan jatuh opsional dan kotak latar belakang semi-transparan. Cocok untuk judul, keterangan, atau anotasi pada foto.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/text-overlay`
|
||||
|
||||
Menerima data formulir multipart dengan sebuah file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Yes | - | Teks yang di-overlay (1 hingga 500 karakter) |
|
||||
| fontSize | number | No | `48` | Ukuran font dalam piksel (8 hingga 200) |
|
||||
| color | string | No | `"#FFFFFF"` | Warna teks dalam format hex (`#RRGGBB`) |
|
||||
| position | string | No | `"bottom"` | Penempatan vertikal: `top`, `center`, `bottom` |
|
||||
| backgroundBox | boolean | No | `false` | Menampilkan persegi panjang latar belakang semi-transparan di belakang teks |
|
||||
| backgroundColor | string | No | `"#000000"` | Warna kotak latar belakang dalam format hex (`#RRGGBB`) |
|
||||
| shadow | boolean | No | `true` | Menerapkan bayangan jatuh di belakang teks |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
Dengan kotak latar belakang:
|
||||
|
||||
```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"}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2470000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Teks selalu diletakkan di tengah secara horizontal di dalam gambar.
|
||||
- Bayangan jatuh menggunakan offset 2px dengan blur 3px pada opasitas hitam 70%.
|
||||
- Kotak latar belakang membentang selebar penuh gambar pada opasitas 70%, dengan tinggi proporsional terhadap ukuran font (1.8x).
|
||||
- Teks di-render melalui komposit SVG, sehingga font sans-serif default sistem yang digunakan.
|
||||
- Karakter khusus XML dalam teks di-escape dengan aman.
|
||||
- Format keluaran mengikuti format masukan. Masukan HEIC, RAW, PSD, dan SVG otomatis didekode sebelum diproses.
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
description: "Memperbaiki PNG transparan palsu dengan matting AI (BiRefNet) untuk menghasilkan alfa sejati, plus pembersihan tepi defringe."
|
||||
i18n_source_hash: 7eb748b80f93
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 5881232fabdc
|
||||
---
|
||||
|
||||
# PNG Transparency Fixer {#png-transparency-fixer}
|
||||
|
||||
Memperbaiki PNG transparan palsu dengan satu klik. Menggunakan matting AI (model BiRefNet HR Matting) untuk menghasilkan transparansi alfa sejati, dengan pemrosesan pascanya defringe untuk membersihkan tepi.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/transparency-fixer`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, poll `/api/v1/jobs/{jobId}/progress` untuk status melalui SSE)
|
||||
|
||||
**Model bundle:** `background-removal` (4-5 GB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | File gambar (multipart) |
|
||||
| defringe | number | No | `30` | Intensitas defringe (0-100). Menghapus piksel fringe semi-transparan di sekitar tepi |
|
||||
| outputFormat | string | No | `"png"` | Format keluaran: `png` atau `webp` |
|
||||
| removeWatermark | boolean | No | `false` | Menerapkan pemrosesan awal penghapusan watermark (median filter) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Processing transparency...","percent":50}
|
||||
```
|
||||
|
||||
### Final Result (via 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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Memerlukan model bundle `background-removal` untuk diinstal (4-5 GB).
|
||||
- Menggunakan `birefnet-hr-matting` sebagai model utama untuk alpha matting berkualitas tinggi. Kembali ke `birefnet-general` jika model HR kehabisan memori.
|
||||
- Opsi `defringe` menghapus piksel fringe semi-transparan yang terkadang ditinggalkan matting AI di sekitar rambut, bulu, dan tepi halus. Ini bekerja dengan mem-blur kanal alfa dan menolkan piksel berkeyakinan rendah.
|
||||
- Opsi `removeWatermark` menerapkan langkah pemrosesan awal median filter. Ini adalah pengurangan watermark dasar, bukan alat penghapusan watermark khusus.
|
||||
- Hanya menghasilkan PNG atau WebP lossless (keduanya mendukung transparansi alfa).
|
||||
- Mendukung format masukan HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui pendekodean otomatis.
|
||||
@@ -0,0 +1,83 @@
|
||||
---
|
||||
description: "Memperbesar gambar 2x hingga 4x dengan super-resolusi AI Real-ESRGAN sambil mempertahankan detail halus."
|
||||
i18n_source_hash: 150032e99476
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 0aaaa70e54a8
|
||||
---
|
||||
|
||||
# Image Upscaling {#image-upscaling}
|
||||
|
||||
Peningkatan super-resolusi AI menggunakan Real-ESRGAN. Memperbesar gambar 2x-4x sambil mempertahankan detail.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/upscale`
|
||||
|
||||
**Processing:** Asinkron (mengembalikan 202, poll `/api/v1/jobs/{jobId}/progress` untuk status melalui SSE)
|
||||
|
||||
**Model bundle:** `upscale-enhance` (5-6 GB)
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Yes | - | File gambar (multipart) |
|
||||
| scale | number | No | `2` | Faktor pembesaran (mis., 2, 3, 4) |
|
||||
| model | string | No | `"auto"` | Model yang digunakan (mis., `auto`, nama model tertentu) |
|
||||
| faceEnhance | boolean | No | `false` | Menerapkan peningkatan wajah selama pembesaran |
|
||||
| denoise | number | No | `0` | Kekuatan denoising (0 = nonaktif) |
|
||||
| format | string | No | `"auto"` | Format keluaran: `auto`, `png`, `jpg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| quality | number | No | `95` | Kualitas keluaran (1-100) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
## Response {#response}
|
||||
|
||||
### Initial Response (202 Accepted) {#initial-response-202-accepted}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Progress (SSE at `/api/v1/jobs/{jobId}/progress`) {#progress-sse-at-api-v1-jobs-jobid-progress}
|
||||
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Upscaling...","percent":60}
|
||||
```
|
||||
|
||||
### Final Result (via 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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Memerlukan model bundle `upscale-enhance` untuk diinstal (5-6 GB).
|
||||
- Menggunakan Real-ESRGAN jika tersedia; kembali ke interpolasi Lanczos jika model AI tidak tersedia.
|
||||
- Opsi `faceEnhance` menerapkan pemulihan wajah GFPGAN selama pembesaran untuk kualitas wajah yang lebih baik.
|
||||
- Untuk format keluaran yang tidak dapat dipratinjau di browser (HEIC, JXL, TIFF), pratinjau WebP dihasilkan bersama keluaran utama.
|
||||
- Mendukung format masukan HEIC/HEIF, RAW, TGA, PSD, EXR, dan HDR melalui pendekodean otomatis.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
description: "Mengonversi gambar raster ke SVG dengan vektorisasi hitam-putih (potrace) dan multi-layer penuh warna."
|
||||
i18n_source_hash: f3e4777188ad
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: e0fdb2fea14e
|
||||
---
|
||||
|
||||
# Image to SVG {#image-to-svg}
|
||||
|
||||
Memvektorisasi gambar raster menjadi SVG menggunakan algoritma penelusuran. Mendukung penelusuran hitam-putih (potrace) dan vektorisasi multi-layer penuh warna.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/vectorize`
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| colorMode | string | No | `"bw"` | Mode penelusuran: `bw` (hitam dan putih) atau `color` (layer multi-warna) |
|
||||
| threshold | number | No | 128 | Ambang kecerahan untuk mode B&W (0 hingga 255). Piksel di bawahnya menjadi hitam. |
|
||||
| colorPrecision | number | No | 6 | Presisi kuantisasi warna untuk mode warna (1 hingga 16). Nilai lebih tinggi menghasilkan lebih banyak layer warna yang berbeda. |
|
||||
| layerDifference | number | No | 6 | Perbedaan warna minimum antar layer dalam mode warna (1 hingga 128) |
|
||||
| filterSpeckle | number | No | 4 | Area minimum untuk bentuk yang ditelusuri dalam piksel (1 hingga 256). Menghapus noise/bintik. |
|
||||
| pathMode | string | No | `"spline"` | Penghalusan jalur: `none` (bergerigi), `polygon` (segmen lurus), `spline` (kurva halus) |
|
||||
| cornerThreshold | number | No | 60 | Ambang sudut untuk deteksi sudut dalam mode warna (0 hingga 180 derajat) |
|
||||
| invert | boolean | No | `false` | Membalik gambar sebelum penelusuran (menukar hitam/putih) |
|
||||
|
||||
## Example Request {#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"}'
|
||||
```
|
||||
|
||||
### Color Vectorization {#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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/logo.svg",
|
||||
"originalSize": 45678,
|
||||
"processedSize": 12345
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Keluaran selalu berupa file SVG terlepas dari format masukan.
|
||||
- Mendukung format masukan HEIC, RAW, PSD, dan SVG (otomatis didekode ke raster sebelum penelusuran).
|
||||
- Mode B&W menggunakan algoritma potrace. Gambar dikonversi ke grayscale terlebih dahulu, lalu diberi ambang menjadi hitam/putih murni sebelum penelusuran.
|
||||
- Mode warna menggunakan pendekatan multi-layer: gambar dikuantisasi menjadi layer warna, masing-masing ditelusuri secara terpisah dan ditumpuk dalam keluaran SVG.
|
||||
- Nilai `filterSpeckle` yang lebih rendah mempertahankan lebih banyak detail tetapi menghasilkan file SVG yang lebih besar dengan lebih banyak jalur.
|
||||
- Pengaturan `pathMode` secara signifikan memengaruhi ukuran file: `none` menghasilkan jalur terbanyak, `spline` menghasilkan keluaran paling halus (dan biasanya paling kecil).
|
||||
- Untuk hasil terbaik dengan logo dan ikon, gunakan mode B&W dengan masukan kontras-tinggi yang bersih. Untuk foto atau ilustrasi, gunakan mode warna dengan `colorPrecision` yang lebih tinggi.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
description: "Menambahkan efek vignette dengan kekuatan, warna, dan posisi yang dapat disesuaikan."
|
||||
i18n_source_hash: 0b9795fea2eb
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 10bb9025771f
|
||||
---
|
||||
|
||||
# Vignette {#vignette}
|
||||
|
||||
Menambahkan efek vignette yang menggelapkan atau mewarnai tepi gambar. Mendukung kekuatan, warna, radius, kelembutan, kebulatan, dan posisi tengah yang dapat disesuaikan.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/vignette`
|
||||
|
||||
Menerima data formulir multipart dengan sebuah file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| strength | number | No | `0.5` | Opasitas vignette (0.1-1) |
|
||||
| color | string | No | `"#000000"` | Warna hex vignette |
|
||||
| radius | integer | No | `70` | Radius luar sebagai persentase dari setengah diagonal (0-100) |
|
||||
| softness | integer | No | `50` | Kelembutan feather (0-100); nilai lebih tinggi menghasilkan pudar yang lebih bertahap |
|
||||
| roundness | integer | No | `100` | Bentuk: 100 = lingkaran, 0 = elips yang sesuai rasio aspek gambar |
|
||||
| centerX | integer | No | `50` | Posisi tengah horizontal sebagai persentase (0-100) |
|
||||
| centerY | integer | No | `50` | Posisi tengah vertikal sebagai persentase (0-100) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2410000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- `radius` yang lebih kecil menggelapkan lebih banyak bagian gambar; radius yang lebih besar membatasi vignette ke tepi paling ekstrem.
|
||||
- Gunakan `color` non-hitam (mis., putih atau nada sepia) untuk efek vignette kreatif.
|
||||
- Menyesuaikan `centerX` dan `centerY` memungkinkan Anda memposisikan area bersih di luar pusat, berguna untuk mengarahkan fokus ke subjek yang tidak berada di tengah bingkai.
|
||||
- Format keluaran mengikuti format masukan. Masukan HEIC, RAW, PSD, dan SVG otomatis didekode sebelum diproses.
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
description: "Melapisi logo atau gambar sebagai watermark dengan posisi, opasitas, dan skala yang dapat dikonfigurasi."
|
||||
i18n_source_hash: c73ab0ef8ab9
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 62e699511ea6
|
||||
---
|
||||
|
||||
# Image Watermark {#image-watermark}
|
||||
|
||||
Melapisi logo atau gambar sekunder sebagai watermark pada gambar dasar. Watermark diskalakan relatif terhadap lebar gambar dasar dan diposisikan di sudut atau tengah.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/watermark-image`
|
||||
|
||||
Menerima data formulir multipart dengan **dua** file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| position | string | No | `"bottom-right"` | Penempatan watermark: `center`, `top-left`, `top-right`, `bottom-left`, `bottom-right` |
|
||||
| opacity | number | No | `50` | Persentase opasitas watermark (0 hingga 100) |
|
||||
| scale | number | No | `25` | Lebar watermark sebagai persentase dari lebar gambar utama (1 hingga 100) |
|
||||
|
||||
### File Fields {#file-fields}
|
||||
|
||||
| Field Name | Required | Description |
|
||||
|------------|----------|-------------|
|
||||
| file | Yes | Gambar utama/dasar |
|
||||
| watermark | Yes | Gambar watermark/logo |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2520000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Kedua gambar divalidasi dan didekode (HEIC, RAW, PSD, SVG didukung).
|
||||
- Watermark diubah ukurannya secara proporsional sehingga lebarnya sama dengan `scale`% dari lebar gambar utama.
|
||||
- Opasitas diterapkan melalui alpha mask yang dikomposit dengan pemaduan `dest-in`.
|
||||
- Posisi sudut menggunakan padding 20px dari tepi gambar.
|
||||
- Jika gambar watermark memiliki transparansi (mis., logo PNG), transparansi tersebut dipertahankan selama pengomposisian.
|
||||
- Orientasi EXIF diterapkan secara otomatis pada kedua gambar sebelum diproses.
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: "Menambahkan watermark teks dengan posisi, opasitas, rotasi, dan pengubinan yang dapat dikonfigurasi."
|
||||
i18n_source_hash: b80f12f410e4
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 7baab029b033
|
||||
---
|
||||
|
||||
# Text Watermark {#text-watermark}
|
||||
|
||||
Menambahkan overlay watermark teks ke gambar. Mendukung penempatan tunggal di sudut/tengah atau pengulangan berubin di seluruh gambar, dengan ukuran font, warna, opasitas, dan rotasi yang dapat dikonfigurasi.
|
||||
|
||||
## API Endpoint {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/watermark-text`
|
||||
|
||||
Menerima data formulir multipart dengan sebuah file gambar dan field JSON `settings`.
|
||||
|
||||
## Parameters {#parameters}
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| text | string | Yes | - | Teks watermark (1 hingga 500 karakter) |
|
||||
| fontSize | number | No | `48` | Ukuran font dalam piksel (8 hingga 1000) |
|
||||
| color | string | No | `"#000000"` | Warna teks dalam format hex (`#RRGGBB`) |
|
||||
| opacity | number | No | `50` | Persentase opasitas teks (0 hingga 100) |
|
||||
| position | string | No | `"center"` | Penempatan: `center`, `top-left`, `top-right`, `bottom-left`, `bottom-right`, `tiled` |
|
||||
| rotation | number | No | `0` | Sudut rotasi teks dalam derajat (-360 hingga 360) |
|
||||
|
||||
## Example Request {#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}'
|
||||
```
|
||||
|
||||
Watermark berubin di seluruh gambar:
|
||||
|
||||
```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}'
|
||||
```
|
||||
|
||||
## Example Response {#example-response}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/photo.jpg",
|
||||
"originalSize": 2450000,
|
||||
"processedSize": 2480000
|
||||
}
|
||||
```
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- Watermark di-render sebagai teks SVG dan dikomposit ke gambar, mempertahankan kualitas keluaran.
|
||||
- Mode berubin memberi jarak elemen teks berdasarkan ukuran font (jarak 6x horizontal, 4x vertikal), dibatasi maksimum 500 elemen.
|
||||
- Untuk posisi sudut, padding dari tepi sama dengan ukuran font.
|
||||
- Font yang digunakan adalah font sans-serif default sistem.
|
||||
- Karakter khusus XML dalam teks (`&`, `<`, `>`, `"`, `'`) di-escape dengan aman.
|
||||
- Format keluaran mengikuti format masukan. Masukan HEIC, RAW, PSD, dan SVG otomatis didekode sebelum diproses.
|
||||
Reference in New Issue
Block a user