Twitter Flickr Pinterest LinkedIn YouTube Google Maps E-mail RSS
formats

Autómata para la conversión y transformación de imágenes según patrones de Microsoft Excel #EAI

Comenzamos este último mes del año con las pilas cargadas. En esta entrada os dejo una utilidad también bastante peculiar (vamos a lo que os intento tener acostumbrados) que permite realizar las siguientes tareas:

El programa funciona a modo de autómata y consiste en seleccionar un directorio origen donde se encuentran imágenes de cualquier tamaño y formato, para una vez procesadas, dejarlas en un directorio destino con un nombre que corresponde con las reglas de un fichero en formato Excel.

Admite el proceso por lotes, es personalizable en cuanto a las imágenes y marcas de agua (watermark)  que deseemos disponer. Una vez seleccionado el programa irá recorriendo cada fila (en función de unos parámetros previamente establecidos) y asociando nombres en función de los datos de la hoja de cálculo.

En la salida de las imágenes, éstas, son tratadas aplicando una marca de agua (si deseamos) y generando 2 imágenes, una de ellas en miniatura y la otra con el nombre destino seleccionado en la hoja de cálculo.

etapa-1

El esencia este proyecto muestra como conectarse usando 2 APIs.

La primera de ellas permite comunicarse con cualquier versión de Excel. La segunda permite trabajar con imágenes usando la librería freeimage360.dll y es de uso público. Está constituida por un conjunto de funciones de manipulación de formatos gráficos. La DLL o biblioteca de enlace dinámico no requiere registro.

Para usar el programa es necesario especificar un directorio origen (donde se encuentran las imágenes fuente) y un directorio destino (donde queremos dejarlas). En este directorio destino se crearan las imágenes reducidas y otras con marca de agua si así se establece.

El fichero Excel permite establecer una correlación entre el nombre de la imagen origen y el nombre de la imagen destino. Las coordenadas que pueden ser alteradas muestran la posición donde se empieza a cotejar los datos, es decir, donde se encuentra el primer nombre de la imagen y como deseamos llamarla en el proceso de renombrado. También dispone de un sistema de estadísticas, mostrando que imágenes a podido procesar y cuales no. Genera un fichero de texto para poder almacenar los errores o no asociaciones. Por otro lado, genera un aviso sonoro una vez terminado el proceso.

FASES

Primero seleccionamos con los iconos fuente y destino las carpetas.

etapa-2

Las opciones fila y columna las dejamos por defecto, puesto que encajan con el fichero Excel de ejemplo incorporado.

mi_imagen_origen

La imagen superior muestra la imagen inicial a tratar.

marca-de-agua-palentino

Mediante la marca de agua o watermark podemos personalizar la imagen salida. Como se muestra en la ilustración superior.

La imagen inferior muestra la estructura del fichero en formato excel. Podríamos tener mas filas, sólo os dejo 2 a modo de ejemplo, una funciona, la otra genera un error para que veáis como funciona:

Mi_imagen_origen corresponde con el nombre real de la imagen que se encuentra en la carpeta origen, la coordenada A6 contiene el nombre por el que será renombrado después del tratamiento 1 (la extensión depende de nuestra configuración). Se ha personalizado un salto de filas para procesar la siguiente y así sucesivamente.

excel-ejemplo

El proceso de salida muestra las estadísticas cuando el programa concluye.

resumen-operaciones

Fichero de texto generado.

log-de-errores

La imagen inferior muestra la conclusión del proceso.

etapa-3

La imagen superior también muestra el tiempo que ha transcurrido en el procesamiento, y el progreso. Podremos ver las imágenes generadas directamente pulsando el la carpeta ver.

Puede llegar a procesar unas 1000 imágenes (dependerá del tamaño del fichero origen) en 10 minutos aproximadamente. Consejo, deja al ordenador respirar mientras trabaja :-), todavía no he optimizado el tema de los threads o hilos.

En fin, no se si os será de mucha utilidad, pero ahí os lo dejo. Necesito mejorar algunas cosas que todavía están pendientes (cuando disponga de más tiempo).

Para descargar el programa pulsar sobre la imagen de descarga. He probado el programa en sistemas operativo Windows como XP, 7, 8 y 10.

En principio, Libre de virus, analizado con AVG, Avast, Malwarebytes.
Algunas soluciones antivirus pueden dar falsas alarmas.

Por otro lado, no me hago responsable del uso del software y de sus consecuencias derivadas.

Estas condiciones se aceptan cuando descargo el programa.

Otras observaciones

eai-winrar

El programa no requiere instalación. Es un fichero en formato comprimido Winrar, donde se encuentra un ejecutable EXCEL-A-IMAGEN.exe , carpetas de ejemplo origen y destino. Es decir, donde tenemos las imágenes (incluyo una de ejemplo) y donde queremos que las deje. La carpeta números contiene imágenes, PSDs y JPG personalizables por nosotros. Incluye la librería FreeImage.dll y el PDF para mostrarnos todas las funciones que dispone para trabajar con ella a modo didáctico.

