paradimg
Version:
Browser-side image URL modifiers and canvas effects.
216 lines (145 loc) • 4.83 kB
Markdown
# Paradimg
Browser-side image processing controlled through URL fragments.
Paradimg v0.1.0
By Rémino Rem
<https://remino.net/>
[Docs](https://remino.net/paradimg/) |
[Code Repo](https://github.com/remino/paradimg) |
[npm Package](https://www.npmjs.com/package/paradimg)
---
<!-- mtoc-start -->
- [Installation](#installation)
- [HTML (CDN)](#html-cdn)
- [npm](#npm)
- [Direct download](#direct-download)
- [Usage](#usage)
- [URL modifiers](#url-modifiers)
- [API](#api)
- [Custom pipelines](#custom-pipelines)
- [Behaviour](#behaviour)
- [Development](#development)
- [Licence](#licence)
<!-- mtoc-end -->
---
## Installation
### HTML (CDN)
Process marked image URLs automatically from a CDN:
```html
<script src="https://unpkg.com/paradimg"></script>
```
Mirrors:
- https://unpkg.com/paradimg
- https://cdn.jsdelivr.net/npm/paradimg
Use a pinned version in production:
```html
<script src="https://unpkg.com/paradimg@0.1.0"></script>
```
### npm
Install the package first:
```sh
npm install paradimg
```
Then process matching images automatically:
```js
import 'paradimg/auto'
```
Or call the explicit API when the page is ready:
```js
import { processImages } from 'paradimg'
await processImages()
```
### Direct download
Download the package tarball or individual files from npm/CDN:
- https://www.npmjs.com/package/paradimg
- https://unpkg.com/paradimg/dist/
- https://cdn.jsdelivr.net/npm/paradimg/dist/
The browser-ready auto-registration file is `dist/paradimg-auto.min.js`.
Distribution files:
- `dist/paradimg.mjs`: ES module library API.
- `dist/paradimg.cjs`: CommonJS library API.
- `dist/paradimg-auto.mjs`: ES module automatic entry.
- `dist/paradimg-auto.cjs`: CommonJS automatic entry.
- `dist/paradimg-auto.min.js`: minified classic browser automatic entry.
[Back to top](#)
---
## Usage
Add modifiers after `#?` in an image URL. They run from left to right.
```html
<img src="portrait.avif#?half&dither=4x4,8c" alt="A pixelated portrait" />
```
Paradimg selects `img[src*="#?"]`, decodes the source image, renders each
requested effect to a Canvas, then replaces the image with a PNG object URL.
The original URL remains available in `data-image-processor-original-src`.
[Back to top](#)
---
## URL modifiers
| Modifier | Description |
| --- | --- |
| `brightness=1.15` | Multiplies each RGB channel. Defaults to `1.15`. |
| `contrast=1.2` | Adjusts contrast around a midpoint of 128. Defaults to `1.2`. |
| `bw` | Converts to grayscale. Use `bw=invert` or `bw=threshold` for variants. |
| `half` | Resizes the image to 50% with smoothing. |
| `double` | Resizes to 200% with pixelated nearest-neighbour scaling. |
| `dither` | Applies an 8×8, 8-colour ordered dither. |
| `dither=4x4,4c` | Chooses a Bayer matrix (`2x2`, `4x4`, `8x8`, `16x16`, `none`) and colour levels (`2c`, `4c`, `8c`). |
| `dither=8x8,bw` | Uses two-level monochrome ordered dithering. |
Layout fragments can coexist with modifiers. Paradimg ignores unknown flags, so
an application can keep flags such as `large` or `full` for its own CSS:
```html
<img src="photo.jpg#?large&dither=4x4,4c" alt="Dithered photo" />
```
[Back to top](#)
---
## API
The package exports the processor and every built-in plugin:
```js
import {
ImageProcessor,
brightness,
bw,
contrast,
createImageProcessor,
dither,
double,
half,
parseHashFlags,
processImages,
} from 'paradimg'
```
`processImages(options?)` builds a default processor and resolves after every
matching image has been processed. `createImageProcessor(options?)` returns that
processor without running it. `parseHashFlags(src)` exposes the fragment parser.
[Back to top](#)
---
## Custom pipelines
Use only the effects and selector your page needs:
```js
import { ImageProcessor, dither, half } from 'paradimg'
const processor = new ImageProcessor([half, dither], 'img[data-pixel-art]')
await processor.processImages()
```
Plugins have a `keyword` and an async `process(img, context)` method. Register
your own plugin to introduce an application-specific URL modifier.
[Back to top](#)
---
## Behaviour
Dithered images are clickable after processing: clicking swaps between the
processed PNG and the original source. This is useful for inspecting an effect
without a separate before/after UI.
Paradimg is browser-only because it uses `<canvas>` and `HTMLImageElement`.
For a no-JavaScript baseline, generate static derivatives at build time and use
Paradimg as an optional enhancement.
[Back to top](#)
---
## Development
```sh
npm install
npm run build
npm test
```
Use Node 22.12 or newer. `npm run build` produces the npm library and the Astro
documentation site. `npm run release:dry-run` previews the release-it workflow.
[Back to top](#)
---
## Licence
ISC. See [LICENSE.md](LICENSE.md).