Como usar o Canvas do JavaScript para adicionar uma borda personalizada a uma imagem mascarada

Como usar o Canvas do JavaScript para adicionar uma borda personalizada a uma imagem mascarada
Como usar o Canvas do JavaScript para adicionar uma borda personalizada a uma imagem mascarada

Dominando bordas de imagens mascaradas em JavaScript Canvas

A fusão de múltiplas imagens é uma etapa comum na criação de efeitos visuais em JavaScript. Definir as áreas visíveis de uma imagem com uma máscara é uma técnica frequente. Embora isso seja útil para criar formas exclusivas, pode ser um desafio adicionar uma borda ao redor dessas formas mascaradas. Embora o tela elemento em JavaScript oferece ampla manipulação de imagens, não é fácil ajustar a borda ao redor de uma imagem que foi mascarada.

Os desenvolvedores podem aplicar máscaras e recortar imagens de maneira criativa com o API de tela, embora, por padrão, qualquer borda gerada tenda a corresponder ao formato retangular da tela. Quando você deseja criar uma borda que corresponda às bordas de uma forma complicada definida por uma máscara, isso representa um problema. O objetivo é seguir o percurso preciso da máscara além da borda retangular simples.

Esta postagem explicará como aplicar uma máscara de imagem em JavaScript e, mais importante, como garantir que a forma distinta da imagem mascarada esteja cercada por uma borda. Além disso, abordaremos uma função que completa o mascaramento, mas ainda não possui uma solução de borda definida.

Você pode ajustar a aparência da borda aprendendo como trabalhar com operações compostas no canvas. Vamos começar e ver como usar os recursos de tela do JavaScript para adicionar a borda necessária ao redor de uma imagem mascarada.

Comando Exemplo de uso
globalCompositeOperation A composição das ações de desenho na tela é definida por este recurso. O globalCompositeOperation ='source-in' no exemplo garante que a imagem da máscara recorte a imagem principal para que apenas as áreas que se cruzam sejam vistas.
toDataURL() Transforma as informações do canvas em uma imagem codificada em Base64. Isso torna possível utilizar a imagem finalizada como PNG após aplicar a máscara e a borda. A saída da imagem do exemplo é produzida usando canvas.toDataURL('image/png').
crossOrigin Este recurso respeita as restrições de segurança ao permitir a utilização de imagens carregadas de um domínio diferente no canvas. MaskImg.crossOrigin = 'anonymous' garante que o acesso à imagem da máscara pode ser feito sem causar problemas de CORS.
beginPath() Na tela, um novo caminho pode ser iniciado usando este método. O segundo método chama ctx.beginPath() para garantir que o caminho siga o contorno da máscara enquanto desenha uma borda personalizada ao redor da imagem mascarada.
moveTo() Com este procedimento não são feitos desenhos; em vez disso, a "caneta" é movida para um novo local inicial. O ponto inicial da borda é posicionado no exemplo usando ctx.moveTo(0, 0), o que é essencial para desenhar a borda com precisão ao redor dos limites da máscara.
lineTo() Usando as coordenadas fornecidas como ponto de partida, esta técnica desenha uma linha reta. A borda da imagem mascarada é definida pelas linhas desenhadas na solução usando ctx.lineTo(maskImg.width, 0).
stroke() Ao longo do caminho designado, desenha as bordas ou linhas. Por exemplo, moveTo() e lineTo() são usados ​​para definir o formato da máscara e, em seguida, ctx.stroke() é usado para aplicar a borda ao redor da imagem mascarada.
lineWidth Determina a espessura das linhas pintadas na tela. O script estabelece uma borda grossa de 5 pixels ao redor da forma da máscara usando ctx.lineWidth = 5.
strokeStyle Indica a cor ou estilo da borda. A cor da borda no exemplo é definida como vermelha usando ctx.strokeStyle ='red'.

Reconhecendo como aplicar uma borda a uma imagem mascarada

O objetivo dos scripts fornecidos é usar outra imagem como máscara para uma imagem e, em seguida, usar o API de tela para adicionar uma borda personalizada ao redor da forma mascarada. Dois novos objetos de imagem são criados no início da função para a máscara e a imagem principal. Ao carregar fotos de fontes externas, a configuração de origem cruzada é essencial para evitar problemas devido ao CORS. Uma tela é formada e suas proporções são ajustadas para corresponder à imagem da máscara assim que ambas as imagens forem carregadas. Isso evita problemas de redimensionamento durante o desenho da imagem e garante que a tela esteja preparada para trabalhar com a área adequada.

O script então usa o desenharImagem() função para desenhar a imagem da máscara na tela. Ao fazer isso, a máscara é aplicada na tela, servindo como camada de base para o procedimento de mascaramento. A operação de composição global deve ser definida como "source-in" para aplicar a máscara corretamente. A tela é instruída a reter apenas as áreas da imagem primária que coincidem com a imagem da máscara. Em essência, a máscara define a forma na qual a imagem principal é recortada. A operação de composição é redefinida para "source-over" quando a imagem principal é desenhada dentro desta área de recorte, permitindo ações adicionais como pintura de bordas sem impactar o conteúdo previamente recortado.

Aplicar uma borda à forma mascarada envolve usar o AVC() técnica. O caminho ou formulário especificado na tela é indicado por este comando. Na segunda solução, moveTo() e lineTo() são combinados para gerar manualmente o caminho da tela e traçar as bordas da máscara. Com o uso dessas técnicas, você pode especificar manualmente o formato da borda e garantir que ela esteja de acordo com o formato da máscara, e não com o limite retangular da tela. Você tem controle total sobre a aparência da fronteira porque o largura da linha propriedade define a espessura da borda e o estiloAVC propriedade define sua cor.

Por último, a função toDataURL() é usada para transformar o canvas em uma string Base64. Ao fazer isso, a imagem finalizada – máscara e borda incluídas – é transformada em um formato que pode ser facilmente utilizado em outras áreas do programa ou carregado em um servidor. Para evitar erros de tempo, a promessa garante que esta operação só termine quando ambas as imagens estiverem totalmente carregadas. Esses scripts mostram como técnicas sofisticadas de modificação de imagem, incluindo mascaramento e aplicação de uma borda dinâmica que corresponda precisamente aos contornos da máscara, podem ser realizadas com o elemento canvas do JavaScript.

Método 1: usando o método Canvas and Stroke para adicionar uma borda personalizada a uma imagem mascarada

Para construir uma borda ao redor da imagem mascarada, esta abordagem utiliza JavaScript e a API Canvas. Stroke() é usado para delinear a forma mascarada.

function applyFiltersAndConvertToBase64(imageUrl, materialImage) {
    return new Promise((resolve, reject) => {
        const maskImg = new Image();
        const mainImg = new Image();
        maskImg.crossOrigin = "anonymous";
        mainImg.crossOrigin = "anonymous";
        let imagesLoaded = 0;
        const onLoad = () => {
            imagesLoaded++;
            if (imagesLoaded === 2) {
                const canvas = document.createElement('canvas');
                const ctx = canvas.getContext('2d');
                canvas.width = maskImg.width;
                canvas.height = maskImg.height;
                ctx.drawImage(maskImg, 0, 0);
                ctx.globalCompositeOperation = 'source-in';
                ctx.drawImage(mainImg, 0, 0, maskImg.width, maskImg.height);
                ctx.globalCompositeOperation = 'source-over';
                ctx.lineWidth = 5; // Border thickness
                ctx.strokeStyle = 'red'; // Border color
                ctx.stroke(); // Draw border around mask
                const base64Image = canvas.toDataURL('image/png');
                resolve(base64Image);
            }
        };
        maskImg.onload = onLoad;
        mainImg.onload = onLoad;
        maskImg.onerror = reject;
        mainImg.onerror = reject;
        maskImg.src = imageUrl;
        mainImg.src = materialImage;
    });
}

Opção 2: crie uma borda personalizada ao redor do formato da máscara usando o caminho da tela

Este método garante que a borda siga de perto a forma mascarada seguindo o caminho da máscara de imagem usando a API Canvas com JavaScript.

function applyFiltersAndConvertToBase64(imageUrl, materialImage) {
    return new Promise((resolve, reject) => {
        const maskImg = new Image();
        const mainImg = new Image();
        maskImg.crossOrigin = "anonymous";
        mainImg.crossOrigin = "anonymous";
        let imagesLoaded = 0;
        const onLoad = () => {
            imagesLoaded++;
            if (imagesLoaded === 2) {
                const canvas = document.createElement('canvas');
                const ctx = canvas.getContext('2d');
                canvas.width = maskImg.width;
                canvas.height = maskImg.height;
                ctx.drawImage(maskImg, 0, 0);
                ctx.globalCompositeOperation = 'source-in';
                ctx.drawImage(mainImg, 0, 0, maskImg.width, maskImg.height);
                ctx.globalCompositeOperation = 'source-over';
                // Create path for the mask shape
                ctx.beginPath();
                ctx.moveTo(0, 0);
                ctx.lineTo(maskImg.width, 0);
                ctx.lineTo(maskImg.width, maskImg.height);
                ctx.lineTo(0, maskImg.height);
                ctx.closePath();
                ctx.lineWidth = 5; // Border thickness
                ctx.strokeStyle = 'blue'; // Border color
                ctx.stroke(); // Apply the border along the path
                const base64Image = canvas.toDataURL('image/png');
                resolve(base64Image);
            }
        };
        maskImg.onload = onLoad;
        mainImg.onload = onLoad;
        maskImg.onerror = reject;
        mainImg.onerror = reject;
        maskImg.src = imageUrl;
        mainImg.src = materialImage;
    });
}