Requiere que el fichero Excel, se encuentra en formato xls.

Descarga

 

 

Adjuntos –

Ejemplo código botón procesar:

'El botón procesar es el mas complejo, muestro parte del código.

Dim nodo As Node

Ajustecmd.Visible = False

Unload frmOptions

frmOptions.Hide
Set nodo = frmOptions.miarbol.Nodes.Add()
nodo.Text = "-> Imagenes asociadas"
Set nodo = frmOptions.miarbol.Nodes.Add()
nodo.Text = "-> No asociadas"

'Empecemos con el procedimiento de renombrado
On Error Resume Next
  Dim imagen_origen, imagen_destino, bOK As Long

procesar.Visible = True
procesar.Caption = "Procesando ..."
visor.Visible = True

Dim vfuente, vdestino, varchivo, Vco, Vcd As String
Dim vfo, vfd, vdesplazamiento As Integer

Vco = CStr(CO.Text)
Vcd = CStr(CD.Text)
vfo = CInt(FO.Text)
vfd = CInt(FD.Text)
vdesplazamiento = CInt(desplazamiento.Text)

vfuente = CStr(fuente.Caption)
vagua = CStr(lagua.Caption)
vagua2 = CStr(lagua.Caption)

 Set fso = New Scripting.FileSystemObject
   bytescarpeta = fso.GetFolder(vfuente).Size
 Set fso = Nothing

If bytescarpeta <= 50 Then
   
    MsgBox "No existen archivos en la carpeta fuente especificada, incluya los JPGs", vbCritical
    
 End If
 
 
vdestino = CStr(destino.Caption)
varchivo = CStr(Ficheroexcel.Caption)
If vfuente = "ruta de imágenes fuente" Or vdestino = "ruta de imágenes fuente destino" Or varchivo = "Archivo de excel no seleccionado" Or Vco = "" Or Vcd = "" Then
    MsgBox "Es necesario especificar la fuente, el destino y el archivo XLS", vbCritical, "Error de archivos"
    procesar.Visible = False
    
Else
'On Error GoTo errores
' En caso de estar todo correcto
' Empezamos con la creación del objeto excel
Dim appExcel As Excel.Application
Dim Salida As String
Dim nodosecundario As Variant




Set appExcel = CreateObject("Excel.Application.9")
appExcel.Quit


Salida = "NO"
'varchivo = Replace(varchivo, "\", "\\")

appExcel.Workbooks.Open varchivo
i = 0
numerodeimagenesaprocesar = 0

Set fs = CreateObject("Scripting.filesystemobject")
Set a = fs.CreateTextFile("errores.txt", True)
Slider1.Visible = False
pmarcaagua.Checked = False

Do

rango_origen = Vco & CStr((CInt(vfo) + i))
rango_destino = Vcd & CStr((CInt(vfd) + i))
i = i + vdesplazamiento
numerodeimagenesaprocesar = numerodeimagenesaprocesar + 1

Loop While CStr(appExcel.Range(rango_origen).Value) <> "" And CStr(appExcel.Range(rango_origen).Value) <> ""

 

numerodeimagenes = 1
i = 0
visor.Visible = True
 contadortabla = 0
 Noprocesadas = 0
 
procesocancelado = "NO"
dospuntos.Visible = True
segundos.Visible = True
minutos.Visible = True
segundos.Caption = "0"
minutos.Caption = "0"

' Empecemos con el buque
Do
Form1.Command1.Visible = False
cancelar.Visible = True

ProgressBar1.Min = 1
ProgressBar1.Max = (CInt(ProgressBar1.Width) * numerodeimagenes) / numerodeimagenesaprocesar
ProgressBar1.Value = 1

