diff --git a/packages/media/cpp/.gitignore b/packages/media/cpp/.gitignore index 4088c43d..3b6abf47 100644 --- a/packages/media/cpp/.gitignore +++ b/packages/media/cpp/.gitignore @@ -1,5 +1,4 @@ build/ -dist/ .cache/ CMakeUserPresets.json .vs/ diff --git a/packages/media/cpp/README.md b/packages/media/cpp/README.md index 5090931e..6dedd13e 100644 --- a/packages/media/cpp/README.md +++ b/packages/media/cpp/README.md @@ -88,15 +88,108 @@ Sharp wraps libvips: **decode → process → encode**. We do the same with `vip - **HTTP `serve`**: cpp-httplib default thread pool (`CPPHTTPLIB_THREAD_POOL_COUNT` — see upstream `httplib.h`). - **libvips**: processing is thread-safe per image; configure process-wide concurrency with `VIPS_CONCURRENCY` (or `vips_concurrency_set` in code later if needed). -## CLI overview +## CLI examples + +Paths below use Unix style; on Windows run `dist\media-img.exe` and use `.\` or full paths as needed. + +### Help and version ```bash -media-img resize --help -media-img serve --help -media-img ipc --help +./dist/media-img --help +./dist/media-img resize --help +./dist/media-img -v ``` -`kbot` subcommand forwards to **`KBOT_EXE`** (optional). +### `resize` — fit inside a box (default), write WebP / AVIF by extension + +```bash +# Max 800×600, stay inside the box, Lanczos3 (default), write JPEG quality 85 (default) +./dist/media-img resize photo.jpg out.jpg --max-width 800 --max-height 600 + +# Same, explicit quality +./dist/media-img resize photo.jpg out.jpg --max-width 800 --max-height 600 -q 90 + +# WebP output (quality applies) +./dist/media-img resize photo.jpg thumb.webp --max-width 400 --max-height 400 -q 82 + +# AVIF output (quality applies; needs HEIF/AVIF support in your libvips build) +./dist/media-img resize photo.png out.avif --max-width 1200 --max-height 1200 -q 50 + +# Force output format when the path has no extension you trust +./dist/media-img resize in.tif /tmp/out --format webp --max-width 512 +``` + +### `resize` — square images (1:1) + +Use the **same** `--max-width` and `--max-height` (that value is the square side in pixels). Pick **`--fit`**: + +| `fit` | Result | +|-------|--------| +| **`cover`** | Fills the square; crops overflow (default crop: `--position centre`, or `attention` / `entropy` for smart crop). | +| **`contain`** | Full image inside the square; **letterboxing** on two sides if needed (`--background`). | +| **`fill`** | Stretches to the square (ignores aspect ratio). | + +```bash +# 512×512 crop-to-square (avatars, thumbnails) +./dist/media-img resize portrait.jpg avatar.jpg --fit cover --max-width 512 --max-height 512 + +# 1080×1080 WebP, smart crop on subject +./dist/media-img resize product.png grid.webp --fit cover --max-width 1080 --max-height 1080 --position attention -q 85 + +# Square canvas, no crop — padded bands with a colour +./dist/media-img resize panoramic.jpg square.jpg --fit contain --max-width 800 --max-height 800 --background '#111111' + +# Exact square by stretching (rare) +./dist/media-img resize any.jpg out.jpg --fit fill --max-width 256 --max-height 256 +``` + +**REST / IPC JSON:** e.g. `"max_width": 512, "max_height": 512, "fit": "cover", "position": "attention"`. + +### `resize` — cover (crop), contain (letterbox), rotate / flip + +```bash +# Cover: fill 1200×630, crop centre (use --position attention for smart crop) +./dist/media-img resize wide.jpg social.jpg --fit cover --max-width 1200 --max-height 630 + +# Contain: fit inside 800×600 canvas, letterbox with a background +./dist/media-img resize logo.png padded.png --fit contain --max-width 800 --max-height 600 --background '#1a1a1a' + +# EXIF autorotate (default), then rotate 90° CCW, vertical flip +./dist/media-img resize img.jpg rotated.jpg --max-width 1024 --rotate 90 --flip +``` + +### `serve` — HTTP REST + +```bash +# Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize with JSON body +./dist/media-img serve --host 127.0.0.1 -p 8080 +``` + +Example resize request (paths must be readable/writable by the server process): + +```bash +curl -s http://127.0.0.1:8080/health +curl -s -X POST http://127.0.0.1:8080/v1/resize \ + -H 'Content-Type: application/json' \ + -d '{"input":"/path/in.png","output":"/path/out.webp","max_width":400,"quality":80}' +``` + +### `ipc` — one JSON line per connection (TCP; Unix socket on Linux/macOS) + +```bash +./dist/media-img ipc --host 127.0.0.1 -p 9333 +# elsewhere: send a single line, read one line back, e.g. +# {"input":"/tmp/a.jpg","output":"/tmp/b.webp","max_width":320,"format":"webp"} +``` + +### `kbot` — forward to another binary (optional) + +Requires **`KBOT_EXE`** pointing at the kbot executable; remaining args are passed through. + +```bash +export KBOT_EXE=/path/to/kbot # Windows: set KBOT_EXE=C:\path\to\kbot.exe +./dist/media-img kbot ai --prompt "hello" +``` ## Tests diff --git a/packages/media/cpp/dist/libIex-3_1.dll b/packages/media/cpp/dist/libIex-3_1.dll new file mode 100644 index 00000000..41a79c8c Binary files /dev/null and b/packages/media/cpp/dist/libIex-3_1.dll differ diff --git a/packages/media/cpp/dist/libIlmThread-3_1.dll b/packages/media/cpp/dist/libIlmThread-3_1.dll new file mode 100644 index 00000000..5fc90cae Binary files /dev/null and b/packages/media/cpp/dist/libIlmThread-3_1.dll differ diff --git a/packages/media/cpp/dist/libMagickCore-6.Q16-7.dll b/packages/media/cpp/dist/libMagickCore-6.Q16-7.dll new file mode 100644 index 00000000..ff4d7545 Binary files /dev/null and b/packages/media/cpp/dist/libMagickCore-6.Q16-7.dll differ diff --git a/packages/media/cpp/dist/libOpenEXR-3_1.dll b/packages/media/cpp/dist/libOpenEXR-3_1.dll new file mode 100644 index 00000000..4a8a432c Binary files /dev/null and b/packages/media/cpp/dist/libOpenEXR-3_1.dll differ diff --git a/packages/media/cpp/dist/libaom.dll b/packages/media/cpp/dist/libaom.dll new file mode 100644 index 00000000..d726e55a Binary files /dev/null and b/packages/media/cpp/dist/libaom.dll differ diff --git a/packages/media/cpp/dist/libarchive-13.dll b/packages/media/cpp/dist/libarchive-13.dll new file mode 100644 index 00000000..a4cf0c9a Binary files /dev/null and b/packages/media/cpp/dist/libarchive-13.dll differ diff --git a/packages/media/cpp/dist/libbrotlicommon.dll b/packages/media/cpp/dist/libbrotlicommon.dll new file mode 100644 index 00000000..d13351d1 Binary files /dev/null and b/packages/media/cpp/dist/libbrotlicommon.dll differ diff --git a/packages/media/cpp/dist/libbrotlidec.dll b/packages/media/cpp/dist/libbrotlidec.dll new file mode 100644 index 00000000..f78febfe Binary files /dev/null and b/packages/media/cpp/dist/libbrotlidec.dll differ diff --git a/packages/media/cpp/dist/libbrotlienc.dll b/packages/media/cpp/dist/libbrotlienc.dll new file mode 100644 index 00000000..7ebf6883 Binary files /dev/null and b/packages/media/cpp/dist/libbrotlienc.dll differ diff --git a/packages/media/cpp/dist/libc++.dll b/packages/media/cpp/dist/libc++.dll new file mode 100644 index 00000000..8eb0e1f6 Binary files /dev/null and b/packages/media/cpp/dist/libc++.dll differ diff --git a/packages/media/cpp/dist/libcairo-2.dll b/packages/media/cpp/dist/libcairo-2.dll new file mode 100644 index 00000000..9f35086f Binary files /dev/null and b/packages/media/cpp/dist/libcairo-2.dll differ diff --git a/packages/media/cpp/dist/libcfitsio.dll b/packages/media/cpp/dist/libcfitsio.dll new file mode 100644 index 00000000..c0f67e38 Binary files /dev/null and b/packages/media/cpp/dist/libcfitsio.dll differ diff --git a/packages/media/cpp/dist/libcgif-0.dll b/packages/media/cpp/dist/libcgif-0.dll new file mode 100644 index 00000000..15fe20fa Binary files /dev/null and b/packages/media/cpp/dist/libcgif-0.dll differ diff --git a/packages/media/cpp/dist/libdicom-1.dll b/packages/media/cpp/dist/libdicom-1.dll new file mode 100644 index 00000000..947f5410 Binary files /dev/null and b/packages/media/cpp/dist/libdicom-1.dll differ diff --git a/packages/media/cpp/dist/libexif-12.dll b/packages/media/cpp/dist/libexif-12.dll new file mode 100644 index 00000000..9da6cabb Binary files /dev/null and b/packages/media/cpp/dist/libexif-12.dll differ diff --git a/packages/media/cpp/dist/libexpat-1.dll b/packages/media/cpp/dist/libexpat-1.dll new file mode 100644 index 00000000..d2abd64c Binary files /dev/null and b/packages/media/cpp/dist/libexpat-1.dll differ diff --git a/packages/media/cpp/dist/libffi-8.dll b/packages/media/cpp/dist/libffi-8.dll new file mode 100644 index 00000000..6910096d Binary files /dev/null and b/packages/media/cpp/dist/libffi-8.dll differ diff --git a/packages/media/cpp/dist/libfftw3-3.dll b/packages/media/cpp/dist/libfftw3-3.dll new file mode 100644 index 00000000..250fa3f5 Binary files /dev/null and b/packages/media/cpp/dist/libfftw3-3.dll differ diff --git a/packages/media/cpp/dist/libfontconfig-1.dll b/packages/media/cpp/dist/libfontconfig-1.dll new file mode 100644 index 00000000..365b8789 Binary files /dev/null and b/packages/media/cpp/dist/libfontconfig-1.dll differ diff --git a/packages/media/cpp/dist/libfreetype-6.dll b/packages/media/cpp/dist/libfreetype-6.dll new file mode 100644 index 00000000..db89dd81 Binary files /dev/null and b/packages/media/cpp/dist/libfreetype-6.dll differ diff --git a/packages/media/cpp/dist/libfribidi-0.dll b/packages/media/cpp/dist/libfribidi-0.dll new file mode 100644 index 00000000..71046e67 Binary files /dev/null and b/packages/media/cpp/dist/libfribidi-0.dll differ diff --git a/packages/media/cpp/dist/libgdk_pixbuf-2.0-0.dll b/packages/media/cpp/dist/libgdk_pixbuf-2.0-0.dll new file mode 100644 index 00000000..af66d618 Binary files /dev/null and b/packages/media/cpp/dist/libgdk_pixbuf-2.0-0.dll differ diff --git a/packages/media/cpp/dist/libgio-2.0-0.dll b/packages/media/cpp/dist/libgio-2.0-0.dll new file mode 100644 index 00000000..f9a06743 Binary files /dev/null and b/packages/media/cpp/dist/libgio-2.0-0.dll differ diff --git a/packages/media/cpp/dist/libglib-2.0-0.dll b/packages/media/cpp/dist/libglib-2.0-0.dll new file mode 100644 index 00000000..fa465f36 Binary files /dev/null and b/packages/media/cpp/dist/libglib-2.0-0.dll differ diff --git a/packages/media/cpp/dist/libgmodule-2.0-0.dll b/packages/media/cpp/dist/libgmodule-2.0-0.dll new file mode 100644 index 00000000..f3a708f2 Binary files /dev/null and b/packages/media/cpp/dist/libgmodule-2.0-0.dll differ diff --git a/packages/media/cpp/dist/libgobject-2.0-0.dll b/packages/media/cpp/dist/libgobject-2.0-0.dll new file mode 100644 index 00000000..99a5e28d Binary files /dev/null and b/packages/media/cpp/dist/libgobject-2.0-0.dll differ diff --git a/packages/media/cpp/dist/libharfbuzz-0.dll b/packages/media/cpp/dist/libharfbuzz-0.dll new file mode 100644 index 00000000..436c7995 Binary files /dev/null and b/packages/media/cpp/dist/libharfbuzz-0.dll differ diff --git a/packages/media/cpp/dist/libheif.dll b/packages/media/cpp/dist/libheif.dll new file mode 100644 index 00000000..95f45c4d Binary files /dev/null and b/packages/media/cpp/dist/libheif.dll differ diff --git a/packages/media/cpp/dist/libhwy.dll b/packages/media/cpp/dist/libhwy.dll new file mode 100644 index 00000000..39f1f464 Binary files /dev/null and b/packages/media/cpp/dist/libhwy.dll differ diff --git a/packages/media/cpp/dist/libimagequant.dll b/packages/media/cpp/dist/libimagequant.dll new file mode 100644 index 00000000..c6a1c51b Binary files /dev/null and b/packages/media/cpp/dist/libimagequant.dll differ diff --git a/packages/media/cpp/dist/libjpeg-62.dll b/packages/media/cpp/dist/libjpeg-62.dll new file mode 100644 index 00000000..3d1048b3 Binary files /dev/null and b/packages/media/cpp/dist/libjpeg-62.dll differ diff --git a/packages/media/cpp/dist/libjxl.dll b/packages/media/cpp/dist/libjxl.dll new file mode 100644 index 00000000..1ced8916 Binary files /dev/null and b/packages/media/cpp/dist/libjxl.dll differ diff --git a/packages/media/cpp/dist/libjxl_cms.dll b/packages/media/cpp/dist/libjxl_cms.dll new file mode 100644 index 00000000..d4f21fce Binary files /dev/null and b/packages/media/cpp/dist/libjxl_cms.dll differ diff --git a/packages/media/cpp/dist/libjxl_threads.dll b/packages/media/cpp/dist/libjxl_threads.dll new file mode 100644 index 00000000..766ae360 Binary files /dev/null and b/packages/media/cpp/dist/libjxl_threads.dll differ diff --git a/packages/media/cpp/dist/liblcms2-2.dll b/packages/media/cpp/dist/liblcms2-2.dll new file mode 100644 index 00000000..1aecb129 Binary files /dev/null and b/packages/media/cpp/dist/liblcms2-2.dll differ diff --git a/packages/media/cpp/dist/libmatio-14.dll b/packages/media/cpp/dist/libmatio-14.dll new file mode 100644 index 00000000..6c5e3707 Binary files /dev/null and b/packages/media/cpp/dist/libmatio-14.dll differ diff --git a/packages/media/cpp/dist/libniftiio.dll b/packages/media/cpp/dist/libniftiio.dll new file mode 100644 index 00000000..1de33eb2 Binary files /dev/null and b/packages/media/cpp/dist/libniftiio.dll differ diff --git a/packages/media/cpp/dist/libopenjp2.dll b/packages/media/cpp/dist/libopenjp2.dll new file mode 100644 index 00000000..5af11ac8 Binary files /dev/null and b/packages/media/cpp/dist/libopenjp2.dll differ diff --git a/packages/media/cpp/dist/libopenslide-1.dll b/packages/media/cpp/dist/libopenslide-1.dll new file mode 100644 index 00000000..de3c9f4e Binary files /dev/null and b/packages/media/cpp/dist/libopenslide-1.dll differ diff --git a/packages/media/cpp/dist/libpango-1.0-0.dll b/packages/media/cpp/dist/libpango-1.0-0.dll new file mode 100644 index 00000000..4ce75633 Binary files /dev/null and b/packages/media/cpp/dist/libpango-1.0-0.dll differ diff --git a/packages/media/cpp/dist/libpangocairo-1.0-0.dll b/packages/media/cpp/dist/libpangocairo-1.0-0.dll new file mode 100644 index 00000000..1be3ca83 Binary files /dev/null and b/packages/media/cpp/dist/libpangocairo-1.0-0.dll differ diff --git a/packages/media/cpp/dist/libpangoft2-1.0-0.dll b/packages/media/cpp/dist/libpangoft2-1.0-0.dll new file mode 100644 index 00000000..7198d71c Binary files /dev/null and b/packages/media/cpp/dist/libpangoft2-1.0-0.dll differ diff --git a/packages/media/cpp/dist/libpixman-1-0.dll b/packages/media/cpp/dist/libpixman-1-0.dll new file mode 100644 index 00000000..e2bac7b6 Binary files /dev/null and b/packages/media/cpp/dist/libpixman-1-0.dll differ diff --git a/packages/media/cpp/dist/libpng16-16.dll b/packages/media/cpp/dist/libpng16-16.dll new file mode 100644 index 00000000..1930ac8b Binary files /dev/null and b/packages/media/cpp/dist/libpng16-16.dll differ diff --git a/packages/media/cpp/dist/libpoppler-158.dll b/packages/media/cpp/dist/libpoppler-158.dll new file mode 100644 index 00000000..d0fd3cf7 Binary files /dev/null and b/packages/media/cpp/dist/libpoppler-158.dll differ diff --git a/packages/media/cpp/dist/libpoppler-glib-8.dll b/packages/media/cpp/dist/libpoppler-glib-8.dll new file mode 100644 index 00000000..2bd22454 Binary files /dev/null and b/packages/media/cpp/dist/libpoppler-glib-8.dll differ diff --git a/packages/media/cpp/dist/libraw_r-24.dll b/packages/media/cpp/dist/libraw_r-24.dll new file mode 100644 index 00000000..1ace3a72 Binary files /dev/null and b/packages/media/cpp/dist/libraw_r-24.dll differ diff --git a/packages/media/cpp/dist/librsvg-2-2.dll b/packages/media/cpp/dist/librsvg-2-2.dll new file mode 100644 index 00000000..86b1d809 Binary files /dev/null and b/packages/media/cpp/dist/librsvg-2-2.dll differ diff --git a/packages/media/cpp/dist/libsharpyuv-0.dll b/packages/media/cpp/dist/libsharpyuv-0.dll new file mode 100644 index 00000000..055f7edd Binary files /dev/null and b/packages/media/cpp/dist/libsharpyuv-0.dll differ diff --git a/packages/media/cpp/dist/libsqlite3-0.dll b/packages/media/cpp/dist/libsqlite3-0.dll new file mode 100644 index 00000000..b71f3172 Binary files /dev/null and b/packages/media/cpp/dist/libsqlite3-0.dll differ diff --git a/packages/media/cpp/dist/libtiff-6.dll b/packages/media/cpp/dist/libtiff-6.dll new file mode 100644 index 00000000..c5dbecd0 Binary files /dev/null and b/packages/media/cpp/dist/libtiff-6.dll differ diff --git a/packages/media/cpp/dist/libuhdr.dll b/packages/media/cpp/dist/libuhdr.dll new file mode 100644 index 00000000..e95dac45 Binary files /dev/null and b/packages/media/cpp/dist/libuhdr.dll differ diff --git a/packages/media/cpp/dist/libunwind.dll b/packages/media/cpp/dist/libunwind.dll new file mode 100644 index 00000000..92490189 Binary files /dev/null and b/packages/media/cpp/dist/libunwind.dll differ diff --git a/packages/media/cpp/dist/libvips-42.dll b/packages/media/cpp/dist/libvips-42.dll new file mode 100644 index 00000000..41eef29f Binary files /dev/null and b/packages/media/cpp/dist/libvips-42.dll differ diff --git a/packages/media/cpp/dist/libvips-cpp-42.dll b/packages/media/cpp/dist/libvips-cpp-42.dll new file mode 100644 index 00000000..a20f3e07 Binary files /dev/null and b/packages/media/cpp/dist/libvips-cpp-42.dll differ diff --git a/packages/media/cpp/dist/libwebp-7.dll b/packages/media/cpp/dist/libwebp-7.dll new file mode 100644 index 00000000..a71f70ab Binary files /dev/null and b/packages/media/cpp/dist/libwebp-7.dll differ diff --git a/packages/media/cpp/dist/libwebpdemux-2.dll b/packages/media/cpp/dist/libwebpdemux-2.dll new file mode 100644 index 00000000..7d3f484b Binary files /dev/null and b/packages/media/cpp/dist/libwebpdemux-2.dll differ diff --git a/packages/media/cpp/dist/libwebpmux-3.dll b/packages/media/cpp/dist/libwebpmux-3.dll new file mode 100644 index 00000000..6e93df79 Binary files /dev/null and b/packages/media/cpp/dist/libwebpmux-3.dll differ diff --git a/packages/media/cpp/dist/libxml2-16.dll b/packages/media/cpp/dist/libxml2-16.dll new file mode 100644 index 00000000..7194c2ca Binary files /dev/null and b/packages/media/cpp/dist/libxml2-16.dll differ diff --git a/packages/media/cpp/dist/libz1.dll b/packages/media/cpp/dist/libz1.dll new file mode 100644 index 00000000..582be5ef Binary files /dev/null and b/packages/media/cpp/dist/libz1.dll differ diff --git a/packages/media/cpp/dist/libznz.dll b/packages/media/cpp/dist/libznz.dll new file mode 100644 index 00000000..053d4f26 Binary files /dev/null and b/packages/media/cpp/dist/libznz.dll differ diff --git a/packages/media/cpp/dist/libzstd.dll b/packages/media/cpp/dist/libzstd.dll new file mode 100644 index 00000000..992af6dc Binary files /dev/null and b/packages/media/cpp/dist/libzstd.dll differ diff --git a/packages/media/cpp/dist/media-img.exe b/packages/media/cpp/dist/media-img.exe new file mode 100644 index 00000000..b30300ed Binary files /dev/null and b/packages/media/cpp/dist/media-img.exe differ diff --git a/packages/media/cpp/dist/media-img.pdb b/packages/media/cpp/dist/media-img.pdb new file mode 100644 index 00000000..c75dbec6 Binary files /dev/null and b/packages/media/cpp/dist/media-img.pdb differ diff --git a/packages/media/cpp/dist/vips-modules-8.18/vips-jxl.dll b/packages/media/cpp/dist/vips-modules-8.18/vips-jxl.dll new file mode 100644 index 00000000..74d38aa5 Binary files /dev/null and b/packages/media/cpp/dist/vips-modules-8.18/vips-jxl.dll differ diff --git a/packages/media/cpp/dist/vips-modules-8.18/vips-magick.dll b/packages/media/cpp/dist/vips-modules-8.18/vips-magick.dll new file mode 100644 index 00000000..8b0ca7be Binary files /dev/null and b/packages/media/cpp/dist/vips-modules-8.18/vips-magick.dll differ diff --git a/packages/media/cpp/dist/vips-modules-8.18/vips-openslide.dll b/packages/media/cpp/dist/vips-modules-8.18/vips-openslide.dll new file mode 100644 index 00000000..cbbbf7bc Binary files /dev/null and b/packages/media/cpp/dist/vips-modules-8.18/vips-openslide.dll differ diff --git a/packages/media/cpp/dist/vips-modules-8.18/vips-poppler.dll b/packages/media/cpp/dist/vips-modules-8.18/vips-poppler.dll new file mode 100644 index 00000000..9966d5e1 Binary files /dev/null and b/packages/media/cpp/dist/vips-modules-8.18/vips-poppler.dll differ diff --git a/packages/media/cpp/dist/vips.exe b/packages/media/cpp/dist/vips.exe new file mode 100644 index 00000000..73ead433 Binary files /dev/null and b/packages/media/cpp/dist/vips.exe differ diff --git a/packages/media/cpp/dist/vipsedit.exe b/packages/media/cpp/dist/vipsedit.exe new file mode 100644 index 00000000..85290a9e Binary files /dev/null and b/packages/media/cpp/dist/vipsedit.exe differ diff --git a/packages/media/cpp/dist/vipsheader.exe b/packages/media/cpp/dist/vipsheader.exe new file mode 100644 index 00000000..5765ddb6 Binary files /dev/null and b/packages/media/cpp/dist/vipsheader.exe differ diff --git a/packages/media/cpp/dist/vipsthumbnail.exe b/packages/media/cpp/dist/vipsthumbnail.exe new file mode 100644 index 00000000..454283bb Binary files /dev/null and b/packages/media/cpp/dist/vipsthumbnail.exe differ