You can edit the below JavaScript code to customize the image tool.
Apply Changes
function processImage(originalImg, text = "Колыбельная для Дружка", noiseIntensity = 40, glitchIntensity = 10) {
const canvas = document.createElement('canvas');
const width = originalImg.width;
const height = originalImg.height;
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
// Draw the original image onto the canvas
ctx.drawImage(originalImg, 0, 0);
// Get image data to apply creepy screamer/creepypasta effects
const imageData = ctx.getImageData(0, 0, width, height);
const data = imageData.data;
const outData = new Uint8ClampedArray(data.length);
// Calculate High Contrast Factor
const contrast = 80;
const factor = (259 * (contrast + 255)) / (255 * (259 - contrast));
// Step 1: Apply High Contrast, Grayscale/Red Tint, and TV Static Noise
for (let i = 0; i < data.length; i += 4) {
// Adjust contrast
let r = factor * (data[i] - 128) + 128;
let g = factor * (data[i+1] - 128) + 128;
let b = factor * (data[i+2] - 128) + 128;
// Convert to grayscale
let gray = 0.299 * r + 0.587 * g + 0.114 * b;
// Apply a creepy dark reddish/rusty tint often used in such memes
r = gray * 1.5;
g = gray * 0.6;
b = gray * 0.6;
// Generate noise
const noise = (Math.random() - 0.5) * noiseIntensity * 2;
outData[i] = Math.min(255, Math.max(0, r + noise));
outData[i+1] = Math.min(255, Math.max(0, g + noise));
outData[i+2] = Math.min(255, Math.max(0, b + noise));
outData[i+3] = data[i+3]; // Keep original alpha
}
// Step 2: Apply a VHS RGB Split / Glitch Effect
const shiftPixels = Math.floor(width * (glitchIntensity / 1000));
const shiftOffset = 4 * shiftPixels;
for (let i = 0; i < data.length; i += 4) {
// Red channel shifted to the left
if (i + shiftOffset < data.length) {
data[i] = outData[i + shiftOffset];
} else {
data[i] = outData[i];
}
// Green channel remains in place
data[i+1] = outData[i+1];
// Blue channel shifted to the right
if (i - shiftOffset >= 0) {
data[i+2] = outData[i - shiftOffset + 2];
} else {
data[i+2] = outData[i+2];
}
data[i+3] = outData[i+3];
}
ctx.putImageData(imageData, 0, 0);
// Step 3: Add a Dark Creepy Vignette
const gradient = ctx.createRadialGradient(
width / 2, height / 2, Math.max(width, height) * 0.2,
width / 2, height / 2, Math.max(width, height) * 0.7
);
gradient.addColorStop(0, 'rgba(0,0,0,0)');
gradient.addColorStop(1, 'rgba(0,0,0,0.85)');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, width, height);
// Step 4: Add Distorted TV Scanlines
ctx.fillStyle = 'rgba(0, 0, 0, 0.35)';
for (let y = 0; y < height; y += 4) {
ctx.fillRect(0, y, width, 1);
}
// Step 5: Overlay the Lullaby Text
if (text) {
const fontSize = Math.floor(Math.max(width, height) * 0.07);
ctx.font = `bold ${fontSize}px "Courier New", Courier, monospace`;
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
// Add a creepy red glow to the text
ctx.shadowColor = 'rgba(255, 0, 0, 0.9)';
ctx.shadowBlur = 20;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
const textX = width / 2;
const textY = height - (height * 0.05);
// Draw a thick black outline around the letters for readability
ctx.lineWidth = Math.max(2, fontSize * 0.05);
ctx.strokeStyle = '#000000';
ctx.strokeText(text, textX, textY);
// Fill the letters with ghostly white
ctx.fillStyle = '#ffffff';
ctx.fillText(text, textX, textY);
}
return canvas;
}
Apply Changes