¿Hay alguna manera de representar html en una imagen como PNG? Sé que es posible con el lienzo, pero me gustaría representar el elemento html estándar como div, por ejemplo.
Para crear algún tipo de asistencia al usuario, por ejemplo. Lamentablemente, eso no es posible (¿por razones de seguridad?). Tiene que pedirle al usuario que presione PrintScreen para hacer algo.
Parece interesante, pero no pude hacerlo funcionar, así que elegí la solución John Fisher. Gracias por la información, ¡veré este proyecto en el futuro!
Martin Delille
@ MartinDelille: aquí un artículo sobre el uso de HTML2Canvas para crear IMAGEN y también puede descargarlo en el lado del cliente codepedia.info/2016/02/…
Satinder singh
3
dom-to-image (ver la respuesta de tsayen) hace un trabajo mucho mejor para representar una imagen precisa.
JBE
3
Esta solución es muy lenta
hamboy75
3
otro problema, si el elemento está oculto o detrás de otro elemento, esto no funcionará
Yousef
91
¿Puedo recomendar la biblioteca dom-to-image , que fue escrita únicamente para resolver este problema (soy el responsable)
Así es como lo usa (un poco más aquí ):
var node = document.getElementById('my-node');
domtoimage.toPng(node).then (function(dataUrl){var img =newImage();
img.src = dataUrl;
document.appendChild(img);}).catch(function(error){
console.error('oops, something went wrong!', error);});
¡Esto es genial! ¿Alguna forma de duplicar el tamaño de salida?
cronoklee
¡Gracias! Pero, ¿qué quieres decir exactamente con "duplicar el tamaño"?
tsayen
2
Lo primero que me viene a la mente: intenta renderizar tu imagen en SVG (usando domtoimage.toSvg), luego hazlo tú mismo en el lienzo e intenta jugar con la resolución de ese lienzo de alguna manera. Probablemente sea posible implementar una función como algún tipo de opción de representación en la propia biblioteca, por lo que puede pasar las dimensiones de la imagen en píxeles. Si lo necesita, le agradecería que creara un problema en github.
tsayen
8
Esto es MUCHO mejor que html2canvas. Gracias.
c
1
@Subho es una cadena que contiene la URL con datos codificados en base64
tsayen
66
Hay muchas opciones y todas tienen sus ventajas y desventajas.
Opción 1: use una de las muchas bibliotecas disponibles
Gracias por una respuesta detallada con muchas posibles soluciones
bszom
wkhtmltoimage / pdf admite la representación de JavaScript. Se puede establecer un retardo de Javascript o dejar cheque wkhtml para un window.status specifc (que se puede establecer con javascript cuando se conoce su materia se hace js)
Daniel Z.
PhantomJS admite cosas dinámicas como Google Maps. Es realmente un navegador web completo, solo que sin una pantalla adjunta. Sin embargo, debe esperar un poco para que Google Map cargue los mosaicos con la geografía (espero 500 ms y permito que las personas cambien el retraso; si no es suficiente, volver a ejecutar sin aumentar el tiempo está bien, porque esos mosaicos están en caché).
Ladislav Zima
50
Todas las respuestas aquí usan bibliotecas de terceros, mientras que el procesamiento de HTML en una imagen puede ser relativamente simple en Javascript puro. No se fue incluso un artículo al respecto en la sección de lienzo en el MDN.
El truco es este:
crear un SVG con un nodo foreignObject que contenga su XHTML
establecer el src de una imagen a la url de datos de ese SVG
drawImage en el lienzo
establecer datos de lienzo para image.src de destino
Por razones de seguridad, el SVG como URL de datos de una imagen actúa como un alcance CSS aislado para el HTML ya que no se pueden cargar fuentes externas. Por lo tanto, una fuente de Google, por ejemplo, tiene que estar en línea usando una herramienta como esta .
Incluso cuando el HTML dentro del SVG excede el tamaño de la imagen, se dibujará correctamente en el lienzo. Pero la altura real no se puede medir a partir de esa imagen. Una solución de altura fija funcionará bien, pero la altura dinámica requerirá un poco más de trabajo. Lo mejor es representar los datos SVG en un iframe (para un alcance CSS aislado) y usar el tamaño resultante para el lienzo.
¡Agradable! Eliminar la dependencia de la biblioteca externa es, de hecho, la mejor manera de hacerlo. Cambié mi respuesta aceptada :-)
Martin Delille
Ese artículo ya no está allí.
MSC
2
Gran respuesta, pero comentando el estado del arte del HTML y las API web, que como de costumbre parece que algo extrajo a alguien detrás: toda la funcionalidad está técnicamente allí pero expuesta detrás de una matriz (sin juego de palabras) de rutas de código extrañas que se parecen nada del tipo de claridad que esperaría de una API bien diseñada. En términos simples: lo más probable es que sea trivial para un navegador permitir que Documenta se convierta en un ráster (por ejemplo, a Canvas), pero como nadie se molestó en estandarizarlo, tenemos que recurrir a la locura como se ilustra arriba (sin ofender al autor de esto código).
amn
1
Esta respuesta stackoverflow.com/questions/12637395/… parece indicar que puedes llegar bastante lejos. Mozilla y Chrome tienen una longitud de uri de datos ilimitada e incluso el IE actual permite 4 GB, que se reduce a aproximadamente 3 GB de imágenes (debido a base64). Pero esto sería algo bueno para probar.
Sjeiti
3
- algunas pruebas rápidas y sucias más tarde - jsfiddle.net/Sjeiti/pcwudrmc/75965 Chrome, Edge y Firefox alcanzan un ancho de al menos 10,000 píxeles que (en este caso) es un recuento de caracteres de aproximadamente 10,000,000 y un tamaño de archivo png de 8MB. No lo he probado rigurosamente, pero es suficiente para la mayoría de los casos de uso.
Sjeiti
13
Podrías usar PhantomJS , que es un webkit sin cabeza (el motor de renderizado en safari y (hasta hace poco) Chrome). Puedes aprender cómo hacer capturas de pantalla de páginas aquí . ¡Espero que ayude!
Esta técnica funciona bien. Sin embargo, han pasado 2 años desde su comentario. ¿Te has encontrado con algo que funcione más rápido que PhantomJS? La generación de imágenes generalmente toma 2-5 segundos en Phantom, en mi experiencia.
Brian Webster
Chrome sin cabeza ahora es posible. No sé si es más rápido, pero si quieres capturas de pantalla precisas, esta es una buena manera de hacerlo.
Josh Maag
11
Puede utilizar una herramienta HTML a PDF como wkhtmltopdf. Y luego puede usar una herramienta de PDF a imagen como imagemagick. Es cierto que esto es del lado del servidor y un proceso muy complicado ...
O simplemente puede ejecutar la imagen de wkhtmltopdf hermano, wkhtmltoimage.
Roman Starkov
1
Esta biblioteca es para Node.js. ¿Qué tal una interfaz simple?
Vlad
9
La única biblioteca que pude trabajar para Chrome, Firefox y MS Edge fue rasterizeHTML . Produce una mejor calidad que HTML2Canvas y todavía es compatible a diferencia de HTML2Canvas.
No espero que esta sea la mejor respuesta, pero me pareció lo suficientemente interesante como para publicar.
Escriba una aplicación que abra su navegador favorito al documento HTML deseado, ajuste el tamaño de la ventana correctamente y tome una captura de pantalla. Luego, elimine los bordes de la imagen.
¿Tienes una versión rápida de lo anterior? o si es posible, ¿puedes volver a escribirlo?
ssh
¿Te importaría compartir el código que usas para cargar el webView que estás renderizando? Esto parece un enfoque prometedor para mi renderizador de miniaturas. ¡Gracias!
Dave
1
Instalar phantomjs
$ npm install phantomjs
Cree un archivo github.js con el siguiente código
var page = require('webpage').create();//viewportSize being the actual size of the headless browser
page.viewportSize ={ width:1024, height:768};
page.open('http://github.com/',function(){
page.render('github.png');
phantom.exit();});
Respuestas:
Sé que esta es una pregunta bastante antigua que ya tiene muchas respuestas, pero aún así pasé horas tratando de hacer lo que quería:
Con Chrome sin cabeza (versión 74.0.3729.157 a partir de esta respuesta), en realidad es fácil:
Explicación del comando:
--headless
ejecuta Chrome sin abrirlo y sale después de completar el comando--screenshot
capturará una captura de pantalla (tenga en cuenta que genera un archivo llamadoscreenshot.png
en la carpeta donde se ejecuta el comando)--window-size
Permitir capturar solo una parte de la pantalla (el formato es--window-size=width,height
)--default-background-color=0
es el truco de magia que le dice a Chrome que use un fondo transparente , no el color blanco predeterminadofuente
--screenshot='absolute\path\of\screenshot.png'
funcionó para míSi. HTML2Canvas existe para renderizar HTML
<canvas>
(que luego puede usar como imagen).NOTA: Existe un problema conocido, que esto no funcionará con SVG
fuente
¿Puedo recomendar la biblioteca dom-to-image , que fue escrita únicamente para resolver este problema (soy el responsable)
Así es como lo usa (un poco más aquí ):
fuente
domtoimage.toSvg
), luego hazlo tú mismo en el lienzo e intenta jugar con la resolución de ese lienzo de alguna manera. Probablemente sea posible implementar una función como algún tipo de opción de representación en la propia biblioteca, por lo que puede pasar las dimensiones de la imagen en píxeles. Si lo necesita, le agradecería que creara un problema en github.Hay muchas opciones y todas tienen sus ventajas y desventajas.
Opción 1: use una de las muchas bibliotecas disponibles
Pros
Contras
Opción 2: usar PhantomJs y tal vez una biblioteca de contenedor
Pros
Contras
Opción 3: use Chrome Headless y tal vez una biblioteca de contenedor
Pros
Contras
Opción 4: usar una API
Pros
Contras
Divulgación: soy el fundador de ApiFlash. Hice todo lo posible para proporcionar una respuesta honesta y útil.
fuente
Todas las respuestas aquí usan bibliotecas de terceros, mientras que el procesamiento de HTML en una imagen puede ser relativamente simple en Javascript puro. No
sefue incluso un artículo al respecto en la sección de lienzo en el MDN.El truco es este:
drawImage
en el lienzoAlgunas cosas a tener en cuenta
fuente
Document
a se convierta en un ráster (por ejemplo, aCanvas
), pero como nadie se molestó en estandarizarlo, tenemos que recurrir a la locura como se ilustra arriba (sin ofender al autor de esto código).Podrías usar PhantomJS , que es un webkit sin cabeza (el motor de renderizado en safari y (hasta hace poco) Chrome). Puedes aprender cómo hacer capturas de pantalla de páginas aquí . ¡Espero que ayude!
fuente
Puede utilizar una herramienta HTML a PDF como wkhtmltopdf. Y luego puede usar una herramienta de PDF a imagen como imagemagick. Es cierto que esto es del lado del servidor y un proceso muy complicado ...
fuente
Node.js
. ¿Qué tal una interfaz simple?La única biblioteca que pude trabajar para Chrome, Firefox y MS Edge fue rasterizeHTML . Produce una mejor calidad que HTML2Canvas y todavía es compatible a diferencia de HTML2Canvas.
Obtener elemento y descargar como PNG
fuente
rasterizeHTML.drawHTML(node.innerHTML, canvas)
tenga en cuenta que estoy llamando a innerHTML en el nodoUse html2canvas solo incluya el complemento y el método de llamada para convertir HTML a Canvas y luego descargue como imagen PNG
Fuente : http://www.freakyjolly.com/convert-html-document-into-image-jpg-png-from-canvas/
fuente
No espero que esta sea la mejor respuesta, pero me pareció lo suficientemente interesante como para publicar.
Escriba una aplicación que abra su navegador favorito al documento HTML deseado, ajuste el tamaño de la ventana correctamente y tome una captura de pantalla. Luego, elimine los bordes de la imagen.
fuente
Use este código, seguramente funcionará:
Simplemente no olvide incluir el archivo Html2CanvasJS en su programa. https://html2canvas.hertzen.com/dist/html2canvas.js
fuente
No puede hacer esto 100% con precisión solo con JavaScript.
Hay una herramienta Qt Webkit por ahí, y una versión de Python . Si quieres hacerlo tú mismo, he tenido éxito con Cocoa:
¡Espero que esto ayude!
fuente
Instalar phantomjs
Cree un archivo github.js con el siguiente código
Pase el archivo como argumento a phantomjs
fuente
HtmlToImage.jar será la forma más sencilla de convertir un html en una imagen
Convertir HTML a imagen usando Java
fuente
Puede agregar HtmlRenderer de referencia a su proyecto y hacer lo siguiente,
fuente