-- El EAN 128, Uso e implementación en FoxPro --
http://www.tortugaproductiva.galeon.com/docs/ean128/index.html
*** Creamos un Objeto de PowerPoint
oPPT=CREATEOBJECT('POWERPOINT.APPLICATION')
PPTPRES=oPPT.PRESENTATIONS.ADD(1)
PPTSLIDE1=PPTPRES.SLIDES.ADD(1,1)
*** Creamos un Cuadro de Texto
oTXT1=PptSlide1.Shapes.AddTextBox(1,5,220,700,25)
WITH oTXT1
.Line.ForeColor.RGB=RGB(180,180,180)
.LINE.VISIBLE=.T.
.TEXTFRAME.TEXTRANGE.TEXT='ING. ERIK REYES LIMA'
.TEXTFRAME.TEXTRANGE.FONT.SIZE=18
.TEXTFRAME.TEXTRANGE.FONT.BOLD=.T.
.FILL.ForeColor.RGB = rgb(255,255,255)
.FILL.VISIBLE=.T.
.Shadow.ForeColor.RGB = RGB(180, 0, 119)
.Shadow.VISIBLE=.T.
ENDWITH
*** CREAMOS UNA LINEA
oLine1 = pptslide1.Shapes.AddLine(0,43,720,43)
WITH oLine1.Line
.ForeColor.RGB = rgb(180,0,119)
.Weight = 2
ENDWITH
*** CREAMOS UNA IMAGEN
PptSlide1.Shapes.Addpicture('C:\FOTOS\MIFOTO.JPG',1,1,0,0,70,40)
*** ACTIVAMOS EL POWERPOINT
OPPT.VISIBLE = .T.
[Sadex]
********************************************
* CREACION DE TABLA (albumfotos)
********************************************
LOCAL CSQL, NH, CCADENA
CSQL=""
NH=0
CCADENA=""
CSQL= "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"SERVER=127.0.0.1;" + ;
"PORT=3306;" + ;
"UID=usuario;" + ;
"PWD=pasword;" + ;
"DATABASE=mybasededatos;" + ;
"OPTIONS=2049;"
NH=SQLSTRINGCONNECT(""+CSQL, .T.)
IF NH > 0
SQLSETPROP(NH,'Asynchronous', .T.)
SQLSETPROP(NH,'BatchMode', .T.)
TEXT TO CSQL TEXTMERGE NOSHOW
CREATE TABLE albumfotos (
codigo char(03) NOT NULL default '000',
descripcion varchar(50) default '',
foto longblob,
PRIMARY KEY (codigo))
ENGINE=InnoDB ROW_FORMAT=DYNAMIC
ENDTEXT
SQLPREPARE(NH,""+CSQL)
SQLEXEC(NH)
WAIT WINDOW 'Tabla Creada'
SQLDISCONNECT(NH)
ENDIF
RELEASE CSQL,NH,CCADENA
*************************************************************
********************************************
* ARCHIVAR IMAGEN
********************************************
LOCAL BIMAGEN AS BLOB
BIMAGEN=(0h) && Inicializamos la Variable
BIMAGEN=FILETOSTR("C:\FOTO001.JPG")
TEXT TO CSQL TEXTMERGE NOSHOW
REPLACE INTO albumfotos
SET CODIGO='001',
DESCRIPCION='FOTO-001',
FOTO=?BIMAGEN
ENDTEXT
SQLPREPARE(NH,""+CSQL)
SQLEXEC(NH)
WAIT WINDOW 'Imagen Grabada'
RELEASE BIMAGEN
*************************************************************
********************************************
* EXTRAER IMAGEN
********************************************
TEXT TO CSQL TEXTMERGE NOSHOW
SELECT FOTO
FROM albumfotos WHERE CODIGO='001'
ENDTEXT
SQLPREPARE(NH,""+CSQL,"TCURSOR")
SQLEXEC(NH)
SELECT TCURSOR
IF RECCOUNT() > 0
STRTOFILE(TCURSOR.FOTO,"C:\FOTOS\FOTO001.JPG")
ENDIF
CLOSE TABLES ALL
********************************************
Esto no solo sirve para almacenar imágenes solamente, También es posible almacenar documentos PDF, Word, lo que se nos ocurra.
Yo por ejemplo lo utilizo para almacenar cada logo de empresa en mi base de datos, para posteriormente imprimirlo en la cabecera de las facturas e informes.SELECT cLastName, cFirstName, COUNT(*) as nCount ;
FROM people WITH (BUFFERING = .T.) ;
JOIN registration WITH (BUFFERING = .T.) ;
ON people.cPeople_PK = registration.cPeople_FK ;
GROUP BY cLastName, cFirstName ;
HAVING nCount > 1 ;
INTO CURSOR curMultiYearRegistrations
Antes de la importación conté los registros de los datos de ejemplo para hacer mis comparaciones. Esta división y manejo de los datos almacenados en el buffer me ahorró muchos la molestia de quitar los datos importados cuando encontraba errores. Habría podido hacer volar la base de datos y restaurar una backup, pero ésa habría tomado más tiempo. Habría podido importar a otra área, pero con esto habría hecho dos veces el trabajo. Podía suspender el proceso de la importación y hacer algunas consultas específicas para verificar que todo está bien durante cada paso de la importación.aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.Un UUID está diseñado para ser un único número globalmente en el espacio y el tiempo.
********************************************
* Ejemplo de uso función UUID
********************************************
LOCAL CSQL, NH, CCADENA
CSQL = ""
NH = 0
CCADENA = ""
CSQL = "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"SERVER=127.0.0.1;" + ;
"PORT=3306;" + ;
"UID=usuario;" + ;
"PWD=pasword;" + ;
"DATABASE=mybasededatos;" + ;
"OPTIONS=2049;"
NH = SQLSTRINGCONNECT("" + CSQL, .T.)
IF NH > 0
SQLSETPROP(NH,'Asynchronous', .F.)
SQLSETPROP(NH,'BatchMode', .T.)
CCADENA = PADR("",32,'0')
SQLPREPARE(NH, "SELECT UUID()","CURSOR")
SQLEXEC(NH)
SELECT CURSOR
IF RECCOUNT()>0
CCADENA = LEFT(FIELD(1),08)+ ;
SUBSTR(FIELD(1),10,04)+ ;
SUBSTR(FIELD(1),15,04)+ ;
SUBSTR(FIELD(1),20,04)+ ;
RIGHT(FIELD(1),12)
ENDIF
WAIT WINDOW CCADENA && Muestra la Cadena
SELECT CURSOR
USE
ENDIF
*************************************************************
Antonio L. Montagut* Técnica 1
* Obtener las dimensiones del objeto Image
LOCAL lcPictureFile
lcPictureFile = GETPICT()
LOCAL lnWidth, lnHeight
LOCAL loVFPImg as Image
loVFPImg = CREATEOBJECT("Image")
loVFPImg.Picture = lcPictureFile
lnWidth = loVFPImg.Width
lnHeight = loVFPImg.Height
loVFPImg = NULL
MESSAGEBOX("Objeto Image VFP " + CHR(13) + ;
"Dimensiones: " + TRANSFORM(lnWIdth) + " x " + TRANSFORM(lnHeight))
* Técnica 2 * Obtener las dimensiones del objeto Imagen utilizando la función LOADPICT() * Código de Lisa Slater Nicholls * El objeto devuelto por LOADPIC() es una instancia de la clase StdPicture. * Los valores de altura y ancho son unidades HiMetric (1 HiMetric = 0.01 milímetro). * http://www.foxite.com/archives/what-mysterious-calculation-is-behind-this-0000067503.htm * http://www.xtremevbtalk.com/archive/index.php/t-13097.html LOCAL lcPictureFile lcPictureFile = GETPICT() LOCAL lnWidth, lnHeight LOCAL loLoadedPict loLoadedPict = LOADPICTURE(lcPictureFile) lnHeight = ROUND((loLoadedPict.Height / 26.45454545455),0) lnWidth = ROUND((loLoadedPict.Width / 26.45454545455),0) loLoadedPict = NULL MESSAGEBOX("Función VFP LOADPICTURE()" + CHR(13) + ; "Dimensiones: " + TRANSFORM(lnWidth) + " x " + TRANSFORM(lnHeight))
* Técnica 3 * Obtener la información de la cabecera del archivo imagen * Los ejemplos se han adaptado a partir de las funciones de Thomas Gehrke en West-Wind Wiki: * http://www.west-wind.com/wiki/wc.dll?wc~JpgSizeFunction * http://www.west-wind.com/wiki/wc.dll?wc~GifSizeFunction LOCAL lcPictureFile lcPictureFile = GETPICT() LOCAL lnWidth, lnHeight, lcExt lcExt = LOWER(JUSTEXT(lcPictureFile)) DO CASE CASE lcExt = "bmp" LOCAL lnHandle, lcBytes lnHandle = FOPEN(lcPictureFile) IF m.lnHandle > -1 * Leer los primeros 27 bytes: lcBytes = FREAD( m.lnHandle, 27) = FCLOSE( m.lnHandle) lnWidth = CTOBIN(SUBSTR(lcBytes,19,4),"4RS") lnHeight = CTOBIN(SUBSTR(lcBytes,23,4),"4RS") ENDIF CASE lcExt = "gif" LOCAL lnHandle, lcBytes lnHandle = FOPEN(lcPictureFile) IF m.lnHandle > -1 * Leer los primeros 10 bytes: lcBytes = FREAD( m.lnHandle, 10) = FCLOSE( m.lnHandle) lnWidth = CTOBIN(SUBSTR( m.lcBytes, 7, 2),"2RS") lnHeight = CTOBIN(SUBSTR( m.lcBytes, 9, 2),"2RS") ENDIF CASE lcExt = "jpg" LOCAL lnHandle, lcBytes lnHandle = FOPEN(lcPictureFile) IF m.lnHandle > -1 LOCAL lnFileSize, lnCounter, lcBytes lnFileSize = FSEEK( m.lnHandle, 0, 2) lnCounter = 0 = FSEEK( m.lnHandle, 0, 0) FOR lnCounter = 1 TO m.lnFileSize - 2 lcBytes = FREAD( m.lnHandle, 3) IF m.lcBytes = CHR(0) + CHR(17) + CHR(8) OR ; m.lcBytes = CHR(0) + CHR(11) + CHR(8) * ¡Encontrar las marcas de bloque para las dimensiones! lcBytes = FREAD( m.lnHandle, 4) EXIT ELSE = FSEEK( m.lnHandle, -2, 1) ENDIF ENDFOR = FCLOSE( m.lnHandle) lnWidth = CTOBIN(SUBSTR( m.lcBytes, 3, 2),"2S") lnHeight = CTOBIN(SUBSTR( m.lcBytes, 1, 2),"2S") ENDIF ENDCASE MESSAGEBOX("Información desde la cabecera de imagen" + CHR(13) + ; "Dimensiones: " + TRANSFORM(lnWIdth) + " x " + TRANSFORM(lnHeight))
* Técnica 4 * Obtener la información de la imagen utilizando GDI+, con GdiPlusX * http://www.codeplex.com/VFPX/Wiki/View.aspx?title=GDIPlusX&referringTitle=Home LOCAL lcPictureFile lcPictureFile = GETPICT() LOCAL lnWidth, lnHeight _SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx"))) WITH _SCREEN.System.Drawing * Crear un Bitmap nuevo LOCAL loBmp as xfcBitmap loBmp = .Bitmap.FromFile(lcPictureFile) lnWidth = loBmp.Width lnHeight = loBmp.Height loBmp = NULL MESSAGEBOX("Biblioteca GDI+ - GdiPlusX" + CHR(13) + ; "Dimensiones: " + TRANSFORM(lnWIdth) + " x " + TRANSFORM(lnHeight)) ENDWITH
* Técnica 5 * Obtener la información de la imagen utilizando GDI+, con GpImage2 * http://cchalom.sites.uol.com.br/GPIMAGE LOCAL lcPictureFile lcPictureFile = GETPICT() LOCAL lnWidth, lnHeight IF Not "gpImage" $ SET("Procedure") SET PROCEDURE TO gpImage ADDITIVE ENDIF loGdip = CREATEOBJECT("gpInit") loBmp = CREATEOBJECT("gpImage") loBmp.Load(lcPictureFile) lnWidth = loBmp.ImageWidth lnHeight = loBmp.ImageHeight loBmp = NULL loGdip = NULL MESSAGEBOX("GDI+ library - GpImage2" + CHR(13) + ; "Dimensiones: " + TRANSFORM(lnWIdth) + " x " + TRANSFORM(lnHeight))
* Técnica 6
* Obtener la información de la imagen utilizando GDI+, con _GdiPlus.vcx, de Walter Nicholls
LOCAL lcPictureFile
lcPictureFile = GETPICT()
LOCAL lnWidth, lnHeight
LOCAL loBitmap as GpBitmap OF HOME() + "/FFC/_GdiPlus.vcx"
loBitmap = NEWOBJECT("GpBitmap", HOME() + "/FFC/_GdiPlus.vcx")
loBitmap.CreateFromFile(lcPictureFile)
lnWidth = loBitmap.ImageWidth
lnHeight = loBitmap.ImageHeight
loBitmap = NULL
MESSAGEBOX("Biblioteca GDI+ - FFC _GdiPlus.vcx" + CHR(13) + ;
"Dimensiones: " + TRANSFORM(lnWIdth) + " x " + TRANSFORM(lnHeight))
* Técnica 7
* Obtener información de la imagen utilizando GDI+, con lamadas directas de API
LOCAL lcPictureFile
lcPictureFile = GETPICT()
* API Declarations for GDI+
DECLARE LONG GdiplusStartup IN GDIPLUS.DLL ;
LONG @ token, STRING @ INPUT, LONG @ OUTPUT
DECLARE LONG GdiplusShutdown IN GDIPLUS.DLL LONG token
DECLARE INTEGER GdipLoadImageFromFile IN GDIPLUS.DLL ;
STRING wFilename, INTEGER @ nImage
DECLARE INTEGER GdipDisposeImage IN GDIPLUS.DLL INTEGER nImage
DECLARE INTEGER GdipGetImageWidth IN GDIPLUS.DLL ;
INTEGER nImage, INTEGER @ nWidth
DECLARE INTEGER GdipGetImageHeight IN GDIPLUS.DLL ;
INTEGER nImage, INTEGER @ nHeight
* Inicializar GDI+.
LOCAL gdiplusStartupInput, lhGdiPlusToken
gdiplusStartupInput = CHR(1) + REPLICATE(CHR(0), 15)
lhGdiPlusToken = 0
IF GdiplusStartup(@lhGdiPlusToken, @gdiplusStartupInput, 0) != 0
RETURN .F.
ENDIF
* Cargar el objeto Picture
LOCAL lnPictHandle
lnPictHandle = 0
= GdipLoadImageFromFile( STRCONV(lcPictureFile + CHR(0),5), @lnPictHandle)
* Obtener las dimensiones de la imagen
LOCAL lnWidth, lnHeight
STORE 0 TO lnWidth, lnHeight
= GdipGetImageWidth(lnPictHandle, @lnWidth)
= GdipGetImageHeight(lnPictHandle, @lnHeight)
* Limpiar el controlador principal GDI+
= GdiplusShutdown(lhGdiPlusToken)
MESSAGEBOX("GDI+ con llamadas API" + CHR(13) + ;
"Dimensiones: " + TRANSFORM(lnWidth) + " x " + TRANSFORM(lnHeight))
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
WITH _SCREEN.System.Drawing
* Crear un objeto Bitmap basado en un archivo BMP.
LOCAL loOriginalBmp AS xfcBitmap
loOriginalBmp = .Bitmap.New(GETPICT())
LOCAL loMonoChrBmp as xfcBitmap
loMonoChrBmp = loOriginalBmp.GetMonochrome()
* Guardar el Bmp monocromático que ha sido creado
loMonoChrBmp.Save("c:\Monocromatico.bmp", .Imaging.ImageFormat.Bmp)
ENDWITH
RETURN
Y este es el resultado para dos imágenes:_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
WITH _SCREEN.System.Drawing
LOCAL lcImgFile
lcImgFile = GETPICT()
* Crea un objeto Bitmap basado en un archivo BMP.
LOCAL loOriginalBmp AS xfcBitmap
loOriginalBmp = .Bitmap.FromFile(lcImgFile)
LOCAL loTempBmp as xfcBitmap
loTempBmp = .Bitmap.New(loOriginalBmp.Width, loOriginalBmp.Height)
LOCAL loGfx as xfcGraphics
loGfx = .Graphics.FromImage(loTempBmp)
LOCAL loAttr as xfcImageAttributes
LOCAL loGreyScaleMatrix as xfcColorMatrix
LOCAL loMonoChrBmp as xfcBitmap
LOCAL loRectBounds as xfcRectangle
loRectBounds = loOriginalBmp.GetBounds()
FOR lnFactor = .10 TO 1 STEP .10
loGreyScaleMatrix = _Screen.System.Drawing.Imaging.ColorMatrix.New( ;
lnFactor, lnFactor, lnFactor, 0.0, 0.0, ;
lnFactor, lnFactor, lnFactor, 0.0, 0.0, ;
lnFactor, lnFactor, lnFactor, 0.0, 0.0, ;
0.0 , 0.0 , 0.0 , 1.0, 0.0, ;
0.0 , 0.0 , 0.0 , 0.0, 1.0)
loAttr = NULL
loAttr = .Imaging.ImageAttributes.New()
loAttr.SetColorMatrix(loGreyScaleMatrix)
* Dibujar una imagen con las transformaciones en la matriz de colores
loGfx.DrawImage(loOriginalBmp, loRectBounds, loRectBounds, 2, loAttr)
loMonoChrBmp = loTempBmp.GetMonochrome()
* Guarda el Bmp monocromático que ha sido creado
loMonoChrBmp.Save("c:\" + JUSTSTEM(lcImgFile) + ;
TRANSFORM(lnFactor * 100) + ".bmp", .Imaging.ImageFormat.Bmp)
ENDFOR
ENDWITH
RETURN
Y esta vez podemos obtener mejores resultados, acorde con el factor deseado.Imagen Original |
||||
| Factor = 10 | Factor = 20 | Factor = 30 | Factor = 40 | Factor = 50 |
| Factor = 60 | Factor = 70 | Factor = 80 | Factor = 90 | Factor = 100 |
Imagen Original |
||||
| Factor = 10 | Factor = 20 | Factor = 30 | Factor = 40 | Factor = 50 |
| Factor = 60 | Factor = 70 | Factor = 80 | Factor = 90 | Factor = 100 |