You can edit the below JavaScript code to customize the image tool.
Apply Changes
function processImage(originalImg, scanResult = "CLEAN", language = "ru", themeColor = "#00FF41") {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = originalImg.width;
canvas.height = originalImg.height;
// Draw the original image
ctx.drawImage(originalImg, 0, 0);
// Overlay a dark styling mask for the "scanner" effect
ctx.fillStyle = 'rgba(0, 10, 0, 0.85)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
const isClean = scanResult.toUpperCase() === "CLEAN";
const primaryColor = isClean ? themeColor : "#FF0033";
// Deterministic fake virus name selection
let virusName = "";
if (!isClean) {
const viruses = ["Trojan.Win32.Generic", "Ransom.WannaCry", "Backdoor.DarkTequila", "Adware.Agent", "Worm.Conficker"];
virusName = " [" + viruses[canvas.width % viruses.length] + "]";
}
const statusTextEN = isClean ? "CLEAN - NO VIRUSES" : ("INFECTED" + virusName);
const statusTextRU = isClean ? "БЕЗОПАСНО - ВИРУСОВ НЕТ" : ("ЗАРАЖЕНО" + virusName);
// Set localized layout texts
const textLang = {
title: language.toLowerCase() === "ru" ? "СИСТЕМА АНТИВИРУСНОГО СКАНИРОВАНИЯ ИЗОБРАЖЕНИЙ" : "IMAGE ANTIVIRUS SCANNING SYSTEM",
init: language.toLowerCase() === "ru" ? "[*] Инициализация сканера..." : "[*] Initiating scanner...",
analyze: language.toLowerCase() === "ru" ? "[*] Анализ графических данных (пиксели: " : "[*] Analyzing graphical data (pixels: ",
heuristics: language.toLowerCase() === "ru" ? "[*] Запуск эвристического анализатора..." : "[*] Running heuristic analyzer...",
signatures: language.toLowerCase() === "ru" ? "[*] Сравнение с базой сигнатур (1,402,391)..." : "[*] Comparing with signature database (1,402,391)...",
result: language.toLowerCase() === "ru" ? "[!] РЕЗУЛЬТАТ: " : "[!] FINAL STATUS: ",
status: language.toLowerCase() === "ru" ? statusTextRU : statusTextEN
};
// Draw cyberspace grid
ctx.strokeStyle = primaryColor;
ctx.globalAlpha = 0.15;
ctx.lineWidth = 1;
const gridSize = Math.max(20, Math.floor(canvas.width / 40));
for (let x = 0; x <= canvas.width; x += gridSize) {
ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, canvas.height); ctx.stroke();
}
for (let y = 0; y <= canvas.height; y += gridSize) {
ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(canvas.width, y); ctx.stroke();
}
ctx.globalAlpha = 1.0;
// Draw glowing scanning line
const scanLineY = canvas.height * 0.75;
const sweepHeight = 100;
const gradient = ctx.createLinearGradient(0, Math.max(0, scanLineY - sweepHeight), 0, scanLineY);
gradient.addColorStop(0, "rgba(0,0,0,0)");
gradient.addColorStop(1, primaryColor);
ctx.fillStyle = gradient;
ctx.globalAlpha = 0.3;
ctx.fillRect(0, Math.max(0, scanLineY - sweepHeight), canvas.width, sweepHeight);
ctx.globalAlpha = 1.0;
ctx.beginPath();
ctx.moveTo(0, scanLineY);
ctx.lineTo(canvas.width, scanLineY);
ctx.strokeStyle = primaryColor;
ctx.lineWidth = 3;
ctx.shadowBlur = 10;
ctx.shadowColor = primaryColor;
ctx.stroke();
ctx.shadowBlur = 0; // reset shadow
// Draw Target crosshair
const cx = canvas.width / 2;
const cy = canvas.height / 2;
const radius = Math.min(canvas.width, canvas.height) * 0.25;
ctx.strokeStyle = primaryColor;
ctx.lineWidth = 2;
ctx.beginPath();
ctx.arc(cx, cy, radius, 0, Math.PI * 2);
ctx.stroke();
const tickLen = 20;
ctx.beginPath();
ctx.moveTo(cx, cy - radius + tickLen); ctx.lineTo(cx, cy - radius - tickLen);
ctx.moveTo(cx, cy + radius - tickLen); ctx.lineTo(cx, cy + radius + tickLen);
ctx.moveTo(cx - radius + tickLen, cy); ctx.lineTo(cx - radius - tickLen, cy);
ctx.moveTo(cx + radius - tickLen, cy); ctx.lineTo(cx + radius + tickLen, cy);
ctx.stroke();
// Draw Terminal Activity Log Text
const fontSize = Math.max(12, Math.floor(canvas.height / 35));
ctx.font = `${fontSize}px "Courier New", Courier, monospace`;
ctx.fillStyle = primaryColor;
const lines = [
textLang.title,
"==================================================",
textLang.init,
textLang.analyze + (canvas.width * canvas.height) + ")",
textLang.heuristics,
textLang.signatures,
"...",
textLang.result + textLang.status
];
let py = gridSize;
let px = gridSize;
// Add background container for better text visibility
ctx.fillStyle = "rgba(0, 0, 0, 0.75)";
const maxTextWidth = Math.max(...lines.map(l => ctx.measureText(l).width));
ctx.fillRect(px - 10, py - 5, maxTextWidth + 20, lines.length * (fontSize * 1.5) + 15);
ctx.fillStyle = primaryColor;
ctx.textBaseline = 'top';
lines.forEach(line => {
if (line.includes(textLang.status)) {
ctx.font = `bold ${fontSize}px "Courier New", Courier, monospace`;
ctx.fillStyle = isClean ? themeColor : "#FF0033";
}
ctx.fillText(line, px, py);
py += fontSize * 1.5;
});
// Render the Final Big Outcome Stamp in Center
const stampText = isClean ? (language.toLowerCase() === "ru" ? "БЕЗОПАСНО" : "CLEAN") : (language.toLowerCase() === "ru" ? "УГРОЗА" : "INFECTED");
const stampSize = Math.max(24, Math.floor(canvas.width / 8));
ctx.font = `bold ${stampSize}px "Arial Black", Arial, sans-serif`;
ctx.save();
ctx.translate(cx, cy);
ctx.rotate(-Math.PI / 8);
ctx.textBaseline = 'middle';
ctx.textAlign = 'center';
const tw = ctx.measureText(stampText).width;
const th = stampSize;
ctx.fillStyle = isClean ? "rgba(0, 255, 0, 0.2)" : "rgba(255, 0, 0, 0.2)";
ctx.strokeStyle = isClean ? "#00FF00" : "#FF0000";
ctx.lineWidth = Math.max(3, stampSize / 15);
const padX = stampSize * 0.5;
const padY = stampSize * 0.3;
ctx.fillRect(-tw/2 - padX, -th/2 - padY, tw + padX*2, th + padY*2);
ctx.strokeRect(-tw/2 - padX, -th/2 - padY, tw + padX*2, th + padY*2);
ctx.fillStyle = isClean ? "#00FF00" : "#FF0000";
ctx.fillText(stampText, 0, 0);
ctx.restore();
// Render side Hex Dump (Only if the image is wide enough for it to fit smoothly)
if (canvas.width > 500) {
ctx.font = `${Math.max(10, fontSize * 0.8)}px "Courier New", Courier, monospace`;
ctx.fillStyle = primaryColor;
ctx.globalAlpha = 0.6;
const hexLines = 20;
const testWidth = ctx.measureText("00 00 00 00 00 00 00 00").width;
let hexX = canvas.width - testWidth - 20;
let hexY = canvas.height / 2 - (hexLines * fontSize * 1.2) / 2;
ctx.textBaseline = 'top';
for (let i = 0; i < hexLines; i++) {
let hexStr = "";
for (let j = 0; j < 8; j++) {
// Fixed pseudo-random numbers to keep result visually deterministic
let val = (canvas.width * (i + 1) * (j + 1)) % 256;
hexStr += val.toString(16).padStart(2, '0').toUpperCase() + " ";
}
if (hexY > 0 && hexY < canvas.height - fontSize) {
ctx.fillText(hexStr, hexX, hexY);
}
hexY += fontSize * 1.2;
}
}
return canvas;
}
Apply Changes