mirror of
https://github.com/gchq/CyberChef
synced 2025-01-09 02:58:46 +00:00
Add bitwse mode to Generate Image operation
This commit is contained in:
parent
d025c8bd9a
commit
a2780ca056
1 changed files with 65 additions and 42 deletions
|
@ -6,9 +6,11 @@
|
||||||
|
|
||||||
import Operation from "../Operation.mjs";
|
import Operation from "../Operation.mjs";
|
||||||
import OperationError from "../errors/OperationError.mjs";
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
|
import Utils from "../Utils.mjs";
|
||||||
import {isImage} from "../lib/FileType";
|
import {isImage} from "../lib/FileType";
|
||||||
import {toBase64} from "../lib/Base64";
|
import {toBase64} from "../lib/Base64";
|
||||||
import jimp from "jimp";
|
import jimp from "jimp";
|
||||||
|
import {isWorkerEnvironment} from "../Utils";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate Image operation
|
* Generate Image operation
|
||||||
|
@ -32,7 +34,7 @@ class GenerateImage extends Operation {
|
||||||
{
|
{
|
||||||
"name": "Mode",
|
"name": "Mode",
|
||||||
"type": "option",
|
"type": "option",
|
||||||
"value": ["Greyscale", "RG", "RGB", "RGBA"]
|
"value": ["Greyscale", "RG", "RGB", "RGBA", "Bits"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Pixel Scale Factor",
|
"name": "Pixel Scale Factor",
|
||||||
|
@ -70,18 +72,35 @@ class GenerateImage extends Operation {
|
||||||
"RG": 2,
|
"RG": 2,
|
||||||
"RGB": 3,
|
"RGB": 3,
|
||||||
"RGBA": 4,
|
"RGBA": 4,
|
||||||
|
"Bits": 1/8,
|
||||||
};
|
};
|
||||||
|
|
||||||
const bytesPerPixel = bytePerPixelMap[mode];
|
const bytesPerPixel = bytePerPixelMap[mode];
|
||||||
|
|
||||||
if (input.length % bytesPerPixel !== 0) {
|
if (bytesPerPixel > 0 && input.length % bytesPerPixel !== 0) {
|
||||||
throw new OperationError(`Number of bytes is not a divisor of ${bytesPerPixel}`);
|
throw new OperationError(`Number of bytes is not a divisor of ${bytesPerPixel}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const height = Math.ceil(input.length / bytesPerPixel / width);
|
const height = Math.ceil(input.length / bytesPerPixel / width);
|
||||||
const image = await new jimp(width, height, (err, image) => {});
|
const image = await new jimp(width, height, (err, image) => {});
|
||||||
|
|
||||||
|
if (isWorkerEnvironment())
|
||||||
|
self.sendStatusMessage("Generate image from data...");
|
||||||
|
|
||||||
|
if (mode === "Bits") {
|
||||||
|
let index = 0;
|
||||||
|
for (let j = 0; j < input.length; j++) {
|
||||||
|
const curByte = Utils.bin(input[j]);
|
||||||
|
for (let k = 0; k < 8; k++, index++) {
|
||||||
|
const x = index % width;
|
||||||
|
const y = Math.floor(index / width);
|
||||||
|
|
||||||
|
const value = curByte[k] === "0" ? 0xFF : 0x00;
|
||||||
|
const pixel = jimp.rgbaToInt(value, value, value, 0xFF);
|
||||||
|
image.setPixelColor(pixel, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
while (i < input.length) {
|
while (i < input.length) {
|
||||||
const index = i / bytesPerPixel;
|
const index = i / bytesPerPixel;
|
||||||
|
@ -127,8 +146,12 @@ class GenerateImage extends Operation {
|
||||||
throw new OperationError(`Error while generating image from pixel values. (${err})`);
|
throw new OperationError(`Error while generating image from pixel values. (${err})`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (scale !== 1) {
|
if (scale !== 1) {
|
||||||
|
if (isWorkerEnvironment())
|
||||||
|
self.sendStatusMessage("Scale image...");
|
||||||
|
|
||||||
image.scaleToFit(width*scale, height*scale, jimp.RESIZE_NEAREST_NEIGHBOR);
|
image.scaleToFit(width*scale, height*scale, jimp.RESIZE_NEAREST_NEIGHBOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue