Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

276
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!