Reducir imagen en VFP

1,243 views
Skip to first unread message

Luis Gerardo

unread,
Mar 9, 2017, 11:36:59 AM3/9/17
to Comunidad de Visual Foxpro en Español

Estoy haciendo una aplicacion VFP Sp2 + Firebird 2.5, va a utilizar muchas fotografias y lo que estoy temiendo es que llegue el punto en que sea demasiado lento leerlas.

Cada fotografia pesa entre 4 y 5 Mb, ¿Habra en VFP o alguna rutina, algoritmo, OCX, DLL, etc que me ayude a reducir el tamaño de una imagen en tiempo de ejecución? esto quiero hacerlo antes de guardarla en la Base de datos.


Gracias por su ayuda


Luis Gerardo

Mario López

unread,
Mar 9, 2017, 12:40:01 PM3/9/17
to Comunidad de Visual Foxpro en Español

@Gerardo: usando ImageMagick convierto una imagen .JPG de 8.4 Mb en una de 1.8 Mb, sin demasiada pérdida de calidad -por lo menos para el uso que le doy yo-.
El programa tiene cientos de formas de uso, pero una que recomiendan para reducir el tamaño es

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 85% archivo_origen.jpg archivo_destino.jpg

HTH
Mario


Jose Antonio Blasco

unread,
Mar 9, 2017, 1:28:58 PM3/9/17
to Comunidad de Visual Foxpro en Español
Mira si te sirve esto:

* ---------------------------------------------------------------------------------
* ImgRedim
* Vers. 1.0
* ---------------------------------------------------------------------------------
* Librería para redimensionar una imagen, pasando un valor en pixels, que se tomará
* como valor máximo para la anchura o altura, según la orientación de la imagen.
* La imagen resultante será '.BMP'
*
* Tanto la imagen origen como la destino deben incluir su ruta.
*
* Si se omite la imagen destino, se tomará el de la origen, precedido por 'rsz_'
*
* USO:
* NewImg = ImgRedim(m.cArchivoOriginal, m.nTamano, m.cArchivoDestino)
*
* Parametros:
*        m.cArchivoOriginal    (Oblig.) Ruta y nombre de la imagen origen
*        m.nTamano            (Oblig.) Tamaño máx. para ancho/alto (minimo 100)
*        m.cArchivoDestino    (Opc.)   Ruta y nombre de la imagen redimensionada
*
*
* EJEMPLOS:
*   NewImg = ImgRedim('c:\fotos\img334.jpg',350,'c:\destino\imagen334')
*                --> NewImg = 'c:\destino\imagen334.bmp'
*
*   NewImg = ImgRedim('c:\fotos\img334.jpg',100)
*                --> NewImg = 'c:\destino\imagen334.bmp'
*
* NOTA: Si se devuelve un 'string' vacío, falló la redimensión
* ---------------------------------------------------------------------------------
Parameters m.cArchivoOriginal, m.nTamano, m.cArchivoDestino
Local m.cNombreTemporal, m.cRutaTemporal
*
m.cNombreTemporal = ''
*
If Vartype(m.cArchivoOriginal)<>'C'
    Return m.cNombreTemporal
Else
    If Empty(m.cArchivoOriginal)
        Return m.cNombreTemporal
    Endif
Endif
If Vartype(m.nTamano)<>'N'
    Return m.cNombreTemporal
Else
    If m.nTamano < 100
        m.nTamano = 100
    Endif
Endif
If Vartype(m.cArchivoDestino)<>'C'
    m.cArchivoDestino = ''
Endif

Do Locfile("system.app")

With _Screen.System.Drawing
   
    * Establecer archivo destino por omision
    If Empty(Juststem(m.cArchivoDestino))
        m.cArchivoDestino = 'rsz_' + Juststem(m.cArchivoOriginal)
    Endif

    * Establecer ruta destino
    m.cRutaTemporal = Addbs(Justpath(m.cArchivoDestino))
    If Empty(m.cRutaTemporal)
        m.cRutaTemporal = Addbs(Sys(5)+Sys(2003))
    Endif
   
    * Variables para almacenar el nuevo tamaño de la imagen
    Local lnWidth, lnHeight
    Store m.nTamano To lnWidth, lnHeight

    * Cargar la imagen original
    Local loSrcImage As xfcBitmap
    loSrcImage = .Bitmap.New(m.cArchivoOriginal)

    * Calculos para respetar proporcion imagen
    nPropor = Max(loSrcImage.width / m.nTamano, loSrcImage.height / m.nTamano)
    lnWidth = Int(loSrcImage.width / nPropor)
    lnHeight = Int(loSrcImage.height / nPropor)

    m.cNombreTemporal = m.cRutaTemporal + Juststem(m.cArchivoDestino) + '.bmp'

    * Crea una nueva imagen con el tamaño deseado
    Local loResized As xfcBitmap
    loResized = .Bitmap.New(lnWidth, lnHeight,.Imaging.PixelFormat.Format32bppARGB)

    * Fija la resolución de la imagen para que sea la misma que la original
    loResized.SetResolution(loSrcImage.HorizontalResolution, loSrcImage.VerticalResolution)

    * Crea un objeto Graphics para poder obtener los derechos de dibujar sobre el
    Local loGfx As xfcGraphics
    loGfx = .Graphics.FromImage(loResized)

    * Establece algunas propiedades para asegurarse de tener la mejor calidad de la imagen
    loGfx.SmoothingMode = .Drawing2D.SmoothingMode.HighQuality
    loGfx.InterpolationMode = .Drawing2D.InterpolationMode.HighQualityBicubic

    * Dibuja la imagen original en la nueva imagen con las dimensiones deseadas
    loGfx.DrawImage(loSrcImage, 0, 0, lnWidth, lnHeight)

    * Guarda la imagen redimensionada como Png
    loResized.Save(m.cNombreTemporal, .Imaging.ImageFormat.bmp)

    If !File(m.cNombreTemporal)
        m.cNombreTemporal = ''
    Endif
    *
    Return m.cNombreTemporal

