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

274
Vistas
¿Hay un error en la función fillText de HTML Canvas?

Acabo de encontrar un comportamiento inesperado en el elemento HTML Canvas; Traté de desmenuzar el problema tanto como pude. En resumen, parece que ctx.fillText no puede representar el texto en regiones específicas del lienzo.

Este es el script más pequeño que pude escribir para reproducir el error de manera consistente (lo probé en diferentes máquinas, sistemas operativos y navegadores). Crea un lienzo negro (1,25×1,25 en unidades de espacio de dibujo, 1000×1000 en píxeles, el origen del espacio de dibujo está en el medio) y dibuja puntos rojos cuando pasa el mouse sobre él, pero hay varias franjas horizontales en las que falla para hacerlo

 // define boundaries of drawing space const left = -.625; const tops = -.625; const scale = 800; const width = 1.25; const height = 1.25; // create canvas let canvas = document.createElement("canvas"); canvas.width = scale * width; canvas.height = scale * height; canvas.style.backgroundColor = "black"; document.body.appendChild(canvas); // create context let ctx = canvas.getContext("2d"); ctx.scale(scale, scale); ctx.translate(-left, -tops); ctx.textBaseline = "middle"; ctx.textAlign = "center"; ctx.font = `.03px arial`; ctx.fillStyle = "rgba(208, 64, 64, 1)"; // coordinates follow mouse addEventListener("mousemove", event => { let mouseX = left + event.layerX / scale; let mouseY = tops + event.layerY / scale; ctx.fillText(".", mouseX, mouseY); });

Puede pegarlo en sus herramientas de desarrollo en aproximadamente: en blanco y verlo por sí mismo. En cualquier caso, aquí también hay un gif:

El bicho en acción

Como puede ver, quedan varias franjas horizontales intactas, a pesar de que las paso con el mouse. Además, la totalidad del 80 % inferior del lienzo no se ve afectada.

Algunas notas importantes:

  • Esto ocurre con cualquier texto, pero utilicé el punto porque ocupa la menor cantidad de espacio, mientras que los símbolos más grandes llenaron fácilmente los espacios en la parte superior y dificultaron la visualización.
  • El evento mousemove no es el culpable, mouseX y mouseY se actualizan correctamente y sin problemas.
  • No se debe a que mi mouse se arrastra demasiado rápido, deja espacios sin importar cuán lento me mueva.
  • No se debe a lo pequeña que es la escala, ya que la dimensión x tiene la misma escala que la dimensión y , pero la primera no presenta este problema.
  • Esto no ocurre con el método ctx.strokeText , que funciona bien.
  • Tampoco ocurre con ctx.fillPath .

¿Estoy haciendo algo mal? ¿O es esto realmente un error?

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

0

El problema es el tamaño de fuente extremadamente pequeño que está tratando de representar. No debe usar valores como .03px ; tiene sentido que los renderizadores no puedan renderizar algo así correctamente, considerando que el tamaño típico más pequeño que se puede pintar en una pantalla es 1 píxel (un poco más pequeño que el de las pantallas de alto DPI, pero probablemente no mucho menos de .25px ). Puede funcionar para pintar líneas simples, pero la representación es más complicada que eso (por ejemplo, sugerencias ).

Pruebe los siguientes valores:

  • scale = 80
  • width = 12.5
  • height = 12.5
  • ctx.font = `.3px arial`;

Alternativamente, intente pintar un punto o un cuadrado en lugar de un "." cuerda.

Como nota al margen, pude reproducir el problema en Chrome, pero en Firefox en realidad funciona bien.

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