High performance, secure and easy to use image proxy based on sharp and libvips.
- Easy deployment
- Configurable operations
- Built-in secure cache with human readable entries and resistant against duplicates
- Adapter based cache and input
- Auto cache cleaner
- Twelve factor friendly
- Client SDK for URL generation
Usage
Using NPM package
You can use ipx
command to start server using:
$ npx ipx
Docker Image
Latest docker image is automatically built under pooya/ipx.
Run a test server:
docker run \
-it \
--rm \
--volume ./storage:/app/storage:ro \
--volume ./cache:/app/cache \
--port 3000:3000
pooya/ipx
Using docker-compose:
version: '3'
services:
ipx:
image: pooya/ipx
volumes:
- ./storage:/app/storage:ro
- ./cache:/app/cache
ports:
- 3000:3000
Programatic Usage
You can use IPX as a Connect/Express middleware or directly use IPX class.
import { IPX, IPXMiddleware } from 'ipx'
const ipx = new IPX()
const app = express()
app.use('/image', IPXMiddleware(ipx))
API
/{format}/{operations}/{src}
Operations are separated by a colon ,
(Example: op1,op2
) and their arguments separated using underscore _
(Example: s_200_300
)
ََUse _
value in place for {format}
or {operations}
to keep original values of source image.
Possible values for format: jpeg
,webp
or png
.
Examples
Just change format to webp
and keep other things same as source:
http://cdn.example.com/webp/_/avatars/buffalo.png
Keep original format (png
) and set width to 200
:
http://cdn.example.com/_/w_200/avatars/buffalo.png
Resize to 200x300px
using embed
method and change format to jpg
:
http://cdn.example.com/jpg/s_200_300,embed/avatars/buffalo.png
Operations
Operation | Arguments | Example | Description |
---|
s | width , height | s_200_300 | Resize image. |
w | width | w_200 | Change image with. |
h | height | h_200 | Change image height. |
embed | - | embed | Preserving aspect ratio, resize the image to the maximum width or height specified then embed on a background of the exact width and height specified. |
max | - | max | Preserving aspect ratio, resize the image to be as large as possible while ensuring its dimensions are less than or equal to the width and height specified. |
min | - | min | Preserving aspect ratio, resize the image to be as small as possible while ensuring its dimensions are greater than or equal to the width and height specified. |
Config
Config can be customized using IPX_*
environment variables.
Client
Import client:
import { img } from 'ipx/client'
const { img } = require('ipx/client')
img()
is a factory function to configure base options:
const getImage = img({
baseURL = 'https://cdn.example.com',
basePath = 'uploads',
opts = [],
format = 'jpg',
presets: {
chrome400: {
format: 'webp',
opts: { s: ['400', '400']}
}
}
})
getImage('posts/ipx.png', { w: 200 })
getImage.chrome400('posts/ipx.png')
License
MIT - Pooya Parsa