diff options
| author | 8cy <[email protected]> | 2020-04-29 17:37:31 -0700 |
|---|---|---|
| committer | 8cy <[email protected]> | 2020-04-29 17:37:31 -0700 |
| commit | 30f2e6293defe4fa4090a009c9a9032c695630e3 (patch) | |
| tree | 96406f0483073b209d72944c3c099858b51004c5 /src/utils | |
| parent | add contact cmds, qol updates/ formatting, v9.1.0 (diff) | |
| download | dep-core-30f2e6293defe4fa4090a009c9a9032c695630e3.tar.xz dep-core-30f2e6293defe4fa4090a009c9a9032c695630e3.zip | |
The Memeification, v9.2.0
- fix goodbye
- add more models
- formatting
- uncomment error loggers
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/Canvas.ts | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/utils/Canvas.ts b/src/utils/Canvas.ts new file mode 100644 index 0000000..4cbcac6 --- /dev/null +++ b/src/utils/Canvas.ts @@ -0,0 +1,183 @@ +import { createCanvas } from 'canvas' + +module.exports = class CanvasUtil { + static greyscale(ctx, x, y, width, height) { + const data = ctx.getImageData(x, y, width, height); + for (let i = 0; i < data.data.length; i += 4) { + const brightness = (0.34 * data.data[i]) + (0.5 * data.data[i + 1]) + (0.16 * data.data[i + 2]); + data.data[i] = brightness; + data.data[i + 1] = brightness; + data.data[i + 2] = brightness; + } + ctx.putImageData(data, x, y); + return ctx; + } + + static invert(ctx, x, y, width, height) { + const data = ctx.getImageData(x, y, width, height); + for (let i = 0; i < data.data.length; i += 4) { + data.data[i] = 255 - data.data[i]; + data.data[i + 1] = 255 - data.data[i + 1]; + data.data[i + 2] = 255 - data.data[i + 2]; + } + ctx.putImageData(data, x, y); + return ctx; + } + + static silhouette(ctx, x, y, width, height) { + const data = ctx.getImageData(x, y, width, height); + for (let i = 0; i < data.data.length; i += 4) { + data.data[i] = 0; + data.data[i + 1] = 0; + data.data[i + 2] = 0; + } + ctx.putImageData(data, x, y); + return ctx; + } + + static sepia(ctx, x, y, width, height) { + const data = ctx.getImageData(x, y, width, height); + for (let i = 0; i < data.data.length; i += 4) { + const brightness = (0.34 * data.data[i]) + (0.5 * data.data[i + 1]) + (0.16 * data.data[i + 2]); + data.data[i] = brightness + 100; + data.data[i + 1] = brightness + 50; + data.data[i + 2] = brightness; + } + ctx.putImageData(data, x, y); + return ctx; + } + + static contrast(ctx, x, y, width, height) { + const data = ctx.getImageData(x, y, width, height); + const factor = (259 / 100) + 1; + const intercept = 128 * (1 - factor); + for (let i = 0; i < data.data.length; i += 4) { + data.data[i] = (data.data[i] * factor) + intercept; + data.data[i + 1] = (data.data[i + 1] * factor) + intercept; + data.data[i + 2] = (data.data[i + 2] * factor) + intercept; + } + ctx.putImageData(data, x, y); + return ctx; + } + + static distort(ctx, amplitude, x, y, width, height, strideLevel = 4) { + const data = ctx.getImageData(x, y, width, height); + const temp = ctx.getImageData(x, y, width, height); + const stride = width * strideLevel; + for (let i = 0; i < width; i++) { + for (let j = 0; j < height; j++) { + const xs = Math.round(amplitude * Math.sin(2 * Math.PI * 3 * (j / height))); + const ys = Math.round(amplitude * Math.cos(2 * Math.PI * 3 * (i / width))); + const dest = (j * stride) + (i * strideLevel); + const src = ((j + ys) * stride) + ((i + xs) * strideLevel); + data.data[dest] = temp.data[src]; + data.data[dest + 1] = temp.data[src + 1]; + data.data[dest + 2] = temp.data[src + 2]; + } + } + ctx.putImageData(data, x, y); + return ctx; + } + + static hasAlpha(image) { + const canvas = createCanvas(image.width, image.height); + const ctx = canvas.getContext('2d'); + ctx.drawImage(image, 0, 0); + const data = ctx.getImageData(0, 0, canvas.width, canvas.height); + let hasAlphaPixels = false; + for (let i = 3; i < data.data.length; i += 4) { + if (data.data[i] < 255) { + hasAlphaPixels = true; + break; + } + } + return hasAlphaPixels; + } + + static drawImageWithTint(ctx, image, color, x, y, width, height) { + const { fillStyle, globalAlpha } = ctx; + ctx.fillStyle = color; + ctx.drawImage(image, x, y, width, height); + ctx.globalAlpha = 0.5; + ctx.fillRect(x, y, width, height); + ctx.fillStyle = fillStyle; + ctx.globalAlpha = globalAlpha; + } + + static shortenText(ctx, text, maxWidth) { + let shorten = false; + while (ctx.measureText(text).width > maxWidth) { + if (!shorten) shorten = true; + text = text.substr(0, text.length - 1); + } + return shorten ? `${text}...` : text; + } + + static wrapText(ctx, text, maxWidth) { + return new Promise(resolve => { + if (ctx.measureText(text).width < maxWidth) return resolve([text]); + if (ctx.measureText('W').width > maxWidth) return resolve(null); + const words = text.split(' '); + const lines = []; + let line = ''; + while (words.length > 0) { + let split = false; + while (ctx.measureText(words[0]).width >= maxWidth) { + const temp = words[0]; + words[0] = temp.slice(0, -1); + if (split) { + words[1] = `${temp.slice(-1)}${words[1]}`; + } else { + split = true; + words.splice(1, 0, temp.slice(-1)); + } + } + if (ctx.measureText(`${line}${words[0]}`).width < maxWidth) { + line += `${words.shift()} `; + } else { + lines.push(line.trim()); + line = ''; + } + if (words.length === 0) lines.push(line.trim()); + } + return resolve(lines); + }); + } + + static centerImage(base, data) { + const dataRatio = data.width / data.height; + const baseRatio = base.width / base.height; + let { width, height } = data; + let x = 0; + let y = 0; + if (baseRatio < dataRatio) { + height = data.height; + width = base.width * (height / base.height); + x = (data.width - width) / 2; + y = 0; + } else if (baseRatio > dataRatio) { + width = data.width; + height = base.height * (width / base.width); + x = 0; + y = (data.height - height) / 2; + } + return { x, y, width, height }; + } + + static centerImagePart(data, maxWidth, maxHeight, widthOffset, heightOffest) { + let { width, height } = data; + if (width > maxWidth) { + const ratio = maxWidth / width; + width = maxWidth; + height *= ratio; + } + if (height > maxHeight) { + const ratio = maxHeight / height; + height = maxHeight; + width *= ratio; + } + const x = widthOffset + ((maxWidth / 2) - (width / 2)); + const y = heightOffest + ((maxHeight / 2) - (height / 2)); + return { x, y, width, height }; + } +};
\ No newline at end of file |