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.
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.
Las opciones fila y columna las dejamos por defecto, puesto que encajan con el fichero Excel de ejemplo incorporado.
La imagen superior muestra la imagen inicial a tratar.
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.
El proceso de salida muestra las estadísticas cuando el programa concluye.
Fichero de texto generado.
La imagen inferior muestra la conclusión del proceso.
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
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.
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