JavaScript - Capturar zona de pantalla y enviar al clipboard

 
Vista:
sin imagen de perfil

Capturar zona de pantalla y enviar al clipboard

Publicado por Manu (6 intervenciones) el 21/06/2022 12:29:00
En https://www.marzenit.net he desarrollado una web para diseñar acordes para guitarra. Tengo un botón para capturar el DIV con la imagen del acorde. Ya funciona teóricamente todo. No hay errores. Pero una vez en el clipboard, si voy a un documento WORD por ejemplo para pegar la imagen y hago Ctrl-V para pegarla, lo que paga es un "churro" de este tipo: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAACNCAYAAAA3k22VAAAEb0lEQVR4Xu2dMVLbQBSG1zMJzIQUlDkCLT4FfZKCisJcghm7ghvQuqHBBUnPAajhEhShcxEyA8kMYQ2yZVuW3660P5b53MGs9e9++vX26e1aajn39OT4JCfQ8qAfHv8lF3rPApsbHxygBQ4oBP3n/rdAer0lPm19nhrgQtDb29vrTSLh6IbDoQN0QsDZoQEtgOwlAN0E0K3Wc3Ly+jk+PnbdblfU7ebJRDvaQ......

No pega la imagen real real como cuando hacemos una captura de pantalla con la tecla "Impr Pant"

¿Alguien puede ayudarme?

Para pegar la imagen al clipboard utilizo las utilidades dom-to-image y básicamente este es el código Javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function fotografiarAcorde() {
   var node = document.getElementById('nodoAcorde');
   domtoimage.toPng(node).then(function(resultado) {
      this.imagenAClipboard2(resultado);
   })
    .catch(function(error) {
        console.error('Error:', error);
   });
}
 
function imagenAClipboard2(imagen) {
    navigator.clipboard.writeText(imagen).then(function() {
      console.log('Imagen copiada correctamente!');
    }, function(err) {
      console.error('Error:', err);
    });
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Ivan

Capturar zona de pantalla y enviar al clipboard

Publicado por Ivan (118 intervenciones) el 21/06/2022 22:08:36
Hola,

esto que preguntas es realmenbte complicado y no lo he hecho nunca, así que buscando por la red he encontrado la librería:

https://html2canvas.hertzen.com/

mediante la cual puedes capturar un elemento HTML y pasarlo a canvas. Lo cual tiene bastante sentido, dado que canvas es una forma de crear gráficos en HTML. Posteriormente puedes manipular la imagen y descargarla con la instrucción de canvas toDataUrl()

https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toDataURL

Espero que te sirva,

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Capturar zona de pantalla y enviar al clipboard

Publicado por MANUEL (1 intervención) el 21/06/2022 22:43:05
Gracias por tu interés.

Pero enviar una zona capturada de mi web a un fichero .PNG o a una URL o a otro DIV de la propia página lo consigo sin problemas.
Incluso lo logro, pero el producto obtenido es una imagen codificada en base64 que en el CLIPBOARD es un churro impresentable!

El problema es lograr "pegar" esa captura como una imagen real en el CLIPBOARD, para luego con Control-V pegarla directamente donde interese.

Es todo un reto, pero la verdad es que es muy interesante y sería potente porque nos permitiría con un sólo click, capturar determinadas ZONAS de nuestras aplicaciones y automáticamente con otro click pegarlas en nuestros documento de interés, para formación, para documentación, etc....

Y se puede hacer porque aquí tienes programas onLine que lo consiguen
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ivan

Capturar zona de pantalla y enviar al clipboard

Publicado por Ivan (118 intervenciones) el 22/06/2022 14:07:45
Hola,

pues sí es interesante y todo un reto como dices ;)
En cuanto tenga una tarde libre me pongo a investigar y probar, pondré el resultado por aquí.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Capturar zona de pantalla y enviar al clipboard

Publicado por Manuel (6 intervenciones) el 22/06/2022 17:47:10
Pues sincéramente creo que si lo logras darás con una solución que ni se ha planteado en ningún foto (llevo más de 4 días buscando dedicando 4-5 horas diarias), ni hay respuestas que hablen de ese problema.
Y como te indiqué, creo que es una utilidad muy práctica.
Gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ivan

Capturar zona de pantalla y enviar al clipboard

Publicado por Ivan (118 intervenciones) el 22/06/2022 22:07:27
Hola de nuevo,

pues lo he conseguido con la API navigator.clipboard pero sólo funciona en Chrome.
No se porqué, se supone que la API clipboard está soportada en otros navegadores según la documentación oficial...
Además, sólo funciona en un entorno de servidor, es decir, si lo pruebas en local no funciona.

El problema está en que si añades imágenes, al copiar esas imágenes interpreta que se accede a los archivos del disco local y está prohibido. Así que debes probarlo con XAMP, WAMP u otros y entonces sí funciona, igual que en un entorno web real.

El funcionamiento es el siguiente:

- Añadir un evento onclick al elemento HTML que queremos copiar y llamaremos a nuestra función myCopy(this).

- En esta función utilizamos la librería html2canvas que automáticamente nos hace una "captura" del elementos HTML que le hemos pasado y lo transforma en una imagen canvas

- Tranformamos el canvas en un formato blob con el que se pueden trabajar diferentes tipos de datos

- Ahora escribimos/copiamos en el clipboard el elemento blob y ...

- Funciona !!

Ya podemos copiar directamente la imagen en word, paint, etc.

Pongo el código con dos funciones para hacerlo:

- Una resumida en una linea que ya funciona tal como he dicho.

- Otra con la posibilidad de seguir trabajando el blob, por si alguien quiere seguir investigando y mejorar

