Funcion para sacar las dimensiones de los archivos de imagen

52 views
Skip to first unread message

ZeRoberto

unread,
Mar 6, 2012, 2:33:04 PM3/6/12
to publicesvfoxpro
Hola a todos 

Estoy buscando una DLL o funcion que me permita obtener las dimensiones o (info) de cualquier archivo de imagen sin tener que cargarlo.

Encontré esto pero solo me sirve para JPG y GIF

PROCEDURE GetPictDimensions
LPARAMETERS cFileName, nWidth, nHeight
LOCAL lnImg, lnGet

  STORE -1 TO nWidth, nHeight
  * try to open picture file
  IF FILE(cFileName)
    lnImg = FOPEN(cFileName,10)
    IF lnImg>=0
      * successfully opened, so get first two bytes
      lcChars = FREAD(lnImg,2)

      DO CASE
      * 0xFFD8 signals a jpeg image
      CASE lcChars = CHR(0xFF)+CHR(0xD8)
        * fetch next marker
        DO WHILE !FEOF(lnImg)
          lcChars = FREAD(lnImg,1)
          * found a marker
          IF lcChars=CHR(0xFF)
            * must discard extra 0xFFs
            DO WHILE lcChars=CHR(0xFF)
              lcChars = FREAD(lnImg,1)
            ENDDO

            * is this the SOF marker?
            IF BETWEEN(ASC(lcChars),0xC0,0xC3)
              FREAD(lnImg,3)
              * read dimensions
              lcChars = FREAD(lnImg,1)
              nHeight = ASC(lcChars)*256
              lcChars = FREAD(lnImg,1)
              nHeight = nHeight+ASC(lcChars)
              lcChars = FREAD(lnImg,1)
              nWidth = ASC(lcChars)*256
              lcChars = FREAD(lnImg,1)
              nWidth = nWidth+ASC(lcChars)
              EXIT
            * if not, jump to the next marker
            ELSE
              * get the offset
              lcChars = FREAD(lnImg,1)
              lnOffset = ASC(lcChars)*256
              lcChars = FREAD(lnImg,1)
              lnOffset = lnOffset+ASC(lcChars)
              * go ahead to next marker
              IF lnOffset>2
                FSEEK(lnImg,lnOffset-2,1)
              ELSE
                EXIT
              ENDIF
            ENDIF
          ENDIF
        ENDDO

      * if not a jpeg image, go for a gif
      CASE lcChars = "GI"
        * look for remain gif signal
        lcChars = FREAD(lnImg,4)
        IF INLIST(lcChars,"F87a","F89a")
          * it's a GIF file, fetch logical screen size
          lcChars = FREAD(lnImg,1)
          nWidth = ASC(lcChars)
          lcChars = FREAD(lnImg,1)
          nWidth = nWidth+ASC(lcChars)*256
          lcChars = FREAD(lnImg,1)
          nHeight = ASC(lcChars)
          lcChars = FREAD(lnImg,1)
          nHeight = nHeight+ASC(lcChars)*256
        ENDIF
      ENDCASE

      FCLOSE(lnImg)
    ENDIF
  ENDIF
ENDPROC

Mauricio Ruben Molinero

unread,
Mar 6, 2012, 2:40:41 PM3/6/12
to publice...@googlegroups.com
Sin tener que cargarlo?? La verdad ni idea. esto no te sirve?
loImage = CREATEOBJECT("Image")
loImage.Picture = lcFile
lnHeight = loImage.Height
lnWidth = loImage.Width
Saludos!
Mauricio R. Molinero,

Miguel

unread,
Mar 6, 2012, 2:40:52 PM3/6/12
to Comunidad de Visual Foxpro en Español
Yo lo hago así de sencillo, pero cargándolo claro,eso sí, sirve para
cualquier tipo de fichero.
Espero que te sirva
Saludos,
Miguel

_SCREEN.ADDOBJECT("oImg", "image")
_SCREEN.oImg.PICTURE = lcFileName
_SCREEN.oImg.STRETCH = 0
ancho=_SCREEN.oImg.WIDTH
alto=_SCREEN.oImg.HEIGHT

Luis Maria Guayan

unread,
Mar 6, 2012, 2:38:47 PM3/6/12
to publice...@googlegroups.com
Mira este artículo de PortalFox

-- Obtener Propiedades / Atributos extendidos de archivos --
http://www.portalfox.com/article.php?sid=2757

Para tu caso particular de imágenes, solo te interesa el índice 26 ó los índices 27 y  28

