Estoy implementando un módulo que requiere una conversión masiva de archivos de imagen. De cada fichero saldrán 8 a distintos tamaños en una base de datos de unos 1000 registros.
Hasta la fecha he venido utilizando una función que creé aunque nunca con gran volumen de datos, sólo la llamaba en ciertos procesos de la aplicación y ningún problema. Pero ahora al procesar este volumen de imágenes el sistema queda totalmente colapsado al poco de iniciar.
Aquí el código de la función de redimensionado a ver si veis algún fallo o sugerencia. O si conocéis algún método mejor para redimensionar imágenes.
Gracias,
- Code: Select all Expand view
Function RedimensionaJPG ( cFileIn, cFileOut, nWidth, nHeight, lBorrar )
/* ===================================================================================================================
Se ocupa de redimensionar un archivo . Se le puede pasar ancho y alto o sólo uno de los dos parámetros para
que redimensione proporcionalmente.
Parámetros : cFileIn - Fichero de Entrada
cFileOut - Fichero de Saluda
nWidth - nAncho
nHeight - nAlto
lBorrar - Borrar fichero origen
====================================================================================================================
*/
Local hBmp, hDib, cTempFile:=cTempFile(), lSaved
Local hResizedBitmap
DEFAULT lBorrar:=.F.
If cFileIn<>NIL .AND. cFileOut<>NIL
// Cargo un fichero
hBmp:=FILOADIMG (cFileIn)
If hBmp<>0
// Redimensiono hBmp
hResizedBitmap:=RedimensionaProporcionado ( hBmp, nWidth, nHeight )
// Guardo en fichero temporal el redimensionado
hDib := DibFromBitmap( hResizedBitmap )
DibWrite( cTempFile, hDib )
// Libero memoria
GlobalUnlock( hDib)
GloBalFree ( hDib )
GlobalUnlock( hResizedBitmap )
GlobalFree ( hResizedBitmap )
// Convierto un fichero en otro
lSaved = FIConvertImageFile( cTempFile, cFileOut, 2 )
// Borro fichero temporal
FErase( cTempFile )
// Borro el fichero original si es necesario
If lSaved .AND. lBorrar
FErase ( cFileIn )
Endif
SysRefresh()
Else
lSaved:=.F.
Endif
Endif
Return (lSaved)
Function RedimensionaProporcionado ( hbmp, nWidth, nHeight )
/* ===================================================================================================================
Permite redimensionar un "handle" (hbmp) de forma proporcionada si se le pasa nWidth o nHeight
Parámetros : hBmp - Handle bmp creado
nWidth - Ancho
nHeight - nAlto
====================================================================================================================
*/
Local hResizedBitmap:=hBmp
If Valtype( nWidth ) == "N" .AND. Valtype( nHeight ) == "N"
If nBmpWidth( hBmp )>nWidth .OR. nBmpHeight( hBmp )>nHeight
hResizedBitmap := ResizeBmp( hBmp, nWidth, nHeight )
Endif
ElseIf Valtype( nWidth ) == "N"
If nBmpWidth( hBmp ) > nWidth
hResizedBitmap := ResizeBmp( hBmp, nWidth, nBmpHeight( hBmp ) / ( nBmpWidth( hBmp ) /nWidth ) )
Endif
ElseIf Valtype( nHeight )=="N"
If nBmpHeight( hBmp ) > nHeight
hResizedBitmap := ResizeBmp( hBmp, nBmpWidth( hBmp ) / (nBmpHeight( hBmp ) / nHeight ), nHeight )
Endif
Endif
Return (hResizedBitmap)