Continuando nuestra serie sobre Img-Visor en esta ocasión discutiremos en detalle el componente que se encarga de realizar las capturas de pantalla.

Antecedentes

El proceso de captura de pantalla tiene algunos aspectos de consideración. El primero es que el programa que se encargue de esta tarea deberá poder ser ejecutado de forma frecuente, y deberá tener acceso a la pantalla de la sesión del usuario activo.

Imagemagick

La herramienta que mejor nos ha funcionado para realizar esta tarea es ImageMagick. un conjunto de herramientas de licencia abierta para la manipulación de imágenes en el computador que distribuye versiones tanto para Windows, Linux y MacOS.

Al ser un conjunto de utilidades de línea de comando permite cierto grado de automatización mediante scripts de linea de comandos como los famosos archivos por lote .bat.

Este archivo se encarga de:

  1. Definir el nombre del archivo de captura de pantalla basado en la fecha y hora
  2. Comparar la captura de pantalla con su inmediata anterior y descartar capturas nuevas muy similares
  3. Eliminar archivos de antigüedad mayor a 7 días.

Un inconveniente de los archivos .bat es que requieren de una terminal abierta. Para solventar ese problema utilizaremos un pequeño programa de VisualBasic Scripting (.vbs) que permite la ejecución de utilidades de comando sin desplegar una pantalla de terminal.

Finalmente, la ejecución del proceso de captura será registrada en una bitácora mediante un archivo .LOG

Todos nuestros archivos del sistema img-visor estan de momento instalados en una carpeta .imgvisor en el directorio raíz de nuestro disco duro.

  1. magick-capture.bat: Programa de terminal para la captura.
  2. magick-capture.vbs: Programa para activar el .bat de forma invisible.
  3. magick-capture.log: Bitácora de actividades del proceso de captura.
  4. magick-compare-results.txt: archivo temporal de comparación
  5. diff.jpg: Imagen diferencial de la comparación.

Archivo magick-capture.js

Una de las funciones primordiales del sistema es definir el nombre del archivo de cada captura basado en la fecha/hora en que se ejecuta. Los archivos .BAT son conocidos particularmente por la dificultad que presentan para manejar formatos de fecha que no dependan de la configuración regional del sistema operativo. Por esta razón creamos un archivo .JS que define un formato estandarizado para la fecha/hora y por ende para el nombre de cada archivo de captura. Una vez definido este nombre estándar, se pasa por parámetro al archivo de ejecución de la captura de pantalla (magick-capture-exec.bat)

HAZ CLIC ACÁ PARA VER EL ARCHIVO magick-capture.js
function Process() {
    const process = require('child_process');   
    const moment = require('moment');
	let momentString = moment().format("YYYYMMDDhhmmss");
	let fileName = "sc_"+momentString+".jpg";
	
	console.log("FILENAME: ",fileName);
	
	var ls = process.spawn('cmd.exe', ['/c','magick-capture-exec.bat',fileName]);
	 
	
    ls.stdout.on('data', function (data) {
      console.log("STDOUT: ",data);
    });
    ls.stderr.on('data', function (data) {
      console.log("STDERR: ",data);
    });
	
    ls.on('close', function (code) {
       if (code == 0)
            console.log('Stop');
       else
            console.log('Start');
    });
};

Process();

El archivo magick-capture.bat

Este archivo simplemente hace una llamada al programa Node (NODEJS) para ejecutar el script magick-capture.js

node e:\.imgvisor\magick-capture.js >>magick-capture.js.log

El archivo magick-capture-exec.bat

El archivo .bat es el que se encarga, entre otras cosas, de llamar a las utilidades de imagemagick. En este archivo se han programado las siguientes funciones:

  1. Nombre de Captura: Recibe por parámetro el nombre que se le dará al archivo de captura.
  2. Captura Anterior: Obtener el archivo de captura más reciente para compararlo con la nueva captura. (líneas 16-22)
  3. Captura Actual: Tomar la captura de pantalla y almacenarla en el disco duro (líneas 25-27)
  4. Comparación: Comparar la captura nueva con la inmediatamente anterior (ver paso 2) para determinar si son demasiado parecidas. (líneas 30-34)
  5. Decisión: Si son demasiado parecidas, la nueva captura se desecha; en caso contrario se preserva la nueva captura. (líneas 40-55)
  6. Mantenimiento: Se eliminan los archivos viejos (mayores a 7 días de antigüedad) (líneas 58-59)
  7. Bitácora: Se captura cada paso ejecutado en un archivo de bitácora (.log)
