Newsgroup: it.comp.lang.visual-basic
Titolo: Dimensioni di un immagine JPG

Per leggere la dimensione di un file JPG usavo questa function:
______________________________________
Public Function CheckPicSpecs(TheFile) As PicInfo
    Dim Content, ImageInfo As PicInfo, Var, FreeFile
    FreeFile = FreeFile
    Open File For Binary As FreeFile
    Content = Input(10, FreeFile)
    Close FreeFile
    If Mid(Content, 7, 4) = "JFIF" Then
       ImageInfo.Type = "JPG"
       Open TheFile For Binary As TheFreeFile
       Content = Input(167, TheFreeFile)
       Close TheFreeFile
       ImageInfo.Height = Asc(Mid(Content, 165, 1)) + 256 * Asc(Mid(Content, 
164, 1))
       ImageInfo.Width = Asc(Mid(Content, 167, 1)) + 256 * Asc(Mid(Content, 
166, 1))
    End If
    If Mid(Content, 1, 3) = "GIF" Then
       ImageInfo.Type = "GIF"
       ImageInfo.Width = Asc(Mid(Content, 7, 1)) + 256 * Asc(Mid(Content, 8, 
1))
       ImageInfo.Height = Asc(Mid(Content, 9, 1)) + 256 * Asc(Mid(Content, 
10, 1))
    End If
    CheckPicSpecs = ImageInfo
End Function
__________________________________________
Ma non funziona con tutti i files, in alcuna non si trova a 167 ma nella 
seguente sequenza:
SOF0: Start Of Frame 0:
  - $ff, $c0 (SOF0)
  - length (high byte, low byte), 8+components*3
  - data precision (1 byte) in bits/sample, usually 8 (12 and 16 not
    supported by most software)
  - image height (2 bytes, Hi-Lo), must be >0 if DNL not supported
  - image width (2 bytes, Hi-Lo), must be >0 if DNL not supported
Questo marker  $ff, $c0 (SOF0) non sta in una posizione precisa, per cui la 
ricerca allunga notevolmente i tempi.
Queste informazioni le ho prese da 
www.wotsit.org
Come fanno i programmi di visione immagini a restituire rapidamente le 
dimensioni?
Ci sta forse un sistema che non conosco?
Grazie mille a chi mi risponde, anche con un link.
-- 
Oldmann
old...@novalidemail.it
(Togliere novalid per rispondere)
________________________________

io uso un controllo picture e lo metto non visibile e poi interrogo 
picture_nome.picture.width ed il relativo heignt
leonello
"Oldman" <old...@email.it.invalid> ha scritto nel messaggio 
news:ehrgn5$obu$1...@newsreader.mailgate.org...


 leonello
Ti ringrazio, ma questo è il sistema che uso quando non trovo la sequenza, 
ma se devo fare un elenco di 100 files ci mette una vita, ed io mi domando 
ancora come fanno ad essere così fulminei i programmi tipo acdsee?
Grazie comunque
ciao
Oldman

 ciao
se puo' servirti, avevo messo in linea uno spunto di G 1 0 X®, qui sul ng.
il suo codice e' parecchio piu rapido.
-- 
ciao, a.
http://www.sundaysw.com
 > vb > code > img_size
hobbits use their real names

 cui la ricerca allunga notevolmente i tempi.
Cerca JPEGinfo qui e vedi se ti va meglio: 
http://edais.mvps.org/
Bye, G. 

"Paperino" <non...@lo.dico> ha scritto nel messaggio
news:ehu3nc$m4i$
1...@stargate1.inet.it

Molte grazie l'ho prelevato, e l'exe va benissimo, il codice è complesso, e 
ci devo studiare un po per applicarlo dato che c'è solo il cls.
Ma penso che sia quello che cercavo, molte grazie.
Oldman

 sul ng. il suo codice e' parecchio piu rapido.
Ti ringrazio molto lo cercherò, comunque volglio prima vedere il jpeginfo 
suggeritomi da Paperino
Molte grazie ancora
Oldman

che ne pensi.... provela