Pego todo el código:

- Acordarse de añadir la librería html2canvas y vuestras imágenes ;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <title>HTML TO IMG CLIPBOARD</title>
  <script src="html2canvas.min.js"></script>
  <style>
    div {
      padding: 1em;
      border: 4px solid black;
    }
    div:hover {
      border: 4px solid red;
    }
  </style>
  <script>
    function myCopy(element) {
      html2canvas(element).then(canvas => {
        // Añade una copia en imagen al final de la página
        document.body.appendChild(canvas);
 
        // Con esta forma podemos trabajar el blob
        //canvas.toBlob(function(blob) {
          //console.log('Este es el blob: ', blob);
          //navigator.clipboard.write([new ClipboardItem({'image/png': blob})])
        //});
 
        // Forma resumida en una linea
        canvas.toBlob(blob => navigator.clipboard.write([new ClipboardItem({'image/png': blob})]));
      });
    };
  </script>
</head>
 
<body>
  <div style="width: 50%; background:#f5da55" onclick="myCopy(this)">
    <h1>HTML TO IMG CLIPBOARD</h1>
    <p>Ejemplo de cómo copiar elementos HTML y pasarlos a una imagen para copiar en el portapapeles</p>
  </div>
  <div style="background: #55c2f5" onclick="myCopy(this)">
    <h2>Otro DIV</h2>
    <p>Con un poco<br>de texto</p>
    <img src="imagen.jpg"/>
    <p>y una imagen por en medio ...</p>
  </div>
</body>
</html>

Un saludo y si os sirve a mi me sirve un like ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Capturar zona de pantalla y enviar al clipboard

Publicado por Manuel (6 intervenciones) el 23/06/2022 15:19:01
Hola Iván.
Antes de nada, muchísimas gracias por tu investigación.
Yo también lo logré ayer, a última hora. Lo único que yo, en lugar de utilizar html2canvas.min.js utilizo el paquete dom-to-image.min.js porque en los primeros foros que consulté, pareceía que era más actual y evolucionado que canvas ¿¿¿???
Además logré tanto enviar la imagen al clipboard, como descargar la imagen como un fichero.png (optativo según demanda), recurriendo al paquete filesaver.min.js).

Pero como siempre hay problemillas: ahora me enfrento a un "desajuste" por un desplazamiento extraño que hace en la zona capturada, captura 5px más a izquierda y 26px más del top. Y captura más width y más height del correspondiente.... tengo que investigar el motivo....

Pero (siempre hay más peros :) el problema es que esta mañana se me ha estropeado el cargador de mi portátil y no puedo seguir trabajando hasta que no me llegue a lo largo del día un pedido urgente que han realizado desde mi empresa.
Estoy contestando desde la tablet.
Cuando lo tenga en marcha, te paso mi código. Y probaré también el tuyo.
Lo de protocolo https ya lo sabía. Es imprescindible por una cuestión de seguridad e infraestructura.
Por cierto.... efectivamente, a mí me funcionaba tanto en Chrome como en Edge y no en Firefox. Pero esto tiene una solución accediendo dentro de Firefox a about:config y poniendo a TRUE dos parámetros relacionados con el clipboard, que ahora no recuerdo el nombre, porque lo tengo anotado en mi portátil. Cuando lo pueda volver a arrancar te informo de todo ello.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Capturar zona de pantalla y enviar al clipboard

Publicado por Manuel (6 intervenciones) el 25/06/2022 11:42:31
Buenos días.
Copiar contenido binario al clipboard No es compatible con Firefox. Pero es por cómo viene configurado Firefox por defecto.
Estos son los dos parámetros internos, alcanzables desde about:config en Firefox que activan esta posibilidad.
Ponerlos a TRUE
dom.events.asyncClipboard.clipboardItem
dom.events.asyncClipboard.read

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Capturar zona de pantalla y enviar al clipboard

Publicado por Manu (6 intervenciones) el 25/06/2022 15:39:31
Iván. Cuando pruebes lo que sugiero (lee mi última respuesta a mi problema), avísame y desconecto el test de CANVAS de mi página.
Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Capturar zona de pantalla y enviar al clipboard

Publicado por Manu (6 intervenciones) el 25/06/2022 15:36:31
Buenos días.

Me respondo a mí mismo aportando la solución.

En el PDF explico cómo resolver este interesante asunto y pongo un ejemplo a vuestra disposición.
Lo soluciono recurriendo a DOM-TO-IMAGE que es un paquete más moderno que CANVAS.
También expongo pruebas realizadas con CANVAS que no funcionan.

Saludos,
Manu Marzenit
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Ivan

Capturar zona de pantalla y enviar al clipboard

Publicado por Ivan (118 intervenciones) el 26/06/2022 12:52:10
Hola,

he probado tu código y me funciona correctamente, igual que el mío.

El error que tenías simplemente era porque tu botón llamaba al div mediante el ID y la función html2canvas espera un "elemento" HTML. Si haces clic directamente en el div se copia sin problemas.

Son dos formas de hacerlo, la solución que encontré fué más rápida y sencilla y la que presentas ahora es más elaborada y con más posibilidades. Me gusta la forma en que se puede utilizar la librería dom-to-image para manipular los DIV y permitir su descarga directa, copiar, etc. La idea de habilitar un botón para descargar el div me parece muy interesante e intuitivo para los usuarios.

El desplazamiento que comentas a mi nunca me ha pasado, misterior informáticos ...

Para no haber nada sobre este tema hace una semana, de repente han aparecido dos soluciones distintas ;)

Buen trabajo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar