SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
27.03.2025

Obtendo a Cor RGB de um Pixel do Canvas Durante o Movimento do Mouse

Resposta Rápida

Para determinar a cor de um pixel no canvas quando o evento mousemove ocorre, você pode usar o seguinte código JavaScript. Ele identifica a posição atual do cursor do mouse, aplica o método getImageData ao contexto do canvas para recuperar informações do pixel e extrai os valores RGB:

JAVASCRIPT
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); canvas.addEventListener('mousemove', e => { const [r, g, b] = ctx.getImageData(e.offsetX, e.offsetY, 1, 1).data; console.log(`rgb(${r}, ${g}, ${b})`); });

Neste exemplo, e.offsetX e e.offsetY representam as coordenadas do mouse em relação aos eixos X e Y, respectivamente, e o método getImageData retorna um array contendo os dados de cor no formato RGB.

Considerando o Canal Alfa: A Transparência é um Amigo Complicado

É importante lembrar do canal alfa, que é responsável pela transparência e pode distorcer a percepção das cores, especialmente se o fundo onde o pixel está localizado não for levado em conta. Aqui está um exemplo de código que considera o valor alfa:

JAVASCRIPT
function getCompositeColor(r, g, b, a, br, bg, bb) { return [ (1 - a) * br + a * r, (1 - a) * bg + a * g, (1 - a) * bb + a * b ].map(Math.round); } const bgColor = { r: 255, g: 255, b: 255 }; canvas.addEventListener('mousemove', e => { const [r, g, b, a] = ctx.getImageData(e.offsetX, e.offsetY, 1, 1).data; const [red, green, blue] = getCompositeColor(r, g, b, a / 255, bgColor.r, bgColor.g, bgColor.b); console.log(`rgb(${red}, ${green}, ${blue})`); });

Desempenho: Mantenha-se Rápido como um Gepardo

Para evitar sobrecarga desnecessária em sua aplicação ao chamar getImageData em cada evento mousemove, você pode recuperar os dados da imagem uma vez e usá-los para cada movimento do cursor. Essa abordagem acelera significativamente a execução do script:

JAVASCRIPT
let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); let data = imageData.data; canvas.addEventListener('mousemove', e => { let index = (e.offsetY * imageData.width + e.offsetX) * 4; let r = data[index]; let g = data[index + 1]; let b = data[index + 2]; console.log(`rgb(${r}, ${g}, ${b})`); });

Usar requestAnimationFrame ajuda a tornar as atualizações na tela mais suaves. Abaixo está um exemplo que combina este método com o evento mousemove:

JAVASCRIPT
const updateColor = (e) => { let index = (e.offsetY * imageData.width + e.offsetX) * 4; let r = data[index], g = data[index + 1], b = data[index + 2]; console.log(`rgb(${r}, ${g}, ${b})`); }; let lastEvent; canvas.onmousemove = function(e) { lastEvent = e; }; function loop() { if (lastEvent) { updateColor(lastEvent); lastEvent = null; } requestAnimationFrame(loop); } loop();

O Poder do jQuery

Se você aprecia o jQuery por sua concisão e conveniência, pode usá-lo para lidar com eventos de mousemove e simplificar os cálculos das coordenadas:

JAVASCRIPT
const $canvas = $('#canvas'); const ctx = $canvas.get(0).getContext('2d'); let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); let data = imageData.data; $canvas.on('mousemove', function(e) { let offset = $canvas.offset(); let x = e.pageX - offset.left; let y = e.pageY - offset.top; let index = (y * imageData.width + x) * 4; let r = data[index], g = data[index + 1], b = data[index + 2]; console.log(`rgb(${r}, ${g}, ${b})`); });

Visualização

O código abaixo trata a tela do seu computador como um canvas com pixels vibrantes e o cursor do mouse como uma ferramenta para identificar a cor de cada pixel.

MARKDOWN
Tela 🖼️: [🔴, 🟢, 🔵, 🟡]
JAVASCRIPT
canvas.addEventListener('mousemove', (event) => { // Cursor atuando como um detector de cores });
MARKDOWN
Posição do Cursor: [x, y] Cor do Pixel: 🔴

Dessa forma, você pode explorar facilmente as características de cor de qualquer pixel abaixo do seu cursor.

Aplicações Avançadas: Um Mundo Além do Canvas

Essa abordagem possui diversas aplicações:

1. Criando uma Paleta de Cores

Você pode desenvolver uma paleta de cores para os usuários, ajudando-os a selecionar tons específicos para seus projetos.

2. Arte Interativa e Design de Jogos

Essa técnica permite a criação de elementos gráficos interativos e introduz novas dimensões na jogabilidade.

3. Visualização de Dados

Extrair cores de pixels pode aumentar a interação com gráficos em visualizações de dados.

O Dilema da Densidade de Pixels

Uma alta densidade de pixels em alguns displays pode criar problemas devido a incompatibilidades de tamanho. Use o devicePixelRatio para fazer ajustes:

JAVASCRIPT
const ratio = window.devicePixelRatio || 1; canvas.addEventListener('mousemove', e => { const [r, g, b] = ctx.getImageData(e.offsetX * ratio, e.offsetY * ratio, 1, 1).data; console.log(`rgb(${r}, ${g}, ${b})`); });

Limitações de CORS: Lide com os Pixels com Cuidado!

Trabalhar com imagens externas em seu canvas pode vir com restrições de segurança. Para evitar isso, use imagens com cabeçalhos CORS apropriados ou incorpore as imagens diretamente através de links de URI de dados.

Recursos Úteis

  1. CanvasRenderingContext2D: Método getImageData() - Web API | MDN
  2. Obter a Cor do Pixel do Canvas Durante o Movimento do Mouse - Stack Overflow
  3. Tutorial: Coordenadas do Mouse no Canvas HTML5
  4. Tutorial: Método getImageData() do Canvas HTML
  5. Manipulando Pixels Usando Canvas | CSS-Tricks
  6. Exemplo Interativo no CodePen: Paleta de Cores

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!