Clear
lcFile = GETPICT() && Ejemplo con archivos MP3
loShell = Createobject("Shell.Application")
loFolder = loShell.Namespace(JUSTPATH(m.lcFile))
loItem = loFolder.ParseName(JUSTFNAME(m.lcFile))
If !Isnull(loItem)
  IF loItem.IsLink
    objLink = loItem.GetLink()
    ? "Link properties of shortcut:"
    ? "-------------------------------------"
    ? "Description:", objLink.Description
    ? "Path:", objLink.Path
    ? "Arguments:", objLink.Arguments
    ? "WorkingDirectory:", objLink.WorkingDirectory
    ? "-------------------------------------"
  else
    For ix= 26 To 28 && version based. win 7: 0 to 266. Property order differs too.
      ? "Column "+Str(m.ix,2)+": "+ ;
        loFolder.GetDetailsOf(loItem, m.ix)
    Endfor
  endif
Else
  ? "File doesn't exist"
Endif
Return

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Miguel

unread,
Mar 6, 2012, 2:42:01 PM3/6/12
to Comunidad de Visual Foxpro en Español
Qué curioso contestamos lo mismo al mismo tiempo 20:40

ZeRoberto

unread,
Mar 6, 2012, 2:44:22 PM3/6/12
to publice...@googlegroups.com
@LuisMaria voy a revisar el código luego te cuento

@Miguel Lo que no quiero es cargarlo porque cuando son imagenes grandes demora en cargar al control image.

Gracias a ambos por las respuestas

Saludos

Mauricio Ruben Molinero

unread,
Mar 6, 2012, 2:48:49 PM3/6/12
to publice...@googlegroups.com
ufffff, con razón dicen que la fama cuesta! :P
jaja

Saludos!

Mauricio R. Molinero,

ZeRoberto

unread,
Mar 6, 2012, 2:53:35 PM3/6/12
to publice...@googlegroups.com
@LuisMaria probé el código y funciona bien, pero dime funciona en cualquier maquina y en cualquier tipo de Windows?

Saludos

Luis Maria Guayan

unread,
Mar 6, 2012, 2:55:10 PM3/6/12
to publice...@googlegroups.com
Y que tal si lo pruebas tú y nos comentas? :-)

Lo he probado en Windows XP y Seven. El código es del turco Cetin Basoz. En el artículo hay dos enlaces interesantes sobre esa función


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


ZeRoberto

unread,
Mar 6, 2012, 2:59:08 PM3/6/12
to publice...@googlegroups.com
OK eso haré.

Gracias 

Saludos

edgar suarez kummers

unread,
Mar 6, 2012, 3:04:06 PM3/6/12
to publice...@googlegroups.com
Un secreto pero no lo divulguen a los cuatro vientos solo en el FORO ... shh ....

Un PHD Checo de nombre JAN PATERA ...

tiene todo el software que necesitan y lo llaman desde el VFP9.0 dentro de un *.bat

RUN mibat.bat

adentro del *.bat ponen los códigos de JAN PATERA 

tiene un conversor de color a grises que véanlo por sus propios ojos ...

saludos

edgar
--
edgar suarez kummers
LINDA.JPG
chica.jpg
hermosa.jpg

ZeRoberto

unread,
Mar 6, 2012, 3:08:42 PM3/6/12
to publice...@googlegroups.com
@Edgar si no me equivoco eso también se puede hacer con la librería GdiPlus del vfp, pero no lo he probado aun.

PD.- No pusiste el código que va en el bat.

ZeRoberto

unread,
Mar 6, 2012, 3:13:17 PM3/6/12
to publice...@googlegroups.com
No se si lo encontré te refieres al PictPreview32?

Saludos

edgar suarez kummers

unread,
Mar 6, 2012, 3:15:13 PM3/6/12
to publice...@googlegroups.com
Buenas ZEROBERTO:

Allí subí el ZIP con todo el trabajo de JAN PATERA

Algunas cositas pequeñas son mías ... pero son programas de

COMMAND LINE muy poderosos ... también dan dimensiones y mucho más... 

http://www.mediafire.com/?o0e35f4rbfyclis

saludos

edgar

El 6 de marzo de 2012 15:08, ZeRoberto <zero...@gmail.com> escribió:



--
edgar suarez kummers

edgar suarez kummers

unread,
Mar 6, 2012, 3:17:45 PM3/6/12
to publice...@googlegroups.com
El PICTVIEW es menos poderoso que el pvw32con ...

La verdad yo le escribí a JAN PATERA hace dos días y él me contestó ...

saludos

edgar
--
edgar suarez kummers
Reply all
Reply to author
Forward
0 new messages