DoEvents
    If CInt(ProgressBar1.Value) < 11055 Or numerodeimagenes > 1 Then
    ProgressBar1.Value = (CInt(ProgressBar1.Max) * numerodeimagenes) / numerodeimagenesaprocesar
    numerodeimagenes = numerodeimagenes + 1
   End If
   
   DoEvents
   
    
   contadortabla = contadortabla + 1
    'appExcel.Range(Vco + vfo).Select
    rango_origen = Vco & CStr((CInt(vfo) + i))
    rango_destino = Vcd & CStr((CInt(vfd) + i))
    If CStr(appExcel.Range(rango_origen).Value) <> "" Or CStr(appExcel.Range(rango_destino).Value) <> "" Then
   
    
    contenido_origen = "\" & CStr(appExcel.Range(rango_origen).Value & Extension)
    contenido_destino = "\" & CStr(appExcel.Range(rango_destino).Value & ".jpg")
    marcaagua = \\agua.jpg
 

    
    contenido_completo_origen = vfuente & contenido_origen
    contenido_completo_destino = vdestino & contenido_destino
    contenido_completo_origen = Replace(contenido_completo_origen, "\", "\\")
    contenido_completo_destino = Replace(contenido_completo_destino, "\", "\\")
    
    diragua = Replace(vagua, "\", "\\")
    diragua2 = Replace(vagua, "\", "\\") & "\\marca.png"
    marcaaguac = Replace(vagua, "\", "\\") & marcaagua
    
    'Preparamos las estadisticas
    Set nodo = frmOptions.miarbol.Nodes.Add(1, tvwChild)
    If CStr(appExcel.Range(rango_origen).Value) <> "" Then
         'Comprobamos si existe el chino
         
          If Dir(contenido_completo_origen) = "" Then
             
             Set nodo = frmOptions.miarbol.Nodes.Add(2, tvwChild)
                 nodo.ForeColor = 255
                    nodo.Tag = "No procesado"
                        Noprocesadas = Noprocesadas + 1
     nodo.Text = CStr(contadortabla) & " - C.O: " & rango_origen & " valor: " & CStr(appExcel.Range(rango_origen).Value & Extension) & " || C.D.: " & rango_destino & " : " & " valor: " & CStr(appExcel.Range(rango_destino).Value & ".jpg")
    nodo.Key = CInt(contadortabla) & " ID"
             a.WriteLine nodo.Text
             
             
             End If
             
          Set fso = Nothing
 
    nodo.ForeColor = 0
    nodo.Tag = "procesado"
    nodo.Text = CStr(contadortabla) & " - C.O: " & rango_origen & " valor: " & CStr(appExcel.Range(rango_origen).Value & Extension) & " || C.D.: " & rango_destino & " : " & " valor: " & CStr(appExcel.Range(rango_destino).Value & ".jpg")
    nodo.Key = CInt(contadortabla) & " ID"
    nodosecundario = nodo.Index
    
    
    Else
 

    Set nodo = frmOptions.miarbol.Nodes.Add(2, tvwChild)
    nodo.ForeColor = 255
    nodo.Tag = "No procesado"
    Noprocesadas = Noprocesadas + 1
    nodo.Text = CStr(contadortabla) & " - C.O: " & rango_origen & " valor: " & CStr(appExcel.Range(rango_origen).Value & Extension) & " || C.D.: " & rango_destino & " : " & " valor: " & CStr(appExcel.Range(rango_destino).Value & ".jpg")
    nodo.Key = CInt(contadortabla) & " ID"
        a.WriteLine nodo.Text
    End If
    

    'Proceso de copia de la imagen fuente al destino con formato, compresión y resolución determinados.
        
    'Cargamos la imagen origen
  
     If Extension = ".JPG" Then
     imagen_origen = FreeImage_Load(FIF_JPEG, contenido_completo_origen, 0)
     formatito = FIF_JPEG
     Else
     imagen_origen = FreeImage_Load(FIF_TIFF, contenido_completo_origen, 0)
     formatito = FIF_TIFF
     End If
     
     'MsgBox contenido_completo_origen
     
     If (FreeImage_Load(formatito, contenido_completo_origen, 0)) Then
      visor.Caption = "Leyendo imagen: " & contenido_origen
           
                DoEvents
           
 
           'imagen_destino = FreeImage_Save(FIF_JPEG, imagen_origen, contenido_completo_destino, 0)
                
         If CStr(appExcel.Range(rango_origen).Value) <> "" And CStr(appExcel.Range(rango_destino).Value) <> "" Then
          
                    cestadisticas.Visible = True
                    
       
 
    ' Nos encargamos de dar calidad a la imagen
                If Calidadmedia.Checked = True Then
                    calidadimagen = JPEG_QUALITYNORMAL
                End If
                If calidadAlta.Checked = True Then
                    calidadimagen = JPEG_QUALITYSUPERB
                End If
                If CalidadBaja.Checked = True Then
                    calidadimagen = JPEG_QUALITYAVERAGE
                End If
                 If Calidadmuybaja.Checked = True Then
                    calidadimagen = JPEG_QUALITYBAD
                End If
                
            'Nos encargamos de miniaturizar
            
            'x = FreeImage_GetDotsPerMeterX(imagen_origen)
             X = FreeImage_GetWidth(imagen_origen)
             Y = FreeImage_GetHeight(imagen_origen)
             
             If (csne2.Checked) Then
               
               DimensionX = dimensiongrande
               dimensionXpeque = dimensionpequena
               DimensionY = Y * dimensiongrande / X
               dimensionYpeque = Y * dimensionpequena / X
               
               
             
             End If
             If (csne1.Checked) Then
                'dimensionX
                'dimensionY
             End If

'Fin del ejemplo

 

Deja un comentario

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

Home Sin categoría Autómata para la conversión y transformación de imágenes según patrones de Microsoft Excel #EAI
© www.palentino.es, desde el 2012 - Un Blog para compartir conocimientos ...

Uso de cookies en mi sitio palentino.es

Este sitio web utiliza cookies para que tengamos la mejor experiencia de usuario. Si continúas navegando estás dando tu consentimiento para la aceptación de las mencionadas cookies y la aceptación de la política de cookies

ACEPTAR
Aviso de cookies