CUT
L'ho provata va alla grande, veramente fulminea e rapida e non sbaglia un 
colpo.
Da sola va benissimo, ma inserita nel mio prog mi da un errore di indice non 
compreso nell'intervallo, comunque devo vedere attentamente dove 
interferisce.
Grazie e ancora mille grazie, spero di poter ricambiare l'importante è che 
funziona benissimo.
E' proprio quello che cercavo, è semplice e stringata ed esamina tutti i 
casi rapidamente.
La via che usavo io per cercare i marker era troppo macchinosa.
Te ne sono grato.
-- 
Cordialità
Oldman
Tullio Naglieri - Roma
WEB page:
http://www.naglieri.com


L'ho applicato al mio programma di visione, ora va benissimo, ci mette un 
decimo del tempo di prima, tratta 160 files in 2 secondi.
L'errore era che nel mio prog avevo l'option base 1 - tolta quella è andato 
benissimo.
E' ol sistema di ricerca dei marker che è veramente efficiente.
Ancora grazie
Oldman

hello
 IO invece cerco una sub cje mi dia le dimensioni in pixel di un file di un 
filmato in formato mpg
leonello 

 ha scritto nel messaggio
news:my21h.7616$
Pk4....@tornado.fastwebnet.it

Guarda un po qui se c'è quello che fa al caso tuo:
http://www.wotsit.org/search.asp
Se ci hai già cercato mi spiace, ma non ho altro.
Grazie ancora , la sub l'ho trasformata in una function e va benissimo.
oldman

mandami se lo ritieni opportuna la tua function
leonello
il tuo nic_name e' oldman ...per inciso io ho 72  anni
ciao 

 ha scritto nel messaggio
news:%st1h.9634$
Pk4....@tornado.fastwebnet.it

Eccola subito:
Public Function dimens$(sFileName As String)
   'questa è la nuova routine datami da news VB
   If InStr(UCase$(sFileName), ".JPG") = 0 Then
     ' per gli altri si fa la vecchiaroutine
     dimens$ = Dimensio(sFileName)
     Exit Function
   End If
   Dim bBuf(65000) As Byte
   Dim lPos As Long
   Dim iFn As Integer
   Dim buffersize As Long
   buffersize = 65000
   Dim x_foto As Long, y_foto As Long
'-------
    iFn = FreeFile
    Open sFileName For Binary As iFn
    Get #iFn, 1, bBuf()
    Close iFn
 '--------
 On Local Error GoTo erdim
         ' if the file is not one of the above type then
    ' check to see if it is a JPEG file
        Do
        ' loop through looking for the byte sequence FF,D8,FF
        ' which marks the begining of a JPEG file
        ' lPos will be left at the postion of the start
            If (bBuf(lPos) = &HFF And bBuf(lPos + 1) = &HD8 _
                 And bBuf(lPos + 2) = &HFF) _
                 Or (lPos >= buffersize - 10) Then Exit Do
            ' move our pointer up
            lPos = lPos + 1
        ' and continue
        Loop
        lPos = lPos + 2
        If lPos >= buffersize - 10 Then Exit Function
'
        Do
' loop through the markers until we find the one
'starting with FF,C0 which is the block containing the
'image information
            Do
            ' loop until we find the beginning of the next marker
                If bBuf(lPos) = &HFF And bBuf(lPos + 1) _
               <> &HFF Then Exit Do
                lPos = lPos + 1
                If lPos >= buffersize - 10 Then Exit Function
            Loop
            ' move pointer up
            lPos = lPos + 1
            Select Case bBuf(lPos)
                Case &HC0 To &HC3, &HC5 To &HC7, &HC9 To &HCB, _
                &HCD To &HCF
                ' we found the right block
                    Exit Do
            End Select
            ' otherwise keep looking
            lPos = lPos + Mult(bBuf(lPos + 2), bBuf(lPos + 1))
            ' check for end of buffer
            If lPos >= buffersize - 10 Then
            Exit Function
            End If
        Loop
        ' get the height
        y_foto = Mult(bBuf(lPos + 5), bBuf(lPos + 4))
        ' get the width
        x_foto = Mult(bBuf(lPos + 7), bBuf(lPos + 6))
        dimens$ = CStr(x_foto) + " X " + CStr(y_foto)
        Exit Function
erdim:
        z1$ = Error$
        Resume Next
End Function
La mult è rimasta invariata
Ciao
Oldman

 ha scritto nel messaggio
news:%st1h.9634$
Pk4....@tornado.fastwebnet.it

Dimenticavo ho qualche anno più di te.
Il chi sono è nella mia web page
WEB page:
http://www.naglieri.com