From 04668928b1f14339cb5e82b7b260a022595e89ef Mon Sep 17 00:00:00 2001 From: Daniel Odendahl Jr Date: Fri, 13 Oct 2017 20:55:18 +0000 Subject: [PATCH] greyscale and invert in util --- commands/avatar-edit/greyscale.js | 11 ++--------- commands/avatar-edit/invert.js | 10 ++-------- commands/avatar-edit/rip.js | 11 ++--------- commands/avatar-edit/thug-life.js | 11 ++--------- structures/Util.js | 23 +++++++++++++++++++++++ 5 files changed, 31 insertions(+), 35 deletions(-) diff --git a/commands/avatar-edit/greyscale.js b/commands/avatar-edit/greyscale.js index abfb0c9f..7eda7f1b 100644 --- a/commands/avatar-edit/greyscale.js +++ b/commands/avatar-edit/greyscale.js @@ -1,6 +1,7 @@ const { Command } = require('discord.js-commando'); const { createCanvas, loadImage } = require('canvas'); const snekfetch = require('snekfetch'); +const { greyscale } = require('../../structures/Util'); module.exports = class GreyscaleCommand extends Command { constructor(client) { @@ -38,15 +39,7 @@ module.exports = class GreyscaleCommand extends Command { const canvas = createCanvas(avatar.width, avatar.height); const ctx = canvas.getContext('2d'); ctx.drawImage(avatar, 0, 0); - const imgData = ctx.getImageData(0, 0, avatar.width, avatar.height); - const { data } = imgData; - for (let i = 0; i < data.length; i += 4) { - const brightness = (0.34 * data[i]) + (0.5 * data[i + 1]) + (0.16 * data[i + 2]); - data[i] = brightness; - data[i + 1] = brightness; - data[i + 2] = brightness; - } - ctx.putImageData(imgData, 0, 0); + greyscale(ctx, 0, 0, avatar.width, avatar.height); return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'greyscale.png' }] }); } catch (err) { return msg.say(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); diff --git a/commands/avatar-edit/invert.js b/commands/avatar-edit/invert.js index b14b3267..ac365b23 100644 --- a/commands/avatar-edit/invert.js +++ b/commands/avatar-edit/invert.js @@ -1,6 +1,7 @@ const { Command } = require('discord.js-commando'); const { createCanvas, loadImage } = require('canvas'); const snekfetch = require('snekfetch'); +const { invert } = require('../../structures/Util'); module.exports = class InvertCommand extends Command { constructor(client) { @@ -37,14 +38,7 @@ module.exports = class InvertCommand extends Command { const canvas = createCanvas(avatar.width, avatar.height); const ctx = canvas.getContext('2d'); ctx.drawImage(avatar, 0, 0); - const imgData = ctx.getImageData(0, 0, avatar.width, avatar.height); - const { data } = imgData; - for (let i = 0; i < data.length; i += 4) { - data[i] = 255 - data[i]; - data[i + 1] = 255 - data[i + 1]; - data[i + 2] = 255 - data[i + 2]; - } - ctx.putImageData(imgData, 0, 0); + invert(ctx, 0, 0, avatar.width, avatar.height); return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'invert.png' }] }); } catch (err) { return msg.say(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); diff --git a/commands/avatar-edit/rip.js b/commands/avatar-edit/rip.js index 2d6450ae..a6c308f0 100644 --- a/commands/avatar-edit/rip.js +++ b/commands/avatar-edit/rip.js @@ -2,6 +2,7 @@ const { Command } = require('discord.js-commando'); const { createCanvas, loadImage } = require('canvas'); const snekfetch = require('snekfetch'); const path = require('path'); +const { greyscale } = require('../../structures/Util'); module.exports = class RIPCommand extends Command { constructor(client) { @@ -41,15 +42,7 @@ module.exports = class RIPCommand extends Command { const ctx = canvas.getContext('2d'); ctx.drawImage(base, 0, 0); ctx.drawImage(avatar, 158, 51, 200, 200); - const imgData = ctx.getImageData(158, 51, 200, 200); - const { data } = imgData; - for (let i = 0; i < data.length; i += 4) { - const brightness = (0.34 * data[i]) + (0.5 * data[i + 1]) + (0.16 * data[i + 2]); - data[i] = brightness; - data[i + 1] = brightness; - data[i + 2] = brightness; - } - ctx.putImageData(imgData, 158, 51); + greyscale(ctx, 158, 51, 200, 200); return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'rip.png' }] }); } catch (err) { return msg.say(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); diff --git a/commands/avatar-edit/thug-life.js b/commands/avatar-edit/thug-life.js index 2ea19a15..e3448b10 100644 --- a/commands/avatar-edit/thug-life.js +++ b/commands/avatar-edit/thug-life.js @@ -2,6 +2,7 @@ const { Command } = require('discord.js-commando'); const { createCanvas, loadImage } = require('canvas'); const snekfetch = require('snekfetch'); const path = require('path'); +const { greyscale } = require('../../structures/Util'); module.exports = class ThugLifeCommand extends Command { constructor(client) { @@ -39,16 +40,8 @@ module.exports = class ThugLifeCommand extends Command { const canvas = createCanvas(avatar.width, avatar.height); const ctx = canvas.getContext('2d'); ctx.drawImage(avatar, 0, 0); + greyscale(0, 0, avatar.width, avatar.height); ctx.drawImage(base, 0, 0, avatar.width, avatar.height); - const imgData = ctx.getImageData(0, 0, avatar.width, avatar.height); - const { data } = imgData; - for (let i = 0; i < data.length; i += 4) { - const brightness = (0.34 * data[i]) + (0.5 * data[i + 1]) + (0.16 * data[i + 2]); - data[i] = brightness; - data[i + 1] = brightness; - data[i + 2] = brightness; - } - ctx.putImageData(imgData, 0, 0); return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'thug-life.png' }] }); } catch (err) { return msg.say(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); diff --git a/structures/Util.js b/structures/Util.js index ed7071e6..87f0fd2e 100644 --- a/structures/Util.js +++ b/structures/Util.js @@ -60,6 +60,29 @@ class Util { static pad(text, prefix) { return `${prefix.slice(text.length)}${text}`; } + + 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; + } } module.exports = Util;