Html2canvas: SVG<img/> é enorme

Criado em 11 abr. 2019  ·  9Comentários  ·  Fonte: niklasvh/html2canvas

Certifique-se de que está testando com a versão mais recente
Versões antigas não são suportadas e os problemas relatados para elas serão encerrados.

Siga as etapas gerais de solução de problemas primeiro:

  • [x] Você está usando a versão mais
  • [x] Você está testando usando a versão não reduzida do html2canvas e verificou todos os possíveis problemas relatados no console

Relatório de erros:

Se eu usar <img src="... .svg"> o svg é superdimensionado. Isso parece acontecer apenas com imagens SVG "responsivas" (imagens em que nenhuma altura ou largura foi definida na codificação real da imagem). A imagem e a contentBox são renderizadas com o tamanho correto, mas quando desenhada na tela, a imagem adota a altura da janela de visualização.

Aqui está o Fiddle: http://jsfiddle.net/1b4mLnfj/2/

screencapture-html2canvas-hertzen-2019-04-10-22_39_56
screencapture-html2canvas-hertzen-2019-04-10-22_40_16

Especificações:

  • Versão html2canvas testada com: 1.0.0-rc.1 / 1.0.0-rc.0
  • Navegador e versão: Chrome 73 / Opera 58
  • Sistema operacional: OS X
Bug Unverified

Comentários muito úteis

Obrigado, vou dar uma olhada nisso

Todos 9 comentários

Anexei um Fiddle, que espero deixar isso claro: http://jsfiddle.net/1b4mLnfj/2/

Obrigado, vou dar uma olhada nisso

Estou mexendo nisso há um tempo e parece que os limites do contêiner estão sendo calculados corretamente, mas a própria imagem vetorial está adotando as dimensões da janela de visualização. Parece que os limites e os limites curvados estão corretos, então não tenho certeza de onde fazer as alterações ... Alguém se deparou com um problema como este antes?

Após mais investigação, parece que isso só está acontecendo com imagens svg que são "responsivas" - se você abrir o svg no Illustrator e salvar sem a opção responsiva marcada, ele terá o tamanho correto ... essencialmente se o svg não ter uma altura e largura codificadas nele (o que o Illustrator chamou de "responsivo"), então ele adotará as dimensões da janela de visualização.

Portanto, uma solução potencial é substituir <img> por um <svg> verdadeiro usando uma biblioteca como svg-inject (https://github.com/iconfu/svg-inject) - aqui, se você aplicar uma altura e largura ao <img> , ele será adotado pelo <svg> quando injetado e isso evitará o redimensionamento na tela.

Existem algumas desvantagens para isso (como ao usar codificados, src's base64, ou se você tiver vários svgs com a mesma estrutura e estilo de classe embutido), mas talvez isso ajude alguém a lutar com o problema. Venho trabalhando nisso há alguns dias e esta é a melhor solução que tenho até agora. Não consigo encontrar nada do código html2canvas real que evite o redimensionamento de uma imagem SVG na tela se o SVG não tiver valores de altura / largura codificados.

Então, estou jogando a toalha neste, mas descobri que a solução está relacionada a como o svg é renderizado / desenhado na tela. Especificamente, em renderNodeContent se pudermos descobrir como determinar se uma imagem é um svg e também se não tiver a altura / largura codificada (responsivo), poderíamos desenhar esse svg com dimensões que correspondam à janela de visualização ( width = viewport.width, height = (image.height * viewport.width) / image.width)) então, teoricamente, isso poderia funcionar. Só não tenho certeza de como determinar se a imagem SVG está faltando esses valores de altura e largura.

alguma atualização aqui?

Parei de trabalhar no problema, mas espero que os comentários acima possam ser úteis.

Oi eu tive o mesmo problema.
Minha tag de imagem continha um estilo style='transition: transform 0.6s;' . Sem isso, a imagem é renderizada corretamente.

Esta página foi útil?
0 / 5 - 0 avaliações