You can edit the below JavaScript code to customize the image tool.
Apply Changes
function processImage(originalImg, playerSize = "400") {
const size = parseInt(playerSize, 10) || 400;
// Create main container
const container = document.createElement('div');
container.style.width = `${size}px`;
container.style.height = `${size}px`;
container.style.position = 'relative';
container.style.borderRadius = '16px';
container.style.overflow = 'hidden';
container.style.boxShadow = '0 10px 30px rgba(0,0,0,0.5)';
container.style.fontFamily = "'Segoe UI', Roboto, Helvetica, Arial, sans-serif";
container.style.backgroundColor = '#111';
// Image background (Album Art)
const img = document.createElement('img');
img.src = originalImg.src;
img.style.width = '100%';
img.style.height = '100%';
img.style.objectFit = 'cover';
img.style.position = 'absolute';
img.style.top = '0';
img.style.left = '0';
img.style.zIndex = '1';
img.style.filter = 'brightness(0.6)';
img.style.transition = 'filter 0.3s ease';
// Canvas for Audio Visualizer
const canvas = document.createElement('canvas');
canvas.width = size;
canvas.height = size;
canvas.style.position = 'absolute';
canvas.style.top = '0';
canvas.style.left = '0';
canvas.style.zIndex = '2';
canvas.style.pointerEvents = 'none';
// Audio Element
const audio = document.createElement('audio');
audio.controls = true;
audio.style.position = 'absolute';
audio.style.bottom = '15px';
audio.style.left = '5%';
audio.style.width = '90%';
audio.style.zIndex = '4';
audio.style.display = 'none';
audio.style.opacity = '1';
audio.style.transition = 'opacity 0.3s ease';
// Drag & Drop Overlay
const overlay = document.createElement('div');
overlay.style.position = 'absolute';
overlay.style.top = '0';
overlay.style.left = '0';
overlay.style.width = '100%';
overlay.style.height = '100%';
overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.4)';
overlay.style.color = 'white';
overlay.style.display = 'flex';
overlay.style.flexDirection = 'column';
overlay.style.alignItems = 'center';
overlay.style.justifyContent = 'center';
overlay.style.textAlign = 'center';
overlay.style.zIndex = '3';
overlay.style.transition = 'all 0.3s ease';
overlay.style.backdropFilter = 'blur(4px)';
// Overlay content bits
const icon = document.createElement('img');
icon.src = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='48' height='48' fill='white'%3E%3Cpath d='M9 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h6V3H9z'/%3E%3C/svg%3E";
icon.style.width = '48px';
icon.style.height = '48px';
icon.style.marginBottom = '20px';
icon.style.opacity = '0.9';
icon.style.pointerEvents = 'none';
const h2 = document.createElement('h2');
h2.innerText = "Drag & Drop MP3";
h2.style.margin = "0 0 10px 0";
h2.style.fontSize = "26px";
h2.style.fontWeight = "600";
h2.style.pointerEvents = 'none';
const p = document.createElement('p');
p.innerText = "Play audio with this image as cover";
p.style.margin = "0";
p.style.fontSize = "14px";
p.style.opacity = "0.8";
p.style.pointerEvents = 'none';
overlay.appendChild(icon);
overlay.appendChild(h2);
overlay.appendChild(p);
// Assembly
container.appendChild(img);
container.appendChild(canvas);
container.appendChild(overlay);
container.appendChild(audio);
const ctx = canvas.getContext('2d');
let audioCtx, analyser, source;
let isInitialized = false;
// Sets up the web audio API and visualizer animation
function initAudio() {
if (isInitialized) return;
try {
const AudioContext = window.AudioContext || window.webkitAudioContext;
audioCtx = new AudioContext();
analyser = audioCtx.createAnalyser();
analyser.fftSize = 128;
source = audioCtx.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(audioCtx.destination);
isInitialized = true;
drawVisualizer();
} catch (e) {
console.error("Audio Context initialization failed or not supported natively:", e);
}
}
// Dynamic frequency bar renderer
function drawVisualizer() {
if (!isInitialized) return;
requestAnimationFrame(drawVisualizer);
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyser.getByteFrequencyData(dataArray);
ctx.clearRect(0, 0, canvas.width, canvas.height);
const barWidth = (canvas.width / bufferLength) * 2;
let x = 0;
for (let i = 0; i < bufferLength; i++) {
// Scale bar height based on total size, max val is 255
const barHeight = dataArray[i] * (size / 300);
const gradient = ctx.createLinearGradient(0, canvas.height, 0, canvas.height - barHeight);
gradient.addColorStop(0, 'rgba(255, 255, 255, 0.1)');
gradient.addColorStop(1, 'rgba(255, 255, 255, 0.8)');
ctx.fillStyle = gradient;
// Draw visualizer slightly above the bottom to leave room for the built-in control panel
ctx.fillRect(x, canvas.height - barHeight - 70, barWidth - 2, barHeight);
x += barWidth;
}
}
let dragCounter = 0;
// Configure UX Event Listeners for the Drag and drop behavior
container.addEventListener('dragenter', (e) => {
e.preventDefault();
dragCounter++;
overlay.style.opacity = '1';
overlay.style.backgroundColor = 'rgba(20, 150, 255, 0.5)';
overlay.style.backdropFilter = 'blur(8px)';
h2.innerText = audio.src ? 'Drop New MP3' : 'Drag & Drop MP3';
p.innerText = 'Release to start playback';
});
container.addEventListener('dragover', (e) => {
e.preventDefault();
});
container.addEventListener('dragleave', (e) => {
e.preventDefault();
dragCounter--;
if (dragCounter === 0) {
if (audio.src) {
overlay.style.opacity = '0';
} else {
overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.4)';
overlay.style.backdropFilter = 'blur(4px)';
h2.innerText = 'Drag & Drop MP3';
p.innerText = 'Play audio with this image as cover';
}
}
});
container.addEventListener('drop', (e) => {
e.preventDefault();
dragCounter = 0;
const files = e.dataTransfer.files;
if (files.length > 0) {
const file = files[0];
if (file.type.startsWith('audio/') || file.name.toLowerCase().endsWith('.mp3')) {
const objectURL = URL.createObjectURL(file);
audio.src = objectURL;
// Adjust interface visually
overlay.style.opacity = '0';
overlay.style.pointerEvents = 'none';
audio.style.display = 'block';
img.style.filter = 'brightness(0.5)';
initAudio();
setTimeout(() => {
audio.play().catch(e => console.log("Play interrupted or manual start necessary", e));
}, 100);
} else {
h2.innerText = "Invalid File";
p.innerText = "Please drop an MP3 audio file";
overlay.style.backgroundColor = 'rgba(255, 50, 50, 0.6)';
setTimeout(() => {
overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.4)';
h2.innerText = 'Drag & Drop MP3';
p.innerText = 'Play audio with this image as cover';
}, 1500);
}
}
});
// Handle resume for Audio contexts stuck visually suspended by browser logic
audio.addEventListener('play', () => {
if (audioCtx && audioCtx.state === 'suspended') {
audioCtx.resume();
}
});
return container;
}
Apply Changes