12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import quantize from "quantize";
- const toString = array =>
- `#${((1 << 24) + (array[0] << 16) + (array[1] << 8) + array[2])
- .toString(16)
- .slice(1)}`;
- const proxy = (data, fn) => {
- if (data.map(item => Array.isArray(item)).includes(true)) {
- return data.map(item => fn(item));
- } else {
- return fn(data);
- }
- };
- const getGray = rgb => (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
- const colorThief = pixels => ({
- palette(count, quality) {
- if (typeof count === "undefined" || count < 2 || count > 256) {
- count = 10;
- }
- if (typeof quality === "undefined" || quality < 1) {
- quality = 10;
- }
- // Store the RGB values in an array format suitable for quantize function
- let pixelArray = [];
- for (
- let i = 0, offset, r, g, b, a;
- i < pixels.length / 4;
- i = i + quality
- ) {
- offset = i * 4;
- r = pixels[offset + 0];
- g = pixels[offset + 1];
- b = pixels[offset + 2];
- a = pixels[offset + 3];
- // If pixel is mostly opaque and not white
- if (a >= 125) {
- if (!(r > 250 && g > 250 && b > 250)) {
- pixelArray.push([r, g, b]);
- }
- }
- }
- this._data = quantize(pixelArray, count).palette() || null;
- return this;
- },
- color(quality) {
- let palette = this.palette(5, quality)._data;
- if (palette) {
- this._data = palette[0];
- return this;
- } else {
- console.error(
- "[MiniApp Color Thief] getColor has error: palette length is zero."
- );
- }
- },
- __proto__: {
- get() {
- return this._data;
- },
- getHex() {
- return proxy(this._data, toString);
- },
- getGray() {
- return proxy(this._data, getGray);
- },
- isDark() {
- return proxy(this._data, data => getGray(data) < 127.5);
- },
- isLight() {
- return proxy(this._data, data => getGray(data) >= 127.5);
- }
- }
- });
- export default colorThief;
|