Browse Source

Extract RGBA Values Operation

Ge0rg3 5 years ago
parent
commit
48831225ac
3 changed files with 75 additions and 0 deletions
  1. 1 0
      src/core/config/Categories.json
  2. 9 0
      src/core/lib/Delim.mjs
  3. 65 0
      src/core/operations/ExtractRGBA.mjs

+ 1 - 0
src/core/config/Categories.json

@@ -378,6 +378,7 @@
             "Remove EXIF",
             "Extract EXIF",
             "Split Colour Channels",
+            "Extract RGBA",
             "View Bit Plane",
             "Extract LSB",
             "Rotate Image",

+ 9 - 0
src/core/lib/Delim.mjs

@@ -72,3 +72,12 @@ export const JOIN_DELIM_OPTIONS = [
     {name: "Nothing (join chars)", value: ""}
 ];
 
+/*
+  RGBA list delimiters.
+*/
+export const RGBA_DELIM_OPTIONS = [
+    {name: "Comma", value: ","},
+    {name: "Space", value: " "},
+    {name: "CRLF", value: "\\r\\n"},
+    {name: "Line Feed", value: "\n"}
+];

+ 65 - 0
src/core/operations/ExtractRGBA.mjs

@@ -0,0 +1,65 @@
+/**
+ * @author Ge0rg3 [georgeomnet+cyberchef@gmail.com]
+ * @copyright Crown Copyright 2019
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+import { isImage } from "../lib/FileType";
+import jimp from "jimp";
+
+import {RGBA_DELIM_OPTIONS} from "../lib/Delim.mjs";
+
+/**
+ * Extract RGBA operation
+ */
+class ExtractRGBA extends Operation {
+
+    /**
+     * ExtractRGBA constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Extract RGBA";
+        this.module = "Image";
+        this.description = "Extracts each pixel's RGBA value in an image. These are sometimes used in Steganography to hide text or data.";
+        this.infoURL = "https://en.wikipedia.org/wiki/RGBA_color_space";
+        this.inputType = "byteArray";
+        this.outputType = "string";
+        this.args = [
+            {
+                name: "Delimiter",
+                type: "editableOption",
+                value: RGBA_DELIM_OPTIONS
+            },
+            {
+                name: "Include Alpha",
+                type: "boolean",
+                value: true
+            }
+        ];
+    }
+
+    /**
+     * @param {byteArray} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    async run(input, args) {
+        if (!isImage(input)) throw new OperationError("Please enter a valid image file.");
+
+        const delimiter = args[0],
+            includeAlpha = args[1],
+            parsedImage = await jimp.read(Buffer.from(input));
+
+        let bitmap = parsedImage.bitmap.data;
+        bitmap = includeAlpha ? bitmap : bitmap.filter((val, idx) => idx % 4 !== 3);
+
+        return bitmap.join(delimiter);
+    }
+
+}
+
+export default ExtractRGBA;