Manejo de Imágenes [Visual Basic 6.0 y ImageMagick]

Yo a mi rollo…

Me paso horas desarrollando paranoias en Visual Basic 6.0 (si… ya se, es muy viejo, en fin, me gustaría cambiar pero…).
Todas ellas con dispar éxito pero siempre intentando sorprender a todo aquel a acerca “sus hocicos” a alguna de mis aplicaciones.

Hoy quiero explicar… ¿Como podemos manejar de forma cómoda imágenes cuando programas en Visual Basic 6.0?
Lo voy a explicar como lo utilizo yo, de forma rápida, contando lo mínimo para que se puedan ver resultados rápidamente.

La solución todo esto la tengo con ImageMagick®, hasta hora lo mejor que he encontrado en “librerías” para la manipulación de imágenes.

Como dice en su página Web (http://www.imagemagick.org/script/index.php):

“ImageMagick® es una suite de software para crear, editar y componer imágenes de mapa de bits. Puede leer, convertir y escribir imágenes en una variedad de formatos (más de 100) incluyendo DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG y TIFF. Usar ImageMagick para traducir, flip, espejo, rotar, escalar, inclinar y transformar imágenes, ajustar los colores de la imagen, aplicar diversos efectos especiales, o dibujar texto, líneas, polígonos, elipses y curvas de Bézier.”

Concretamente en Visual Basic lo que utilizaremos será el objeto COM+ para Windows correspondiente (ImageMagickObject COM+ Object).

Primero las “Referencias” de nuestro proyecto VB.
Debemos añadir la referencia “ImageMagickObject 1.0 Type Library”

A continuación solo nos queda ponernos manos a la obra y programas nuestros deseos.
Como es muy sencillo y rápido programar con ImageMagick, apenas unas pocas líneas. Aquí os muestro a modo de ejemplo una de mis funciones, en concreto esta es para rotar ficheros de imágenes:

Public Sub Rotar_Imagen_01(ByVal sP_Fichero_Origen_01 As String, _
                           Optional ByVal sFichero_Destino_01 As String, _
                           Optional ByVal fP_Angulo_01 As Double = 90)
    '
    '-------------------------------------------------§§§----'
    ' PROCEDIMIENTO PARA ROTAR UNA IMAGEN
    '
    ' POR DEFECTO LA IMAGEN ES ROTADA 90, SEGUN LAS AGUJAS DEL RELOJ
    '-------------------------------------------------§§§----'
    '
    Dim objImageMagik_01 As Object ' DEFINIMOS UN OBJECTO
    '
    ' CHEQUEO Y MAS CHEQUEOS… INTENTADO HACER LAS COSAS A PRUEBA DE BOMBAS….
    If (Dir(sP_Fichero_Origen_01) <> "") Then
        If Not (sFichero_Destino_01 <> "") Then
            sFichero_Destino_01 = sP_Fichero_Origen_01
        End If
        '
        Set objImageMagik_01 = CreateObject("ImageMagickObject.MagickImage.1") ' CREAMOS UN OBJECTO, SERA NUESTRO OBJETO IMAGEMAGICK
        '
        objImageMagik_01.Convert "-rotate", CStr (fP_Angulo_01), sP_Fichero_Origen_01, sFichero_Destino_01 ' LLAMAMOS A .CONVERT
                                                                                                           ' VEIS QUE SENCILLO ES ROTAR UN FICHERO
        '
        Set objImageMagik_01 = Nothing ' ELIMINAMOS O VACIAMOS EL OBJETO IMAGEMAGICK
        '
    Else
        MsgBox "ERROR_Rotar_Imagen_01_01" & vbCrLf & _
               vbCrLf & _
               "ERROR AL EJECUTAR COMANDO DE ROTACION DE IMAGEN" & vbCrLf & _
               vbCrLf & _
               "NO SE HA ENCONTRADO EL FICHERO DE DESTINO [" & sP_Fichero_Origen_01 & "]", vbCritical
        '
    End If
    '
End Sub

Sencillo… ¿Verdad?

“no pienses en que lo has programado,
solo piensa si lo has programado y como,
los demás solo verán el resultado.”

Anuncios

Acerca de Robert Ale
Soy yo un simple tipo que quiere estar en la red... aunque no se si lo conseguiré algún día...

56 Responses to Manejo de Imágenes [Visual Basic 6.0 y ImageMagick]

  1. miluska says:

    Hola!… gracias por el post. Me podrias mandar un ejemplo de como redimensionar una imagen por favor… solo necesito algo como esto:

    objImageMagik_01.Convert “-rotate”, CStr (fP_Angulo_01), sP_Fichero_Origen_01, sFich

    Gracias nuevamente!

  2. robertale says:

    Gracias a ti por leer este blog, espero que te sea de utilidad:

    Al tema! Redimensionar es muy sencillo, aqui te envio un ejemplo con las distintas formas que puede ejecutar:

    Private Sub Command1_Click()

    Dim sP_Fichero_Origen_01 As String
    Dim sFichero_Destino_01 As String

    Dim objImageMagick_01 As Object

    sP_Fichero_Origen_01 = “D:\VisualBasic\Imagen_Origen.bmp”
    sFichero_Destino_01 = “D:\VisualBasic\Imagen_Destino.bmp”

    If (Dir(sP_Fichero_Origen_01) “”) Then
    Set objImageMagick_01 = CreateObject(“ImageMagickObject.MagickImage.1”)

    ‘ VER LA WEB: http://www.imagemagick.org/script/command-line-processing.php#geometry

    objImageMagick_01.Convert “-resize”, “200%”, sP_Fichero_Origen_01, sFichero_Destino_01 ‘ PARA HACER LA IMAGEN EL DOBLE DE GRANDE
    ‘ Y PROPORCIONADA

    objImageMagick_01.Convert “-resize”, “200×50%”, sP_Fichero_Origen_01, sFichero_Destino_01 ‘ PARA HACER LA IMAGEN EL DOBLE DE ANCHA
    ‘ Y LA MITAD DE ALTA
    ‘ ATENCION!!! DEFORMAMOS LA IMAGEN

    objImageMagick_01.Convert “-resize”, “100×200”, sP_Fichero_Origen_01, sFichero_Destino_01 ‘ MODIFICAMOS EL TAMAÑO A 100×200 PIXELS
    ‘ LO INTENTAMOS PERO ImageMagick MANTIENE
    ‘ LA PROPORCION
    ‘ LA COORDENADA QUE MANDA ES EL ANCHO (100)

    objImageMagick_01.Convert “-resize”, “100×200^”, sP_Fichero_Origen_01, sFichero_Destino_01 ‘ MODIFICAMOS EL TAMAÑO A 100×200 PIXELS
    ‘ LO INTENTAMOS PERO ImageMagick MANTIENE
    ‘ LA PROPORCION
    ‘ LA COORDENADA QUE MANDA ES EL ALTO (200)

    objImageMagick_01.Convert “-resize”, “100×200!”, sP_Fichero_Origen_01, sFichero_Destino_01 ‘ MODIFICAMOS EL TAMAÑO A 100×200 PIXELS
    ‘ SI MANTENER LA PROPORCION

    Set objImageMagick_01 = Nothing

    End If

    End Sub

  3. Sergio says:

    Hola muchachada …

    pues aquí ando yo también con mi vb6 sacándole el máximo.

    Me estoy intentando currar una aplicación que compare dos imagenes. No me va … pero estoy en ello.

    Una cosa por si alguien tuviera problemas. Si os sale alguna pantalla de fallo asociado al runtime c libraries o algo así … tenéis que bajaros de microsoft el siguiente archivo:

    vcredist_x86

    esto lo solventa.

    Saludos

    • robertale says:

      Muy bueno el aporte!

      Cierto, yo tambien me he encontrado con un error parecido:
      “Runtime Error! R6034 An application has made an attempt to load the C runtime libraru incorretly. Please…”

      Y la solucion ha sido instalar el paquete “Visual C++ 2008 Redistributable Package”, tambien lo podemos encontrar como “Paquete redistribuible de Microsoft Visual C++ 2008 SP1” (vcredist_x86.exe).

      En principio con esto es mas que suficiente.

      Saludos y gracias por el aporte!
      Robert

  4. morfeo9950 says:

    hola queria preguntar si con esta libreria se puede manipular una imagen en tiempo de ejecucion y cambiarle algunas cosas como ser agregarle unos puntitos rojos en algunas secciones y otras cosas, gracias.

    • robertale says:

      Sí, se puede.

      Creo que te refieres a esto, a dibujar en un fichero imagen:

      “objImageMagick_01.Convert “-draw”, “circle 35,35 10,30″, sP_Fichero_Origen_01, sFichero_Destino_01” ‘ PARA DIBUJAR UN CIRCULO O UN PUNTO EN EL FICHERO

      ó

      “objImageMagick_01.Convert “-draw”, “circle 35,35 10,30″, sP_Fichero_Origen_01, sFichero_Destino_01” ‘ PARA DIBUJAR UNA LINEA EN EL FICHERO

      Yo creo que esto te responde de forma rápida y concisa a tu pregunta, 😉

      Muchas gracias por tu participación!

      P.D.:
      Visto el éxito de esta entrada, sobre la manipulación de imágenes, me ha dado idea para hacer otra entrada resumiendo todo lo que estamos hablando aquí.
      ¡Gracias a todos!

  5. gusomig says:

    Hola, interesante el post y blog, soy principiante, como seria un ejemplo para compara dos imagenes, para encontrar imagenes iguales. Gracias por su atencion y aporte.

    • robertale says:

      Lo primero! Muchas gracias!

      La verdad es que de primeras no sabria responderte.

      Pero rapidamente se me ocurre…

      Podrias comparar el tamaño de los ficheros, fechas de creacion, modificacion,
      comparar los checksum (aunque esto ultimo puede ser una barbaridad).
      No se, comparar cualquier parametro del fichero, de su exterior, sin entrada dentro del mismo.

      Lo siguiente seria ir entrando cada vez mas dentro del fichero, comparar sus dimensiones, compara su calidad o cantidad de colores, etc… asi hasta el ultimo punto que pienso que seria comparar pixel a pixel.

      Como resumen de la idea, ir recogiendo datos de los ficheros y comparandolos.
      Comenzando por los mas sencillos (los que son mas faciles, rapidos y que pidan menos recursos al recuperarlos) hasta los mas complicados y profundos, como comparar pixel a pixel (imaginate las necesidades de hardware que necesitaras para comparar 2 imagenes pixel a pixel, serian un poco grandes, no?)

      ¿Que te parece?

  6. Javier Ortíz Aguirre says:

    Hola, buen día.

    Buscando soluciones para leer imagenes encontré sus aportaciones y me parecen excelente… Cabe mencionar que utilizo VB6.0 practicamente para resolver muchas cosas a problemas o ideas que se me ocurren en mi trabajo, por lo que mi experiencia como programador no es la mejor; pero, estoy muy atorado en un tema que están tocando Ustedes ¿saben alguna función o algún código para poder leer pixel por pixel de una imagen?…
    Agradezco de antemano la atención que le den a este email.

    ¡Saludos!

    • robertale says:

      Hola Javier,

      Lo primero, muchas gracias. Se hace lo que se puede.

      Creo que tu experiencia como programador puede ser tan interesante como la de cualquier otro.
      Por experiencia, en este mundillo no solo basta con tener grandes estudios, sino también experiencia, picardia y habilidad para resolver los problemas rápida y eficazmente, en definitiva tener tablas. Y eso no lo da un libro sino la experiencia, las horas “dándonos cabezazos contra el monitor”.

      Veo que el tema de manipular imágenes esta siendo un éxito.
      Así que mi respuesta a tu pregunta la presentare muy pronto en una nueva entrada (tengo por ahí algún código que te puede interesar).

      Saludos y muchas gracias nuevamente!
      Robert

  7. Javier Ortíz Aguirre says:

    Robert Muchas Gracias!!!, estaré en espera de tu ayuda.
    ¡Saludos!

  8. watson raidth says:

    veo que son bastantes capos en imagenes…pero les dejo una inquietud…si leo una hoja desde un escaner y esta imagen la paso a la pantalla, como leo las respuestas de esta prueba y traduzco esa punto que fue leido en una respuesta….como me guio para leer simepre correctamnete las respuestas independiente de como se inserte la hoja en el escaner…como me guio …esa es mi duda..gracias.
    rodrigo, Santiago de Chile Noviembre del 2010.

    • robertale says:

      Hola Rodrigo,

      La verdad es que no he entendido muy bien tu duda. Pero a ver si es correcto…
      Tu duda es:
      ¿Como manipular el escaneo de prueba?

      Mas bien yo te preguntaria, ¿Como consigues sacar por pantalla esa imagen de prueba?
      Creo que estaras programando el escaner para que te devuelva un imagen, o mejor dicho, para que te devuelva un fichero imagen ¿cierto?

      Pues si es asi, el procesado de esas imagen es igual al que hariamos con cualquier otro fichero imagen (bmp, jpg, etc…)

      Siento no poder darte mas respuestas, no he entendido tu pregunta, lo siento.
      Pero si me aclaras la prengunta seguramente te podre ayudar.
      Saludo!
      Robert

  9. Janet says:

    hi, saludos
    me podrias ayudar con esto, necesito convrtir archivos tiff a otroformato como jpg, bmp,e etc
    GRACIAS!

    • robertale says:

      Hola,

      Una manera muy sencilla seria utilizar ImageMagick.
      De la siguiente forma y a modo de ejemplo, ahi te dejo un source code:

      Private Sub Command1_Click()

      Dim sP_Fichero_Origen_01 As String
      Dim sFichero_Destino_01 As String

      Dim objImageMagick_01 As Object

      sP_Fichero_Origen_01 = “D:\TIFF\Deep Dark Process.tif”
      sFichero_Destino_01 = “D:\TIFF\Deep_Salida.jpg”

      If (Dir(sP_Fichero_Origen_01) “”) Then
      Set objImageMagick_01 = CreateObject(“ImageMagickObject.MagickImage.1″)

      objImageMagick_01.Convert sP_Fichero_Origen_01, sFichero_Destino_01

      Set objImageMagick_01 = Nothing

      End If

      End Sub

      Preparando esta respuesta he observado un resultado muy interesante.
      Si por ejemplo, tenemos un TIFF de varias hoja (como el que podria arrojar un sistema de fax, etc…) al convertir en un formato de imagen obtenemos tantos ficheros como paginas tengamos.

      Espero que te haya servido y muchas gracias por seguir este humilde blog.
      Muchas gracias y Saludos,
      Robert

  10. Jose Luis says:

    como cargo la referencia ImageMagickObject 1.0 Type Library

    • robertale says:

      Hola Jose Luis,

      Perdona… pero la pregunta es tan simple que no entiendo muy que problema tienes.

      Te refieres a que…
      ¿No puedes cargar la referencia cuando estas trabajando con el Visual Basic?

      Si es asi, comprueba si has instalado correctamente ImageMagick.

      Si no es asi, debe bajarlo de:
      http://www.imagemagick.org/script/binary-releases.php?ImageMagick=93hm2j4f13vfo5uiaab0gf6hm6#windows

      Yo utilizo/descargo la instalacion “ImageMagick-6.6.6-5-Q16-windows-dll.exe”

      Despues, ejecutas la instalacion…

      Como una instalacion tipica de windows, vas definiendo parametros hasta que llegas a “Select Additional Task”
      Y ahi seleccionas “Install ImageMagickObject OLE Control for VBScript, Visual Basic, and WSH”

      Una vez terminada la instalacion… (no recuerdo si es necesario reinicar el sistema). Entra en el entorno de VB6 y ya tendras la libreria disponible en las referencias.

      Saludos y muchas gracias por leerme!
      Robert (Deep Dark Process)

  11. Jose Luis says:

    Muchas Gracias Robert, muy interesante tu aporte, me has salvado la vida con estas simples pero complejas rutinas. Yo ya habia pensado en algo parecido pero use convert desde la linea de comandos y era un poco lento. Aun no pruebo tu solucion pero creo que funciona full. SI puedes me interesaria mucho si tienes rutinas para mejorar, brillo, contraste, saturacion y todo lo de las imagenes.

    Mi propuesta es hacer un tablero donde puedas colocar tu nombre rut y algunos datos para una fotografia de curriculum o estudiante el cual lo tengo casi listo.

    Muchas Gracias.

    Jose Luis Torres
    Tecnovisual@hotmail.com
    Tecnovisual6@gmail.com
    Temuco-Chile

  12. Jose Luis says:

    Public inicio As Integer
    Public final As Integer

    Private Sub Command1_Click()
    Dim ImagenO As String
    Dim ImagenD As String
    Dim obj As Object
    ImagenO = “c:\foto.jpg”
    ImagenD = “c:\fotito.jpg”
    If (Dir(ImagenO) “”) Then
    If Not (ImagenD “”) Then
    ImagenD = ImagenO
    End If
    Set obj = CreateObject(“ImageMagickObject.MagickImage.1”) ‘ CREAMOS UN OBJECTO, SERA NUESTRO OBJETO IMAGEMAGICK
    obj.Convert “-rotate”, CStr(90), ImagenO, ImagenO
    obj.Convert “-resize”, “800×600”, ImagenO, ImagenD
    Set obj = Nothing ‘ ELIMINAMOS O VACIAMOS EL OBJETO IMAGEMAGICK
    final = Timer
    a = final – inicio
    MsgBox a
    ‘Else
    ‘ MsgBox “ERROR_Rotar_Imagen_01_01” & vbCrLf & _
    ‘ vbCrLf & _
    ‘ “ERROR AL EJECUTAR COMANDO DE ROTACION DE IMAGEN” & vbCrLf & _
    ‘ vbCrLf & _
    ‘ “NO SE HA ENCONTRADO EL FICHERO DE DESTINO [” & ImagenO & “]”, vbCritical
    ‘ ‘
    End If
    End Sub

    Private Sub Form_Load()
    inicio = Timer
    End Sub

    Robert

    Una nueva consulta
    como hago para que el proceso se demore mucho menos o eso es lo mas rapido que puece andar con las imagenes.

    tengo un procesador celeron de 2.8 y 1 giga de ram
    y hayo a mi manera de ver los tiempos transcurridos un poco largos al rededor de 5 segundos por rotar y redimencionar una imagen. Al saber que se hacen muchas colocaiones de nombres al dia.

    gracias de ante mano

    tecnovisual

    • Robert Ale says:

      Se muy bien lo que cuentas Jose Luis.
      Usando ImageMagick a veces me sucede, pero no con tanto retardo.

      Yo desarrollo mucho con bases de datos, con consulta pesadas, procesado de datos bastante largo… y bueno con la experiencia que esto me ha dado (y las quejas de los usuarios) ultimamente esto aplicando una tecnica que puede interesarte.

      Por un lado yo hago mi trabajo, mi funcion o procedimiento de turno…
      Veo que tarda, intento anadir “DoEvents” (http://support.microsoft.com/kb/118468/es).
      Por ejemplo en tu caso en las lineas del “Convert”:

      Set obj = CreateObject(“ImageMagickObject.MagickImage.1″) : DoEvents
      obj.Convert “-rotate”, CStr(90), ImagenO, ImagenO : DoEvents
      obj.Convert “-resize”, “800×600″, ImagenO, ImagenD : DoEvents

      Y si aun asi no mejora el rendimiento (con el DoEvents lo que hago es desbloquear un poco el sistema) lo que hago es “entretener la vista del usuario”.
      Yo tengo un formulario generico (a modo de libreria) que utilizo como si fuera una pantalla de estado, un contado, como esa pantalla del windows que sale cuando copias ficheros que te sale una barra y te va indicado el tiempo y los ficheros que quedar… pues igual.

      Pienso que siempre debemos mejorar nuestras programacion pero hay ciertos momente que por distintas razones ya no llegamos mas haya asi que lo que hay que hacer es entretener al ojo para que no se impaciente. el usuario.

      Saludos,
      Robert

  13. JANET says:

    Hola de nuevo, tengo un nuevo problema espero su gentil respuesta.
    Necesito unir, separar, y/o extraer páginas de archivos tif. No se si esta librería me lo permita o si existe algún código para esto. Gracias!

    • Robert Ale says:

      Hola Janet,

      Te respondo rapido y espero que te sirva.
      Siento no poder pasarte codigo porque lo he experimentado poco o nada.

      Lo de separar ficheros, con la respueta anterior creo que te puede valer.
      Te respondi para pasar un TIF a JPG.
      Pero si demas tiene instalado en tu PC la aplicacion/libreria “GhostScript” (http://pages.cs.wisc.edu/~ghost/) el mismo codigo que te pase lo puedes utilizar para convertir PDF a JPG (GhostScript nos ayuda a leer PDFs).
      Funciona, lo tengo probado.

      Y para unir puede que lo puedas lograr con GhostScript.
      Aqui te paso un enlace a ver si te sirve:
      http://hints.macworld.com/article.php?story=20030223192653618
      No se si funciona, no lo he probado.

      Sé que hablo de PDFs pero igual se puede aplicar a los TIFs
      La verdad es que tu pregunta me ha dado mas ideas para nuevas entradas.

      Muchas gracias por leer este blog!
      Robert

      • Joseba says:

        Hola Robert,

        Estoy empezando con ImageMagick.

        Mi necesidad es convertir un documento pdf en tantas imágenes como páginas tenga.

        Solo una imagen de cada página pero con buena resolución (que se pueda imprimir sin pérdida respecto al original) y no necesito visualizarlo previamente.

        Me vendría bien un ejemplo de código para la conversión, porque he hecho pruebas, no da error pero tampoco genera nada.

        No tengo pega con la instalación de ImageMagick, pero ¿debo instalar además Ghostscript? ¿Hay alguna instalación conjunta o algo así?

        Gracias anticipadas y un saludo.

  14. Luis says:

    Hola.
    Perdona el atrevimento pero todavía estoy en pañales en esto de la programación.
    Intento implementar el código que pones al principio en una macro con el editor VB de Office y me estoy haciendo un lío tremendo. ¿Podrías indicar cómo sería ese código concretándolo para un archivo determinado? No sé si me explico. Gracias de cualquier forma.

    • Robert Ale says:

      Hola Luis,

      En VBA (el VB de Office) seria el mismo codigo.

      Primero te debes asegurar que tienes instalado correctamente ImageMagick.
      Despues, dentro de editor VBA deber tener marcada la referencia “ImageMagickObject 1.0 Type Library” (tal cual lo explico en la entrada)
      Y por ultimo crear (o copias) el procedimineto.

      La programación es identica a la que hariamos en VB6 (no cambia ni una sola coma).

      Ahora bien… ¿Que es lo que deseas hacer? Te lo pregunto porque me tomo que lo que deseas es rotar una imagen que ya esta inscrustada en el Office y para eso se deberia hacer de otra manera.

      Espero que te haya servido y si no es asi, por aqui estare para concretar mas tu duda.

      Saludos y gracias por seguir mi blog.
      Robert

  15. Luis says:

    Hola Robert. Gracias por contestar.

    Mi problema de fondo es que no sé como llamar al procedimiento Public Sub que tú has escrito desde una macro en Excel (porque programo desde la utilidad programador de Visual Basic que incorpora). Así que he intentando hacer lo siguiente:

    Sub Rotar_Imagen_01()

    Dim sP_Fichero_Origen_01 As String
    Dim sFichero_Destino_01 As String
    Dim fP_Angulo_01 As Double

    fP_Angulo_01 = 180
    sP_Fichero_Origen_01 = “C:\Pruebas\cedaelpaso.jpg”
    sF_Fichero_Destino_01 = “C:\Pruebas\peligro.jpg”

    ‘————————————————-§§§—-‘
    ‘ PROCEDIMIENTO PARA ROTAR UNA IMAGEN

    ‘ POR DEFECTO LA IMAGEN ES ROTADA 90, SEGUN LAS AGUJAS DEL RELOJ
    ‘————————————————-§§§—-‘

    Dim objImageMagik_01 As Object ‘ DEFINIMOS UN OBJECTO

    ‘ CHEQUEO Y MAS CHEQUEOS… INTENTADO HACER LAS COSAS A PRUEBA DE BOMBAS….

    If (Dir(sP_Fichero_Origen_01) “”) Then
    If Not (sFichero_Destino_01 “”) Then
    sFichero_Destino_01 = sP_Fichero_Origen_01
    End If

    Set objImageMagik_01 = CreateObject(“ImageMagickObject.MagickImage.1”) ‘ CREAMOS UN OBJECTO, SERA NUESTRO OBJETO IMAGEMAGICK

    objImageMagik_01.Convert “-rotate”, CStr(fP_Angulo_01), sP_Fichero_Origen_01, sFichero_Destino_01 ‘ LLAMAMOS A .CONVERT
    ‘ VEIS QUE SENCILLO ES ROTAR UN FICHERO

    Set objImageMagik_01 = Nothing ‘ ELIMINAMOS O VACIAMOS EL OBJETO IMAGEMAGICK

    Else
    MsgBox “ERROR_Rotar_Imagen_01_01” & vbCrLf & _
    vbCrLf & _
    “ERROR AL EJECUTAR COMANDO DE ROTACION DE IMAGEN” & vbCrLf & _
    vbCrLf & _
    “NO SE HA ENCONTRADO EL FICHERO DE DESTINO [” & sP_Fichero_Origen_01 & “]”, vbCritical

    End If

    End Sub

    Pero el resultado es nulo.

    Otra opción que he probado es copiar el Public Sub tal y como tú lo has escrito y luego escribir una macro intentando llamar al Public Sub pero no me sale:

    Sub Rotar_mi_imagen()
    Dim Operacion As String

    fP_Angulo_01 = 180
    sP_Fichero_Origen_01 = “C:\Pruebas\cedaelpaso.jpg”
    sF_Fichero_Destino_01 = “C:\Pruebas\peligro.jpg”

    Operacion = objImageMagik_01.Convert(“-rotate”, CStr(fP_Angulo_01), sP_Fichero_Origen_01, sFichero_Destino_01)

    End Sub

    El error es que “se requiere un objeto”

    Gracias.

    Un saludo.

    • Robert Ale says:

      Ok, basicamente los dos procedimiento son similares. En el primero le habia hecho mas generico y con control de errores.

      Del ultimo procedimiento solo te falta definir el objjeto.

      Añade esto al principio del procedimiento:

      Dim objImageMagik_01 As Object
      Set objImageMagik_01 = CreateObject(“ImageMagickObject.MagickImage.1”)

      Luego el codigo que has escrito…

      Y como final de tu procedimiento debes cerrar, vaciar o eliminar (como lo quieras llamar) el objeto:

      Set objImageMagik_01 = Nothing

      Saludos,
      Robert

  16. Luis says:

    Ok maestro. Funciona perfectamente como dices, sólo que además había puesto
    sF_Fichero_Destino_01
    en lugar de
    sFichero_Destino_01

    Gracias

    Saludos.

  17. Hugo says:

    Que Tal, Espero Puedas Ayudarme un Poco, Estoy Intentando Utilizar La Libreria ImageMagick En vb2008 Para Poder realizar Esto: Eliminar El fondo De Una Imagen, Mejorar La Imagen (Contraste, Brillo, Etc), Determinar La Dimension De Lo Quedo Despues De Elimnar El fondo.
    Con Esta Libreria Podre Hacerlo? Podrias Darme Una Sugerencia?

    Saludos.

    • Robert Ale says:

      Hola Hugo!

      Buff es mucho y muy general, a ver por donde empiezo:

      – Programar en VB2008 (VB.NET): Sí, se puede.

      – Eliminar El fondo De Una Imagen: Creo que depende del formato del fichero. Me explico, si lleva capas y el fondo esta en una de ellas, puede.
      Nunca lo he probado.
      Ademas si estas trabajando con un BMP o un JPG seguro que no podras (no tienen capas).
      Para quitar un fondo hace falta mas que un simple comando, en photoshop se hace pero hay que realizar unos poco pasos. Igual puedes intentar hacerlos con Imagemagik

      – Mejorar La Imagen (Contraste, Brillo, Etc): Sí, se puede. Pero si no estoy confundido, lo que se hace es aplicar son valores y lo que te intuyo es que tie quieres que automaticamente aplique unos valores u otros (algo mas complicado).

      – Determinar La Dimension De Lo Quedo Despues De Elimnar El fondo: Sí y no. Sí, porque es sencillo obtener las dimensiones de la imagen (tengo por aqui una entrada que hice hablando de ellos). Y no, porque si te refiere a sacar las dimensiones de la nueva imagen, despues de haberla quitado el fondo, es mas complicado. Ten en cuenta, hay que quitarle el fondo, y despues recortarla.

      Por ello el Photoshop es tan bueno y famoso. Porque es una aplicación (no una libreria de programacion) con la que se puede ahcer de todo.
      Dentro de Photoshop seguramente habra una libreria pero por si sola ni una libreria ni un photoshop puede hacer todo lo que pides.

      De todas formas, te propondo una cosa.
      Prueba a realziar esto mismo en cualquier aplicacion de retoque fotografico (photoshop, gimp, etc…) y despues de tener los pasos y comandos correctos, estudiemos como conseguir cada comando mendiante imagemagik.

      Saludos y Gracias por acercarte al blog,
      Robert

      • Hugo says:

        Muchas Gracias por Contestar
        Estoy Trabajando En Un Proyecto Un Tanto Complicado, Donde Tengo Que Hacer Estos Procesos De forma Automatica, Te Comento Un Poco El Contexto, La Imagen A Tratar Tiene Un Objeto En El Centro el Resto Es Solo Fondo De Un Solo Color, y El Objetivo Trabajar Solo Con El Objeto, Lo De Eliminar El Fondo Lo Habia Pensado Para Tener Solo El Objeto y Asi Aplicarle Los Filtros y Operaciones Para Determinar Sus Dimensiones.

  18. Carlos says:

    excelentes aportes, felicidades

    Yo ando buscando una alternativa para realizar varios cortes de una imagen y guardar cada corte con un nombre diferente.
    En algunos ejemplos solo he podido encontrar manipulacion de imagenes pero no corte y renombramiento de las mismas.
    Ejemplo: una imagen tiene 25 figuiras (en una sola hoja de papel) la escaneo y luego quiero separar cada una de ellas con un nombre diferente. sera que existe algun ejemplo de como poder realizarlo?

    Gracias por su respuesta y atencion.

    • Robert Ale says:

      Hola y muchas gracias los leer esta entrada!

      En su tiempo hice alguna prueba parecida y con resultados bastante correctos.
      Pero la verdad, como te propones manipular la imagen creo no no se puede (aunque no estoy seguro).

      Yo te propongo, que si tiene que hacer 25 cortes, haz 25 copias de la imagen y recortar de cada fichero una sola figurita.
      Al final conseguirar el mismo resultado y pienso que lo haras de una forma mas ordenada (asi como si te lo programas bien, podras tanto 25, como 2 o 10000 figuritas).

      ¿Como lo recortas?
      objImageMagik_01.Convert “-crop”, “Ancho x Alto + OffSet_X + OffSet_Y”, Fichero_Origen, Fichero_Destino

      Ejemplo:
      -crop 40×30+10+10 crop.gif

      Aqui te paso el enlace: http://www.imagemagick.org/script/command-line-options.php#crop

      Saludos!!!

  19. Alex says:

    Hola enhorabuena por el excelente articulo! Tengo una dudilla básica…ya que hace muuucho tiempo que no uso el vb6.

    Para usar la libreria referenciada (ImageMagickObject OLE Control for VBScript, Visual Basic, and WSH) en un equipo que no tenga instalado el programa ImageMagick tengo que hacer algo en especial?

    o tal vez cuando cree el instalador(exe) el empaquetador ya me pondrá el archivo donde toque?

    Muchas grácias
    Saludos!!

    • Robert Ale says:

      Hola y muchas gracias!

      Personalmente, yo lo que recomiendo y hago, es instalar la librería con su instalador.
      En concreto yo estoy instalando “ImageMagick-6.5.6-5-Q16-windows-dll.exe” (aunque ya van por la versión 6.7.5-3) (Ver http://www.imagemagick.org/script/binary-releases.php#windows ).

      Aunque es muy posible que con solo copiar y registrar la librería “ImageMagickObject.dll” sea suficiente:

      La copias en…
      C:\Windows\System32\ –> Para sistemas de 32bits
      o en…
      C:\Windows\SysWOW64\ –> Para sistemas de 64bits

      Y la registras como…
      REGSVR32 “C:\Windows\System32\ImageMagickObject.dll” –> Para sistemas de 32bits
      o…
      REGSVR32 “C:\Windows\SysWOW64\ImageMagickObject.dll” –> Para sistemas de 64bits

      Pero no se si funcionara ya que puede que falte alguna librería mas.
      Aun no lo he probado.

      Si tu tiene ganas de probarlo, puedes comentarnos tu experiencia. Suerte!

      Saludos!

  20. Alex says:

    Entendido, de momento intalaré el programa, así seguro que funciona, mas adelante trastearé un poco con las dll.

    Otra cosita, estoy volviendome un poco loco buscando la sintaxis del comando “Montage”.
    En la página web dice esto:

    montage balloon.gif medical.gif present.gif shading.gif \
    -mode Concatenate -tile 2×2 montage_array.jpg

    en mi código pongo esto:

    Set oImagen = CreateObject(“ImageMagickObject.MagickImage.1”)
    oImagen.Montage sImagenes, “-mode Concatenate”, “-tile x3”, sDestino
    Set oImagen = Nothing

    Donde:
    sImagenes = “C:\test\prueba01.bmp C:\test\prueba02.bmp C:\test\prueba03.bmp”
    sDestino = “C:\test\Final.bmp”

    el caso es que no funciona y no veo por donde puede fallar. Ves algo raro?

    Muchas grácias por todo, eres un crack!
    Saludetes!

  21. Alex says:

    Solucionado!!

    sería asi:

    oImagen.Montage “-mode”, “Concatenate”, “-tile”, “2×2”, “C:\test01.bmp”, “C:\test02.bmp”, “C:\test03.bmp”, “C:\Final.bmp”

  22. Alex says:

    Bueno, el comando “manual” es así y funciona a la perfección, pero no hay manera de pasarle todo el “churro” de imagenes en una variable?

    Voy a explicar un poco mas el proyecto:

    Quiero obtener las imagenes 360 del streetview y he conseguido las imagenes troceadas, le puedes echar un vistazo a el siguiente link:
    http://jamiethompson.co.uk/web/2010/05/15/google-streetview-static-api/

    Bien, la historia es que el comando Montage me funciona sólo si le paso cada imagen por separado (con una coma), es decir, de la siguiente manera:

    oImagen.Montage “-mode”, “Concatenate”, “-tile”, “7×3”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_00.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_01.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_02.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_03.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_04.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_05.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_06.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_10.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_11.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_12.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_13.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_14.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_15.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_16.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_20.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_21.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_22.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_23.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_24.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_25.bmp”, _
    “E:\StreetViewDownloader\IMG\5qz3DXwwgfSTPbNZ0rpLOQ_26.bmp”, _
    “E:\StreetViewDownloader\IMG\Final.bmp”

    si le paso una variable no hace nada…

    lo que me gustaria es poder pasarle una variable en vez de todas las imagenes ya que pueden ser mas o menos segun escojas el nivel de zoom del streetview. Por ejemplo, si eliges zoom 3 son 7×3, si elijes zoom 1 son 1×2, etc…

    He probado de todo y no consigo dar con el comando… estoy desesperadete..

    Se te ocurre algo??

    Sobretodo muchas grácias por tu tiempo y Saludos!

  23. Alex says:

    Solucionado también:

    He usado una funcion “Concatenar” a la que le paso una variable string con el siguiente formato:

    C:\IMG\imagen01.bmp, C:\IMG\imagen02.bmp, C:\IMG\imagen03.bmp, …)

    Luego separo esa string con “split” y la meto en un array. Compruebo el número de argumentos con UBound y LBound. Luego hago un select case sobre el nº de argumentos y dependiendo de lo que sea hago el montage de tantos argumentos como tenga la string.

    Es cutre, pero es lo que se me ha ocurrido..

    SALUDOS!

  24. CarlosD says:

    Generalmente los blogs son muy pobres en su contenido y no aportan muchas soluciones a los problemas que se nos presentan como programadores y en un mundo modernizado y cada vez más exigente en cuanto a calidad, cantidad y sobre todo tiempos de respuesta, este aporte de Robertale es uno de esos aportes que te sacan de un apuro…. mis respetos.

    Pero ahora voy con una pregunta que seguramente sabes la respuesta.
    Supongo que se soluciona con el comando Identify, pero no logro hacer que en un cuadro de mensaje común del tipo MSGBOX se despliegue la información que generaría esta línea:

    objImageMagick_01.Identify sP_Fichero_Origen_01

    El resultado en una línea de comandos es:
    JPEG 512×384 512×384+0+0 8-bit DirectClass 36.3KB 0.000u 0:00.000

    Pero ¿Cómo mostrar lo mismo en un cuadro de mensaje del tipo MsgBox o en un TextBox en caso de usar -verbose?

  25. CarlosD says:

    Aunque en realidad lo que busco es usar los comodines para obtener el tamaño de ancho y alto de la imagen en un cuadro de mensaje.

    identify -format ‘%g’ sP_Fichero_Origen_01

    Devuelve: (En mi caso y con la imagen que estoy usando obviamente)

    ‘512×384+0+0’

  26. eric says:

    Hola Amigo. Soy novato en esto del VB6. Estoy haciendo una aplicacion usando la VBA de excel. Alli necesito un cuadro Image1 que contenga la imagen que requiero rotar x grados.
    Use tu codigo que amablemente nos compartes, pero al ejecutar me sale la forma Form1 sin embargo no visualizo nada. Me podrias ayudar como debe quedar el codigo completo?. Ya instale el ImageMagick y pude seleccionar la Lib 1.0 como lo muestras pero nada. otro detallito El angulo de rotacion de la imagen lo va a leer de un cuadro de texto. He checado y esot si puede hacerse con VB6 pero la VBA de excell no incorpora el Picture Box, sino control image y el image1. Gracias por tu ayuda.

    • Robert Ale says:

      Hola!

      Ok, a ver si te puedo ayudar…

      En el excel solo pueden añadir un “image”…
      Bien, sustituye lo que el código para el PictureBox por el Image.

      Es decir, la imagen que la tengo guardada en un fichero. Y que la voy rotando.
      La cargo en el componente Image como:

      Image1.Picture = LoadPicture(App.PATH & “\pictemp.bmp”)

      Para vaciar o recargar el Image, recuerda aplicar “= LoadPicture(“”)”.

      Ya me contaras si esto te funciona.

      Saludos!

  27. jordi says:

    Buenas, excelentes explicaciones, paso a detallar mi consulta y agradeciendo de ante mano su tiempo.
    Es muy sencilla quiero extraer directamente la fecha en la que se tomo una fotografía (jpg), en visual básic 6, pero hasta el momento no ha habido forma.
    ¿podría ayudarme?
    Gracias

  28. William Mirana says:

    Hola estoy tratando de hacer unas ocx que maneje visualmente un porcentaje 0% – 100% algo así como un manómetro. Sera que me puedas ayudar segun veo vas bien adelantado en estos temas… Saludos y gracias de antemano

  29. Ulthar says:

    ¿Alguien ha logrado registrar el imagemagickobject.dll en otro pc sin instalar el ejecutable? (para redistribuir). Lamentablemente no es cosa de soltarla, registrarla y ya está, y toda la información que encuentro al respecto me remite a compilar el source con vc++ y ahí ya me pierdo.

  30. Albert says:

    Hola,

    Necesito comparar dos imagenes que contienen números del 1 al 36, la finalidad es saber qué numero del 1 al 36 es dicha imágen. Ya conseguí comparar los píxeles pero el problema añadido es que la imagen cambia un poco sus sombras, si la amplio se nota, pero si la miro en pequeño se ven iguales las dos, como podria comparar dichas imágenes para que sepa cual es el número de la imágen?

    • Albert says:

      Hola de nuevo,

      Lo que necessito exactamente es poder hacer el Umbral que hace el Photoshop de 128% (Threshold) De esta forma podria comparar major las imágenes para obtenir los números.

      Albert.

      • Albert says:

        Hola de nuevo,

        Que va lo he intentado con el Umbral, y tampoco me vale, alguien podria decirme como lo puedo hacer? Si necesitais alguna otra información puedo proporcionalra, gracias.

  31. mati says:

    Referencie la dll y copie el codigo tal como esta. Pero mientras se ejecuta el programa en la sentencia

    objImageMagik_01.Convert “-rotate”, CStr (fP_Angulo_01), sP_Fichero_Origen_01, sFichero_Destino_01

    me da un error en tiempo de ejecucion numero de error: -2147215503(80041771)
    probe quiterle el guion y del string “-rotate” y me guarda la imagen nueva pero sin rotar. Es decir que falla al pasar el parametro “-rotate”

    Que puedo hacer ?

    • mati says:

      probando modificaciones me funciona si lo modifico el codigo de esta forma:

      objImageMagik_01.Convert “-rotate-“, CStr(fP_Angulo_01) + “>”, sP_Fichero_Origen_01, sFichero_Destino_01

      pero solo en tiempo de ejecucion. Es decir que si lo modifico y lo ejecuto no anda, lo tengo que hacer fallar para luego corregirlo en debug y hace lo que quiero.
      El problema es que no me toma el “-rotate” solo

  32. johnny says:

    Hola, no se si este foro esta vigente aun.
    Mi problema es el siguiente: Tengo una aplicación en VB6 y necesito poder convertir un documento PDF, que puede tener 1 o mas hojas, en imagen. La imagen final puede ser en bmp, gif, jpg, pcx, png, tga, tif, cpd (uno de ellos). Lo ideal seria que el archivo de salida contenga todas las hojas del pdf, o que se cree un archivo imagen por cada pdf.
    NOTA: Debe ser en Visual Basic 6.
    Muchas gracias.

  33. Hello! This post couldn’t be written any better! Reading this post reminds
    me of my old room mate! He always kept talking about
    this. I will forward this page to him. Fairly certain he will have a good read.
    Many thanks for sharing!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: