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
- Em JavaScript, como posso usar outra imagem para mascarar uma?
- 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.
- Como posso criar uma borda para uma imagem mascarada que esteja em conformidade com seu formato?
- 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.
- Qual é o propósito toDataURL() na manipulação de telas?
- 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.
- Como posso otimizar as operações do canvas para desempenho?
- 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.
- Posso carregar imagens de origem cruzada em uma tela?
- 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
- 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 .
- Explicação abrangente de como aplicar mascaramento de imagem e manipulação de recursos de origem cruzada em JavaScript: Tutoriais de tela HTML5 .
- 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 .