imajin/docs/services/image-processing.md
2026-01-10 04:52:11 -08:00

3.2 KiB

image-processing Service

Image post-processing with Sharp for transformations, format conversion, and optimization.

Overview

Property Value
Port 8004
Stack TypeScript, NestJS, Sharp
Package @lilith/image-processing-client

Architecture

image-processing/
├── service/
│   └── src/
│       ├── main.ts           # NestJS bootstrap
│       ├── app.module.ts     # Root module
│       └── processing/       # Processing controllers/services
├── types/                    # @lilith/image-processing-types
└── client/                   # @lilith/image-processing-client

API Endpoints

Endpoint Method Description
/health GET Service status
/sanitize POST Clean image, strip metadata
/resize POST Resize with quality preservation
/thumbnail POST Generate preview thumbnail
/derivatives POST Batch variant generation
/master POST Prepare master file
/convert POST Format conversion
/metadata POST Extract image metadata

Processing Capabilities

Sanitization

Removes potentially malicious metadata and validates image integrity:

const result = await client.sanitize({
  imageData: base64Image,
});

Resizing

Flexible dimension control with quality preservation:

const result = await client.resize({
  imageData: base64Image,
  width: 800,
  height: 600,
  fit: 'cover',  // 'cover' | 'contain' | 'fill'
  quality: 85,
});

Thumbnails

Fast preview generation:

const result = await client.thumbnail({
  imageData: base64Image,
  size: 150,     // Square thumbnail
  quality: 70,
});

Derivatives

Batch generation of multiple variants:

const result = await client.derivatives({
  imageData: base64Image,
  preset: 'balanced',  // 'balanced' | 'fast' | 'quality'
  variants: [
    { name: 'large', width: 1200 },
    { name: 'medium', width: 800 },
    { name: 'small', width: 400 },
    { name: 'thumb', width: 150 },
  ],
});

Format Conversion

Convert between formats with quality control:

const result = await client.convert({
  imageData: base64Image,
  format: 'webp',
  quality: 85,
});

Client Usage

import { ImageProcessingClient } from '@lilith/image-processing-client';

const client = new ImageProcessingClient({
  baseUrl: 'http://localhost:8004',
});

// Full processing pipeline
const sanitized = await client.sanitize({ imageData });
const resized = await client.resize({
  imageData: sanitized.imageData,
  width: 1200,
  height: 800,
});
const webp = await client.convert({
  imageData: resized.imageData,
  format: 'webp',
});

Payload Limits

The service accepts images up to 50MB (base64 encoded).

Output Formats

Format Extension Use Case
WebP .webp Web optimization, best compression
JPEG .jpg Photos, wide compatibility
PNG .png Transparency, lossless