# AIOZ Pin — Image Optimization

No authentication required for public gateway image optimization.
Supported formats: BMP, GIF, JPG, PNG, WebP

---

## Optimize Image via Gateway

GET https://{gateway}.aiozpin.network/ipfs/{cid}

```typescript
function optimizedImageUrl(cid: string, options: {
  gateway?: string
  width?: number
  height?: number
  fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad'
  gravity?: 'auto' | 'left' | 'right' | 'top' | 'bottom' | string
  quality?: number  // 0-100, JPG/WebP only
  dpr?: number      // device pixel ratio multiplier
  sharpen?: number  // 0-10
  anim?: boolean    // preserve GIF animation
  metadata?: 'keep' | 'copyright' | 'none'
  onerror?: 'redirect'
} = {}): string {
  const {
    gateway = 'public',
    width = 0,
    height = 0,
    fit = 'scale-down',
    quality = 80,
    ...rest
  } = options

  const params = new URLSearchParams()
  if (width) params.set('img-width', String(width))
  if (height) params.set('img-height', String(height))
  if (fit !== 'scale-down') params.set('img-fit', fit)
  if (quality !== 80) params.set('img-quality', String(quality))
  if (rest.gravity) params.set('img-gravity', rest.gravity)
  if (rest.dpr) params.set('img-dpr', String(rest.dpr))
  if (rest.sharpen) params.set('img-sharpen', String(rest.sharpen))
  if (rest.anim !== undefined) params.set('img-anim', String(rest.anim))
  if (rest.metadata) params.set('img-metadata', rest.metadata)
  if (rest.onerror) params.set('img-onerror', rest.onerror)

  const query = params.toString()
  return `https://${gateway}.aiozpin.network/ipfs/${cid}${query ? '?' + query : ''}`
}

// Resize to 320x320, contain fit, 80% quality
const url = optimizedImageUrl('QmYourCIDHere', { width: 320, height: 320, fit: 'contain' })
// https://public.aiozpin.network/ipfs/QmYourCIDHere?img-width=320&img-height=320&img-fit=contain

// High-DPR thumbnail for retina screens
const retinaUrl = optimizedImageUrl('QmYourCIDHere', { width: 200, height: 200, dpr: 2 })

// Download optimized image
async function downloadOptimizedImage(cid: string, outputPath: string) {
  const url = optimizedImageUrl(cid, { width: 320, height: 320, fit: 'contain', quality: 80 })
  const res = await fetch(url)
  const buffer = await res.arrayBuffer()
  require('fs').writeFileSync(outputPath, Buffer.from(buffer))
}
```

Parameters:
- img-width: resize width in pixels, 0 = original (default 0)
- img-height: resize height in pixels, 0 = original (default 0)
- img-fit: scale-down | contain | cover | crop | pad (default scale-down)
- img-gravity: when fit=cover, which area to keep — auto | left | right | top | bottom | {x}x{y} (0-1 scale)
- img-quality: 0-100 for JPG/WebP (default 80)
- img-dpr: device pixel ratio multiplier (default 1)
- img-sharpen: float 0-10 (default 0)
- img-anim: preserve GIF animation (default false)
- img-metadata: keep | copyright | none — EXIF metadata handling
- img-onerror: redirect — fall back to original on optimization error
