konva/src/filters/Posterize.ts

47 lines
1.1 KiB
TypeScript
Raw Normal View History

2021-05-05 22:54:03 +08:00
import { Factory } from '../Factory';
import { Node, Filter } from '../Node';
import { getNumberValidator } from '../Validators';
2019-01-02 04:59:27 +08:00
/**
* Posterize Filter. Adjusts the channels so that there are no more
* than n different values for that channel. This is also applied
* to the alpha channel.
* @function
* @name Posterize
* @author ippo615
* @memberof Konva.Filters
* @param {Object} imageData
* @example
* node.cache();
* node.filters([Konva.Filters.Posterize]);
* node.levels(0.8); // between 0 and 1
*/
2021-05-05 22:19:24 +08:00
export const Posterize: Filter = function (imageData) {
2019-01-02 04:59:27 +08:00
// level must be between 1 and 255
2024-10-05 22:18:32 +08:00
let levels = Math.round(this.levels() * 254) + 1,
2019-01-02 04:59:27 +08:00
data = imageData.data,
len = data.length,
scale = 255 / levels,
i;
for (i = 0; i < len; i += 1) {
data[i] = Math.floor(data[i] / scale) * scale;
}
};
Factory.addGetterSetter(
Node,
'levels',
0.5,
2019-02-25 01:06:04 +08:00
getNumberValidator(),
2019-01-02 04:59:27 +08:00
Factory.afterSetFilter
);
/**
* get/set levels. Must be a number between 0 and 1. Use with {@link Konva.Filters.Posterize} filter.
2019-01-06 16:01:20 +08:00
* @name Konva.Node#levels
2019-01-02 04:59:27 +08:00
* @method
* @param {Number} level between 0 and 1
* @returns {Number}
*/