Aprimorando imagens mascaradas com bordas personalizadas em JavaScript

A experiência do usuário do seu aplicativo JavaScript pode ser bastante aprimorada pela capacidade de mascarar imagens e definir bordas personalizadas ao lidar com o API de tela. Com a ajuda do mascaramento, você pode decidir quais áreas de uma imagem serão visíveis dependendo de outra imagem, conhecida como máscara. Adicionar uma borda ao redor da zona mascarada é um problema que muitos desenvolvedores encontram, especialmente quando a máscara não tem um formato retangular simples. Projetos com bordas que correspondam exatamente ao contorno da máscara parecerão mais sofisticados e sofisticados.

Uma solução útil para este problema é usar a API Canvas Caminho2D objeto. Você pode usar o Path2D para projetar rotas complexas que se ajustem aos contornos da sua máscara e depois cercá-las com uma borda. Este método permite gerar bordas que correspondem precisamente aos cantos da sua máscara personalizada, indo além dos retângulos convencionais. Usando moveTo() e lineTo() juntos facilitam o traçado do contorno da máscara e garantem um alinhamento preciso da borda.

O desempenho é outro fator importante a ser levado em consideração, principalmente ao trabalhar com imagens maiores ou ao aplicar bordas dinamicamente em tempo real. A velocidade do seu aplicativo pode ser melhorada empregando estratégias como armazenar em cache a imagem mascarada, reduzir as operações de desenho e simplificar o processo de renderização da tela. Mesmo em configurações complexas ou de alto desempenho, você pode garantir que os procedimentos de mascaramento e desenho de bordas ocorram sem problemas, reduzindo ações inúteis.

Perguntas frequentes sobre mascaramento e bordas de imagens usando tela

  1. Em JavaScript, como posso usar outra imagem para mascarar uma?
  2. Usando 2 definido como 'source-in', desenhe a máscara na tela para mascarar uma imagem usando o API de tela. Para combinar com a máscara, isso cortará a imagem principal.
  3. Como posso criar uma borda para uma imagem mascarada que esteja em conformidade com seu formato?
  4. Depois de estabelecer a rota da máscara com moveTo() e lineTo(), use o stroke() técnica. Isso permitirá que você circunde o formato da máscara com uma borda personalizada.
  5. Qual é o propósito toDataURL() na manipulação de telas?
  6. O conteúdo da tela é transformado em uma imagem codificada em Base64 por meio do toDataURL() função, simplificando o uso ou distribuição como uma imagem PNG.
  7. Como posso otimizar as operações do canvas para desempenho?
  8. Reduza a quantidade de operações de desenho e pense em armazenar elementos comumente usados ​​para maximizar a velocidade da tela. Isso mantém seu aplicativo funcionando perfeitamente e reduz o número de redesenhos.
  9. Posso carregar imagens de origem cruzada em uma tela?
  10. Sim, mas para disponibilizar a imagem sem causar dificuldades de CORS, é necessário definir o crossOrigin propriedade para 'anonymous'.

Considerações finais sobre mascaramento e fronteiras

Em aplicativos JavaScript, mascarar imagens e aplicar bordas personalizadas na tela é uma forma eficaz de criar elementos visuais sofisticados. Os desenvolvedores têm a capacidade de manipular a renderização e o estilo das imagens utilizando o API de tela e comandos de desenho sofisticados, como AVC() e definições de caminho.

O desempenho suave é garantido pela otimização cuidadosa das operações de borda e máscara, especialmente para fotos maiores. Este tutorial fornece um método útil para pintar bordas dinamicamente em torno de imagens não retangulares, o que é útil ao desenvolver aplicativos on-line que sejam esteticamente agradáveis ​​e responsivos.

Referências para técnicas de mascaramento e borda em tela
  1. Guia detalhado sobre como usar API de tela para manipular imagens e máscaras, incluindo operações de desenho como 4 e 2: Documentos da Web do MDN .
  2. Explicação abrangente de como aplicar mascaramento de imagem e manipulação de recursos de origem cruzada em JavaScript: Tutoriais de tela HTML5 .
  3. Dicas de desempenho para aplicativos baseados em tela, com foco na otimização de renderização de imagens e operações de desenho: Revista sensacional .