1.1.129 • Published 7 days ago

@thi.ng/pixel-dither v1.1.129

Weekly downloads
-
License
Apache-2.0
Repository
github
Last release
7 days ago

pixel-dither

npm version npm downloads Twitter Follow

This project is part of the @thi.ng/umbrella monorepo.

About

screenshot

Extensible image dithering w/ various algorithm presets. This is a support package for @thi.ng/pixel.

The package provides the following dithering algorithm presets (can also be very easily extended via definition of custom kernels):

  • Atkinson
  • Bayes (ordered dithering w/ customizable sizes & levels)
  • Burkes
  • Diffusion (1D row/column, 2D)
  • Floyd-Steinberg
  • Jarvis-Judice-Ninke
  • Sierra 2-row
  • Stucki
  • Threshold

Status

STABLE - used in production

Search or submit any issues for this package

Installation

yarn add @thi.ng/pixel-dither

ES module import:

<script type="module" src="https://cdn.skypack.dev/@thi.ng/pixel-dither"></script>

Skypack documentation

For Node.js REPL:

# with flag only for < v16
node --experimental-repl-await

> const pixelDither = await import("@thi.ng/pixel-dither");

Package sizes (gzipped, pre-treeshake): ESM: 1.07 KB

Dependencies

Usage examples

Several demos in this repo's /examples directory are using this package.

A selection:

ScreenshotDescriptionLive demoSource
Showcase of various dithering algorithmsDemoSource
Image dithering and remapping using indexed palettesDemoSource

API

Generated API docs

import { intBufferFromImage, GRAY8 } from "@thi.ng/pixel";
import { ditherWith, ATKINSON } from "@thi.ng/pixel-dither";

const img = intBufferFromImage("foo.jpg");

// apply dithering to all channels in given pixel buffer
ditherWith(ATKINSON, img);

// first convert to 8-bit gray before dithering
ditherWith(ATKINSON, img.as(GRAY8));

// ...or apply dithering to select channels only
// use custom threshold & error spillage/bleed factor
ditherWith(ATKINSON, img, { channels: [1, 2, 3], threshold: 0.66, bleed: 0.75 });

Custom dither kernels

All bundled algorithm presets (apart from orderedDither()) are implemented as DitherKernel configurations for, defining how each dithered pixel's error should be diffused/distributed to neighbors. This approach makes it very easy to define custom dither configs, like so:

const CUSTOM: DitherKernel = {
    // X offsets of neighbor pixels to update
    ox: [1],
    // Y offsets of neighbor pixels to update
    oy: [1],
    // error weights for updated pixels
    weights: [1],
    // bit shift (scale factor)
    shift: 1,
};

ditherWith(CUSTOM, img);

The above config will distribute the error to a single pixel @ offset (1,1). However the error will be bit-shifted by 1 bit to the right (aka division-by-2). In code form:

pixels[i + ox + oy * width] += (err * weight) >> shift;

Important: Ensure the offset positions only refer to still unprocessed pixels, i.e. those to the right and/or below the currently processed pixel (in following rows).

You can see the result of this kernel in the pixel-dither demo.

Authors

Karsten Schmidt

If this project contributes to an academic publication, please cite it as:

@misc{thing-pixel-dither,
  title = "@thi.ng/pixel-dither",
  author = "Karsten Schmidt",
  note = "https://thi.ng/pixel-dither",
  year = 2021
}

License

© 2021 Karsten Schmidt // Apache Software License 2.0

1.1.129

7 days ago

1.1.128

9 days ago

1.1.127

12 days ago

1.1.126

21 days ago

1.1.125

24 days ago

1.1.124

1 month ago

1.1.123

1 month ago

1.1.122

1 month ago

1.1.121

1 month ago

1.1.120

1 month ago

1.1.119

2 months ago

1.1.118

2 months ago

1.1.117

2 months ago

1.1.116

2 months ago

1.1.115

2 months ago

1.1.114

2 months ago

1.1.113

2 months ago

1.1.112

2 months ago

1.1.111

2 months ago

1.1.108

2 months ago

1.1.109

2 months ago

1.1.110

2 months ago

1.1.107

2 months ago

1.1.106

2 months ago

1.1.105

3 months ago

1.1.104

3 months ago

1.1.103

3 months ago

1.1.100

3 months ago

1.1.102

3 months ago

1.1.101

3 months ago

1.1.98

3 months ago

1.1.97

3 months ago

1.1.96

4 months ago

1.1.95

4 months ago

1.1.92

5 months ago

1.1.94

4 months ago

1.1.93

5 months ago

1.1.91

5 months ago

1.1.90

5 months ago

1.1.89

5 months ago

1.1.70

8 months ago

1.1.74

7 months ago

1.1.73

8 months ago

1.1.72

8 months ago

1.1.71

8 months ago

1.1.78

6 months ago

1.1.77

7 months ago

1.1.76

7 months ago

1.1.75

7 months ago

1.1.79

6 months ago

1.1.81

6 months ago

1.1.80

6 months ago

1.1.85

6 months ago

1.1.83

6 months ago

1.1.82

6 months ago

1.1.88

5 months ago

1.1.87

5 months ago

1.1.86

6 months ago

1.1.59

10 months ago

1.1.63

9 months ago

1.1.62

9 months ago

1.1.60

9 months ago

1.1.67

8 months ago

1.1.66

8 months ago

1.1.65

9 months ago

1.1.64

9 months ago

1.1.69

8 months ago

1.1.68

8 months ago

1.1.56

11 months ago

1.1.58

11 months ago

1.1.57

11 months ago

1.1.55

11 months ago

1.1.54

12 months ago

1.1.52

1 year ago

1.1.53

1 year ago

1.1.49

1 year ago

1.1.48

1 year ago

1.1.47

1 year ago

1.1.46

1 year ago

1.1.51

1 year ago

1.1.50

1 year ago

1.1.45

1 year ago

1.1.44

1 year ago

1.1.43

1 year ago

1.1.40

1 year ago

1.1.42

1 year ago

1.1.38

1 year ago

1.1.37

1 year ago

1.1.36

1 year ago

1.1.35

1 year ago

1.1.39

1 year ago

1.1.29

2 years ago

1.1.28

2 years ago

1.1.30

2 years ago

1.1.34

1 year ago

1.1.33

1 year ago

1.1.32

1 year ago

1.1.31

2 years ago

1.1.27

2 years ago

1.1.26

2 years ago

1.1.25

2 years ago

1.1.23

2 years ago

1.1.24

2 years ago

1.1.22

2 years ago

1.1.16

2 years ago

1.1.15

2 years ago

1.1.19

2 years ago

1.1.18

2 years ago

1.1.17

2 years ago

1.1.21

2 years ago

1.1.20

2 years ago

1.1.12

2 years ago

1.1.11

2 years ago

1.1.10

2 years ago

1.1.14

2 years ago

1.1.13

2 years ago

1.1.9

2 years ago

1.1.8

2 years ago

1.1.1

2 years ago

1.1.0

2 years ago

1.1.7

2 years ago

1.1.6

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.3

2 years ago

1.1.2

2 years ago

1.0.10

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

0.1.0

3 years ago