Endwith


Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2

Fabio Ramirez

unread,
Mar 9, 2017, 2:13:18 PM3/9/17
to Comunidad de Visual Foxpro en Español
Hola 

Puedes Utilizar el procedimiento de gpImage

#include gpImage.h
If Not "gpImage" $ Set("Procedure") 
   Set Procedure To gpImage Additive 
EndIf

gdip = CreateObject("gpInit") 
img = CreateObject("gpImage") 

lcFile = GETPICT() 

img.Load(lcFile) 

lcDestFile = "_" + JUSTSTEM(lcFile) 

img.SaveAsJPEG(lcDestFile) 
img.SaveAsTIFF(lcDestFile) 
img.SaveAsBMP(lcDestFile) 
img.SaveAsGIF(lcDestFile) 
img.SaveAsPNG(lcDestFile) 

img  = NULL 
gdip = NULL

Miguel A.

unread,
Mar 9, 2017, 2:44:22 PM3/9/17
to Comunidad de Visual Foxpro en Español
Hola José Antonio,

Perdona mi ignorancia. ¿Dónde está system.app?.
Gracias
Miguel A.

Elides Paredes

unread,
Mar 9, 2017, 2:50:57 PM3/9/17
to Comunidad de Visual Foxpro en Español
Amigo Luis

Porqué crees que se va a poner pesado?
Pienso que -probablemente- guardas las imágenes en tu base de datos, algo que se ha comentado mucho en éste foro es una mala práctica, En mi sistema utilizo muchas imágenes que están en el disco duro. Claro ignoro la cantidad que tu utilizas. Pero normalmente no se pone pesado porque no se montan en memoria.

Sin embargo, si lo que quieres es realmente cambiar el tamaño, puedes usar lo que están proponiendo los otros participantes, -que incuso es mejor que lo que voy a proponerte- pero igual te digo que yo uso el VFPpaint que tiene una herramienta fabulosa para cambiar el tamaño a las imágenes.

Espero haber sido útil
Elides Paredes
Barquisimeto Venezuela

Elides Paredes

unread,
Mar 9, 2017, 2:54:07 PM3/9/17
to Comunidad de Visual Foxpro en Español
Olvide algo importante, el problema de redimensionar las imágenes es que también le bajas la calidad.
ya no se verán igual. al hacerlas grandes.
elides

Jose Antonio Blasco

unread,
Mar 10, 2017, 3:12:10 AM3/10/17
to Comunidad de Visual Foxpro en Español
Te adjunto el "system.app"

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2


System.app

Luis Maria Guayan

unread,
Mar 10, 2017, 7:22:41 AM3/10/17
to publice...@googlegroups.com

Mira en el Blog de la Comunidad

-- Redimensionar imágenes con VFP 9 y GDI+ --
https://comunidadvfp.blogspot.com/2006/07/redimensionar-imagenes-con-vfp-9-y-gdi.html


Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

El 09/03/17 a las 13:36, Luis Gerardo escribió:

Luis Gerardo

unread,
Mar 10, 2017, 6:15:30 PM3/10/17
to Comunidad de Visual Foxpro en Español
Muchas gracias a todos por sus aportes, hare unas pruebas con lo que me han recomendado y les cuento que opcion me parecio mejor.

Saludos

Luis Gerardo

unread,
Mar 10, 2017, 6:19:43 PM3/10/17
to Comunidad de Visual Foxpro en Español
El inconveniente de no guardar en la base de datos las imagenes es que tienes que compartir el directorio donde almacenas las imagenes y eso ya no es muy bueno por cuestiones de seguridad, o al menos no se me ocurre como hacerlo sin que se comparta el directorio.

En cuanto a si es mala practica o no, creo que cada programador tendra que evaluar que le es mejor si incluirlas como un blob o como una direccion fisica en alguna parte del disco duro.

De cualquier forma agradezco tu interes por el tema.
Reply all
Reply to author
Forward
0 new messages