Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

129
Vistas
Invertir el valor alfa de una imagen de lienzo

¿Cuál es la mejor manera de invertir el canal alfa del contenido de un lienzo?

He visto soluciones como esta , en las que puede revisar píxel por píxel y volver a asignar el valor alfa, pero esta es una operación costosa y esperaba que pudiera haber un método más eficaz (o una mejor práctica). , como una forma de usar context.filter o algo similar para hacer esto.

Como ejemplo simplificado, dada esta imagen, donde todos los píxeles tienen los mismos valores de canal RGB (negro) pero diferentes valores de canal alfa:

ingrese la descripción de la imagen aquí

Me gustaría producir esta imagen donde los canales RGB no cambian:

ingrese la descripción de la imagen aquí

Tenga en cuenta que hay un rango de valores alfa en las imágenes originales y finales.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Podemos usar globalCompositeOperation para invertir el color con alfa.

  1. Imagen de origen con degradado radial.

  2. Imagen de resultado con alfa invertido.

  3. Comprobación del resultado: dibujo de la imagen del resultado sobre un fondo amarillo

 const src_canvas = document.querySelector('canvas#source'); const src_ctx = src_canvas.getContext('2d'); const result_canvas = document.querySelector('canvas#result'); const result_ctx = result_canvas.getContext('2d'); const check_canvas = document.querySelector('canvas#check'); const check_ctx = check_canvas.getContext('2d'); const w = src_canvas.width = result_canvas.width = check_canvas.width = 180; const h = src_canvas.height = result_canvas.height = check_canvas.height = 180; const gradient = src_ctx.createRadialGradient(w/2,h/2,0, w/2,h/2,w/3); gradient.addColorStop(0, 'rgba(0,0,0,1)'); gradient.addColorStop(1, 'rgba(0,0,0,0)'); src_ctx.fillStyle = gradient; src_ctx.fillRect(0,0,w,h); result_ctx.drawImage(src_canvas,0,0); result_ctx.globalCompositeOperation = 'source-out'; result_ctx.fillRect(0,0,w,h); // uses default fillStyle = 'black' check_ctx.fillStyle = 'yellow'; // to check if the figure isn't fully opaque check_ctx.fillRect(0,0,w,h); check_ctx.drawImage(result_canvas,0,0);
 <canvas id="source"></canvas> <canvas id="result"></canvas> <canvas id="check"></canvas>

Funciona solo si el color base del degradado (su imagen transparente) y el color de fillStyle después de aplicar globalCompositeOperation="source-out" es el mismo. Si tiene diferentes colores en su imagen transparente, no funcionaría.

Tengo el negro como color base de la imagen transparente rgba(0,0,0,...) y el color negro como predeterminado para rellenar cuando result_ctx.fillRect(0,0,w,h) . Si, por ejemplo, el color base de la imagen de origen fuera rojo ( 'rgba(255,0,0,...)' ), entonces tuvimos que definirlo explícitamente antes de fillRect() -> result_ctx.fillStyle = 'red' ('rgb(255,0,0)') ;

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda