-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrafi-contrast.js
111 lines (94 loc) · 3.34 KB
/
grafi-contrast.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
;(function () {
/**
## ImageData object constructor
Every return from grafi method is formatted to an ImageData object.
This constructor is used when `window` is not available.
*/
function ImageData (pixelData, width, height) {
this.width = width
this.height = height
this.data = pixelData
}
/**
## 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) {
var colorDepth = pixelData.length / (width * height)
// Length of pixelData must be multipul of available pixels (width * height).
// Maximum color depth allowed is 4 (RGBA)
if (Math.round(colorDepth) !== colorDepth || colorDepth > 4) {
throw new Error('data and size of the image does now match')
}
if (!(pixelData instanceof Uint8ClampedArray)) {
throw new Error('pixel data passed is not an Uint8ClampedArray')
}
// If window is avilable create ImageData using browser API,
// otherwise call ImageData constructor
if (typeof window === 'object' && colorDepth === 4) {
return new window.ImageData(pixelData, width, height)
}
return new ImageData(pixelData, width, height)
}
/**
## contrast method
Brief description
### Parameters
- imageData `Object`: ImageData object
- option `Object` : Option object
### Example
//code sample goes here
*/
function contrast (imgData, option) {
// check options object
option = option || {}
option.monochrome = option.monochrome || false
option.level = option.level || 1
var pixelSize = imgData.width * imgData.height
var dataLength = imgData.data.length
var colorDepth = dataLength / pixelSize
var level = option.level
if (colorDepth !== 4 && colorDepth !== 1) {
throw new Error('ImageObject has incorrect color depth')
}
var newPixelData = new Uint8ClampedArray(pixelSize * (option.monochrome || 4))
var p, _i, _data
for (p = 0; p < pixelSize; p++) {
_data = (imgData.data[p] - 128) * level + 128
// case 1. output should be 1 channel (monochrome)
if (option.monochrome) {
newPixelData[p] = _data
continue
}
// case 2. input is 1 channel but output should be RGBA
if (colorDepth === 1) {
newPixelData[_i] = _data
newPixelData[_i + 1] = _data
newPixelData[_i + 2] = _data
newPixelData[_i + 3] = 255
continue
}
// case 3. input is RGBA and output should also be RGBA
_i = p * 4
newPixelData[_i] = (imgData.data[_i] - 128) * level + 128
newPixelData[_i + 1] = (imgData.data[_i + 1] - 128) * level + 128
newPixelData[_i + 2] = (imgData.data[_i + 2] - 128) * level + 128
newPixelData[_i + 3] = imgData.data[_i + 3]
}
return formatter(newPixelData, imgData.width, imgData.height)
}
var grafi = {}
grafi.contrast = contrast
if (typeof module === 'object' && module.exports) {
module.exports = grafi
} else {
this.grafi = grafi
}
}())