Please bookmark this page to avoid losing your image tool!

Image Computer Virus Scanner

(Free & Supports Bulk Upload)

Drag & drop your images here or

The result will appear here...
You can edit the below JavaScript code to customize the image tool.
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;
}

Free Image Tool Creator

Can't find the image tool you're looking for?
Create one based on your own needs now!

Description

This tool applies a stylized cybersecurity-themed overlay to an image, simulating an antivirus scan effect. It overlays visual elements such as a scanning line, a digital grid, crosshairs, and a terminal-style activity log that displays pseudo-technical analysis data and a final scan result. This tool is primarily intended for creative and entertainment purposes, such as generating fun social media content, creating cinematic textures for digital art, or adding a high-tech visual effect to images for storytelling.

Leave a Reply

Your email address will not be published. Required fields are marked *