Cabeçalho -
BEM-VINDO(A)
Estilo Artístico - Pontilhismo & Cubismo * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, #1a2a6c, #b21f1f, #1a2a6c); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; background-attachment: fixed; } .container { background: rgba(255, 255, 255, 0.92); border-radius: 20px; box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3); width: 100%; max-width: 800px; overflow: hidden; } header { text-align: center; padding: 30px 20px; background: linear-gradient(to right, #4facfe, #00f2fe); color: white; } h1 { font-size: 2.2rem; margin-bottom: 10px; text-shadow: 0 2px 4px rgba(0,0,0,0.2); } .subtitle { opacity: 0.9; font-size: 1.1rem; } .upload-section { padding: 30px; text-align: center; } .file-input-label { display: inline-block; padding: 12px 25px; background: linear-gradient(to right, #ff9a9e, #fad0c4); color: white; border-radius: 50px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; border: none; } .file-input-label:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(255, 154, 158, 0.4); } #imageInput { display: none; } .buttons { display: flex; justify-content: center; gap: 20px; margin: 25px 0; flex-wrap: wrap; } .art-button { flex: 1; min-width: 150px; padding: 14px 25px; border: none; border-radius: 50px; font-size: 1.1rem; font-weight: 600; color: white; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; } .art-button::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent); transition: left 0.5s; } .art-button:hover::before { left: 100%; } .art-button:active { transform: scale(0.97); } #pointillismBtn { background: linear-gradient(to right, #ff7e5f, #feb47b); } #cubismBtn { background: linear-gradient(to right, #a8edea, #fed6e3); } .canvas-container { position: relative; margin: 0 20px 30px; border-radius: 15px; overflow: hidden; box-shadow: 0 10px 25px rgba(0,0,0,0.15); } canvas { display: block; width: 100%; height: auto; } #downloadBtn { display: block; margin: 0 auto 30px; padding: 12px 30px; background: linear-gradient(to right, #6a11cb, #2575fc); color: white; border: none; border-radius: 50px; font-size: 1.1rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: none; } #downloadBtn:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(106, 17, 203, 0.4); } .status { text-align: center; padding: 15px; font-size: 1rem; color: #555; min-height: 24px; } @media (max-width: 480px) { h1 { font-size: 1.8rem; } .buttons { flex-direction: column; } .art-button { min-width: 100%; } }

Estilo Artístico

Transforme suas imagens em obras de arte com pontilhismo e cubismo

Escolha uma imagem
Selecione uma imagem para começar
Pontilhismo Cubismo
Baixar Imagem
document.addEventListener('DOMContentLoaded', () => { const imageInput = document.getElementById('imageInput'); const pointillismBtn = document.getElementById('pointillismBtn'); const cubismBtn = document.getElementById('cubismBtn'); const downloadBtn = document.getElementById('downloadBtn'); const statusEl = document.getElementById('status'); const processedCanvas = document.getElementById('processedCanvas'); const ctx = processedCanvas.getContext('2d'); let originalImage = null; let isProcessing = false; // Processamento de imagem function applyPointillism() { if (!originalImage || isProcessing) return; isProcessing = true; statusEl.textContent = 'Aplicando efeito pontilhismo...'; // Redimensionar para performance mantendo proporção const maxWidth = 800; let width = originalImage.width; let height = originalImage.height; if (width > maxWidth) { height = Math.round((height * maxWidth) / width); width = maxWidth; } processedCanvas.width = width; processedCanvas.height = height; // Desenhar imagem original no canvas ctx.clearRect(0, 0, width, height); ctx.drawImage(originalImage, 0, 0, width, height); const imageData = ctx.getImageData(0, 0, width, height); const data = imageData.data; // Efeito pontilhismo const pointSize = 2.5; const step = 4; ctx.clearRect(0, 0, width, height); ctx.fillStyle = 'rgba(0,0,0,0)'; // Fundo transparente for (let y = 0; y < height; y += step) { for (let x = 0; x < width; x += step) { const i = (y * width + x) * 4; const r = data[i]; const g = data[i+1]; const b = data[i+2]; ctx.fillStyle = `rgb(${r},${g},${b})`; ctx.beginPath(); ctx.arc(x + pointSize/2, y + pointSize/2, pointSize/2, 0, Math.PI * 2); ctx.fill(); } } statusEl.textContent = 'Efeito pontilhismo aplicado!'; downloadBtn.style.display = 'block'; isProcessing = false; } function applyCubism() { if (!originalImage || isProcessing) return; isProcessing = true; statusEl.textContent = 'Aplicando efeito cubismo...'; // Redimensionar para performance mantendo proporção const maxWidth = 800; let width = originalImage.width; let height = originalImage.height; if (width > maxWidth) { height = Math.round((height * maxWidth) / width); width = maxWidth; } processedCanvas.width = width; processedCanvas.height = height; // Desenhar imagem original no canvas ctx.clearRect(0, 0, width, height); ctx.drawImage(originalImage, 0, 0, width, height); const imageData = ctx.getImageData(0, 0, width, height); const data = imageData.data; // Efeito cubismo (mosaico de cores médias) const gridSize = 25; const cols = Math.ceil(width / gridSize); const rows = Math.ceil(height / gridSize); ctx.clearRect(0, 0, width, height); for (let row = 0; row < rows; row++) { for (let col = 0; col < cols; col++) { const xStart = col * gridSize; const yStart = row * gridSize; const xEnd = Math.min(xStart + gridSize, width); const yEnd = Math.min(yStart + gridSize, height); let r = 0, g = 0, b = 0, count = 0; for (let y = yStart; y < yEnd; y++) { for (let x = xStart; x < xEnd; x++) { const i = (y * width + x) * 4; r += data[i]; g += data[i+1]; b += data[i+2]; count++; } } const avgR = Math.round(r / count); const avgG = Math.round(g / count); const avgB = Math.round(b / count); ctx.fillStyle = `rgb(${avgR},${avgG},${avgB})`; ctx.fillRect(xStart, yStart, xEnd - xStart, yEnd - yStart); } } statusEl.textContent = 'Efeito cubismo aplicado!'; downloadBtn.style.display = 'block'; isProcessing = false; } // Download da imagem processada downloadBtn.addEventListener('click', () => { processedCanvas.toBlob(blob => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'estilo-artistico.png'; a.click(); URL.revokeObjectURL(url); }); }); // Upload de imagem imageInput.addEventListener('change', e => { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = event => { const img = new Image(); img.onload = () => { originalImage = img; pointillismBtn.disabled = false; cubismBtn.disabled = false; statusEl.textContent = 'Imagem carregada! Selecione um efeito artístico.'; downloadBtn.style.display = 'none'; processedCanvas.width = 0; processedCanvas.height = 0; }; img.src = event.target.result; }; reader.readAsDataURL(file); }); // Eventos dos botões pointillismBtn.addEventListener('click', applyPointillism); cubismBtn.addEventListener('click', applyCubism); });