.color-picker-container {
display: flex;
flex-direction: column;
gap: 20px;
max-width: 600px;
margin: 0 auto;
}
.image-section {
position: relative;
border: 2px dashed #ccc;
border-radius: 8px;
overflow: hidden;
}
.image-canvas {
width: 100%;
height: 300px;
cursor: crosshair;
display: block;
}
.color-indicator {
position: absolute;
width: 20px;
height: 20px;
border: 2px solid white;
border-radius: 50%;
box-shadow: 0 0 0 2px black;
transform: translate(-50%, -50%);
pointer-events: none;
display: none;
}
.info-section {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 15px;
}
.color-display {
display: flex;
align-items: center;
gap: 15px;
}
.color-preview {
width: 60px;
height: 60px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #f0f0f0;
}
.color-info {
font-family: monospace;
}
.color-info p {
margin: 5px 0;
}
.reset-btn {
padding: 10px 20px;
background-color: #f0f0f0;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
transition: all 0.2s ease;
}
.reset-btn:hover {
background-color: #e0e0e0;
}
/* Versión modo oscuro */
@media (prefers-color-scheme: dark) {
.image-section {
border-color: #555;
}
.color-preview {
border-color: #444;
background-color: #333;
}
.reset-btn {
background-color: #333;
border-color: #555;
color: #f0f0f0;
}
.reset-btn:hover {
background-color: #444;
}
}
document.addEventListener('DOMContentLoaded', function() {
const canvas = document.getElementById('imageCanvas');
const ctx = canvas.getContext('2d');
const colorIndicator = document.getElementById('colorIndicator');
const colorPreview = document.getElementById('colorPreview');
const rgbValue = document.getElementById('rgbValue');
const hexValue = document.getElementById('hexValue');
const resetBtn = document.getElementById('resetBtn');
// Establecer dimensiones del canvas
function resizeCanvas() {
const displayWidth = canvas.clientWidth;
const displayHeight = canvas.clientHeight;
if (canvas.width !== displayWidth || canvas.height !== displayHeight) {
canvas.width = displayWidth;
canvas.height = displayHeight;
drawImage();
}
}
// Dibujar una imagen de muestra (en una aplicación real, esta sería una imagen cargada por el usuario)
function drawImage() {
// Limpiar canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Dibujar un degradado como imagen de muestra
const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);
gradient.addColorStop(0, '#ff0000');
gradient.addColorStop(0.2, '#ffff00');
gradient.addColorStop(0.4, '#00ff00');
gradient.addColorStop(0.6, '#00ffff');
gradient.addColorStop(0.8, '#0000ff');
gradient.addColorStop(1, '#ff00ff');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Agregar algunas formas para más variedad de colores
ctx.fillStyle = '#ffffff';
ctx.beginPath();
ctx.arc(canvas.width * 0.3, canvas.height * 0.3, 30, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = '#000000';
ctx.fillRect(canvas.width * 0.7, canvas.height * 0.7, 50, 50);
}
// Obtener color en una posición específica
function getColorAtPixel(x, y) {
const pixel = ctx.getImageData(x, y, 1, 1);
const data = pixel.data;
return {
r: data[0],
g: data[1],
b: data[2],
a: data[3]
};
}
// Convertir RGB a HEX
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
// Actualizar visualización del color
function updateColorDisplay(color) {
const hex = rgbToHex(color.r, color.g, color.b);
colorPreview.style.backgroundColor = hex;
rgbValue.textContent = `${color.r}, ${color.g}, ${color.b}`;
hexValue.textContent = hex;
}
// Manejar clic en el canvas
canvas.addEventListener('click', function(e) {
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
// Mostrar indicador
colorIndicator.style.display = 'block';
colorIndicator.style.left = `${e.clientX}px`;
colorIndicator.style.top = `${e.clientY}px`;
// Obtener y mostrar color
const color = getColorAtPixel(x, y);
updateColorDisplay(color);
});
// Reiniciar el selector de color
resetBtn.addEventListener('click', function() {
colorIndicator.style.display = 'none';
colorPreview.style.backgroundColor = '#f0f0f0';
rgbValue.textContent = '-';
hexValue.textContent = '-';
// Reiniciar color del modo oscuro
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
colorPreview.style.backgroundColor = '#333';
}
});
// Inicializar
resizeCanvas();
window.addEventListener('resize', resizeCanvas);
});