Haz clic para ver el archivo magick-capture-exec.bat
@echo off

set log_file="E:\.imgvisor\magick-capture.log"
set images_path=E:\.imgvisor\images\

echo VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV >>%log_file%
echo ------------------------------------------------------------------------- >>%log_file%
@echo MAGICK CAPTURE BAT: %1 >>E:\.imgvisor\test.log
echo ------------------------------------------------------------------------- >>%log_file%
echo ------------------------------------------------------------------------- >>%log_file%
set file_name=%~1
set target_file=%images_path%%file_name%
echo TARGET FILE >>%log_file%
 
echo ------------------------------------------------------------------------- >>%log_file%
echo STEP 1: IDENTIFYING PREVIOUS FILE >>%log_file%

pushd e:\.imgvisor\images
for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a
popd

echo IDENTIFIED: "%newest%" >>%log_file%

echo ------------------------------------------------------------------------- >>%log_file%
echo STEP 2: TAKING SCREENSHOT AS %target_file% >>%log_file% 

"C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe" convert "screenshot:[0]" -quality 40%% "%target_file%" >>%log_file%

echo ------------------------------------------------------------------------- >>%log_file%
echo STEP 3: COMPARING PREVIOUS FILE >>%log_file%

echo NEWEST: %newest%
echo CURRENT: %target_file%
magick compare -metric RMSE "E:\.imgvisor\images\%newest%" "%target_file%" diff.jpg 2>E:\.imgvisor\magick-compare-result.txt

echo ------------------------------------------------------------------------- >>%log_file%
echo STEP 4: DIFF DECISION >>%log_file%


FOR /F %%i in (E:\.imgvisor\magick-compare-result.txt) do set difference=%%i

set /a difference+=1

set criteria=1550

ECHO STEP 5: DIFFERENCE: %difference% vs %criteria% >>%log_file%

IF %difference% LSS %criteria% (
   ECHO STEP 5: DELETING TOO SIMILAR SCREENSHOT "%target_file%" >>%log_file%
   del "%target_file%"
)

IF %difference% GEQ %criteria% (
	ECHO STEP 5: FILE IS DIFFERENT ENOUGH TO KEEP >>%log_file%
)

echo ------------------------------------------------------------------------- >>%log_file%
ECHO STEP 5: DELETING OLDER FILES AT COMPUTER SIDE... >>%log_file%
forfiles -p "e:\.imgvisor\images" -s -m *.* -d -7 -c "cmd /c del @path" >>%log_file%

ECHO COMPLETE! >>%log_file%
echo ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>%log_file%

Al hacer doble-clic en este archivo.bat se realiza la captura de pantalla, pero en el proceso se abre una terminal de línea de comandos.

El archivo .VBS (magick-capture.vbs)

Tal y como mencionamos anteriormente la ejecución automatizada de un archivo magick-capture.BAT tiene el inconveniente de que abre una pantalla de terminal. Para evitar esto usaremos una técnica basada en VisualBasic Scripting.

Haz clic para ver el archivo .VBS
Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "E:\.imgvisor\magick-capture.bat" & Chr(34), 0
Set WshShell = Nothing

Al hacer doble-clic en este archivo .vbs se realiza la captura de pantalla sin abrir una terminal.

Otros archivos

A partir de la línea 3 del archivo magick-capture.bat vemos que se registran eventos en el archivo magic-capture.log

Las capturas de pantalla se almacenan en la carpeta images.

En la línea 34 vemos como se genera un resultado al comparar la foto más reciente con la foto recien tomada. El resultado se almacena en un archivo magick-compare-result.txt el cual posteriormente es leido en la lína 40 para poder comparar el resultado numérico de la comparación con un valor estático de 1550 (líneas 48 y 53).

Finalmente es importante aclarar que todas las rutas a los archivos de salida, o de entrada deberán usar rutas absolutas completamente calificadas (fully-qualified paths), dado que las rutas relativas varían dependiendo del contexto de la llamada.

Hasta acá el artículo de hoy. Pronto estaremos publicando nuevo material sobre la sincronización de archivos hacia un servidor Web usando el protocolo FTP.

 683 total views,  13 views today

0Shares
Última modificación: marzo 13, 2020

Autor

Comentarios

Comenta o responde a los comentarios

Tu dirección de correo no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.