-
Notifications
You must be signed in to change notification settings - Fork 0
/
grafi-invert.js
97 lines (86 loc) · 2.86 KB
/
grafi-invert.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
;(function () {
/**
## ImageData object constructor
Every return from grafi method is formatted to an ImageData object.
This constructor is used when `window` is not available.
(for example you are using grafi in node)
*/
function GrafiImageData (pixelData, width, height) {
this.width = width
this.height = height
this.data = pixelData
}
/**
## Color Depth Checker
To maintain simplicity of code, grafi only accepts ImageData in RGBA
Length of pixelData must be 4 times as much as available pixels (width * height).
*/
function checkColorDepth (dataset, width, height) {
var colorDepth
if (dataset.width && dataset.height) {
// When ImageData object was passed as dataset
colorDepth = dataset.data.length / (dataset.width * dataset.height)
} else {
// When just an array was passed as dataset
colorDepth = dataset.length / (width * height)
}
if (colorDepth !== 4) {
throw new Error('data and size of the image does now match')
}
}
/**
## formatter
Internal function used to format pixel data into ImageData object
### Parameters
- pixelData `Uint8ClampedArray`: pixel representation of the image
- width `Number`: width of the image
- hight `Number`: height of the image
### Example
formatter(new Uint8ClampedArray[400], 10, 10)
// ImageData { data: Uint8ClampedArray[400], width: 10, height: 10, }
*/
function formatter (pixelData, width, height) {
// check the size of data matches
checkColorDepth(pixelData, width, height)
if (!(pixelData instanceof Uint8ClampedArray)) {
throw new Error('pixel data passed is not an Uint8ClampedArray')
}
// If window is available create ImageData using browser API,
// otherwise call ImageData constructor
if (typeof window === 'object') {
return new window.ImageData(pixelData, width, height)
}
return new GrafiImageData(pixelData, width, height)
}
/**
## invert method
inverts color of an given image
### Parameters
- imageData `Object`: ImageData object
### Example
var input = { data: Uint8ClampedArray[400], width: 10, height: 10, }
grafi.invert(input)
*/
function invert (imgData) {
checkColorDepth(imgData)
var dataLength = imgData.data.length
var newPixeldata = new Uint8ClampedArray(dataLength)
var i
for (i = 0; i < dataLength; i++) {
// the image has Alpha channel, skip invert every 4th one
if ((i + 1) % 4 === 0) {
newPixeldata[i] = imgData.data[i]
continue
}
newPixeldata[i] = 255 - imgData.data[i]
}
return formatter(newPixeldata, imgData.width, imgData.height)
}
var grafi = {}
grafi.invert = invert
if (typeof module === 'object' && module.exports) {
module.exports = grafi
} else {
this.grafi = grafi
}
}())