-- 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 curMultiYearRegistrationsAntes 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 RETURNY 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 RETURNY 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 |