🔴 Lumière inactinique

📷 Négatif

Aucun négatif

⚙️ Exposition

🧪 Développement

🧪 Révélateur
1:30
🛑 Arrêt
0:30
🔒 Fixateur
2:00
💧 Lavage
5:00
00:00
En attente

📊 État

Lumière inactinique
Exposé
Développé
Fixé
Lavé

📝 Journal

+ String(secs).padStart(2, '0'); } function updateTip(text) { document.getElementById('tip-text').textContent = text; } function resetDarkroom() { clearInterval(timerInterval); state = { negative: null, exposed: false, developed: false, stopped: false, fixed: false, washed: false, exposureTime: 10, developing: false }; document.getElementById('paper').classList.remove('exposed'); document.getElementById('paper-image').classList.remove('developing'); document.getElementById('paper-image').src = ''; document.getElementById('negative-select').value = ''; document.querySelector('#negative-preview').innerHTML = 'Aucun négatif'; document.getElementById('btn-expose').disabled = false; document.getElementById('btn-save').disabled = true; document.getElementById('timer').textContent = '00:00'; document.getElementById('timer-label').textContent = 'En attente'; ['exposed', 'developed', 'fixed', 'washed'].forEach(s => { document.getElementById('status-' + s).className = 'status-dot off'; }); log('--- Nouveau tirage ---', true); updateTip(tips[Math.floor(Math.random() * tips.length)]); } function savePrint() { const canvas = document.createElement('canvas'); canvas.width = 800; canvas.height = 600; const ctx = canvas.getContext('2d'); ctx.fillStyle = '#f5f0e8'; ctx.fillRect(0, 0, 800, 600); const link = document.createElement('a'); link.download = 'tirage-' + Date.now() + '.png'; link.href = canvas.toDataURL('image/png'); link.click(); log('Tirage sauvegardé !', true); } document.getElementById('status-safelight').classList.add('red'); log('Bienvenue dans la chambre noire', true); updateTip(tips[Math.floor(Math.random() * tips.length)]); + String(secs).padStart(2, '0'); } function updateTip(text) { document.getElementById('tip-text').textContent = text; } function resetDarkroom() { clearInterval(timerInterval); state = { negative: null, exposed: false, developed: false, stopped: false, fixed: false, washed: false, exposureTime: 10, developing: false, currentProcess: null }; document.getElementById('timer').textContent = '00:00'; document.getElementById('timer-label').textContent = 'En attente'; document.getElementById('paper').classList.remove('exposed'); document.getElementById('paper-image').classList.remove('developing'); document.getElementById('paper-image').src = ''; document.getElementById('light-beam').classList.remove('active'); document.getElementById('btn-expose').disabled = false; document.getElementById('btn-save').disabled = true; document.getElementById('negative-select').value = ''; document.querySelector('#negative-preview').innerHTML = 'Aucun négatif'; ['exposed', 'developed', 'fixed', 'washed'].forEach(s => { document.getElementById('status-' + s).className = 'status-dot off'; }); document.querySelectorAll('.tray').forEach(t => t.classList.remove('active')); log('--- Nouveau tirage ---', true); updateTip(tips[Math.floor(Math.random() * tips.length)]); } function savePrint() { if (!state.washed) { alert('Le tirage doit être complètement traité avant la sauvegarde !'); return; } // Create a canvas to save the print const canvas = document.createElement('canvas'); canvas.width = 800; canvas.height = 600; const ctx = canvas.getContext('2d'); // Draw white background (paper) ctx.fillStyle = '#f5f0e8'; ctx.fillRect(0, 0, 800, 600); // Draw the image const img = document.getElementById('paper-image'); if (img.src) { const tempImg = new Image(); tempImg.onload = () => { ctx.filter = 'grayscale(100%) contrast(1.1)'; ctx.drawImage(tempImg, 50, 50, 700, 500); // Download const link = document.createElement('a'); link.download = 'tirage-chambre-noire.jpg'; link.href = canvas.toDataURL('image/jpeg', 0.9); link.click(); log('Tirage sauvegardé !', true); }; tempImg.src = img.src; } } // Initialize document.getElementById('status-safelight').classList.add('red'); log('Bienvenue dans la chambre noire', true); log('Lumière inactinique activée'); updateTip(tips[Math.floor(Math.random() * tips.length)]);