Newsgroup: it.comp.lang.visual-basic
Titolo: Dimensioni immagini JPG

Per conoscere le dimensioni (Width ed height) di una immagine JPG basta 
caricarla su un controllo image con stretch false e leggerle.
Ma se le immagini sono tante occorre un tempo inaccettabile.
Allora nel sito dei vari formati file: 
http://www.wotsit.org/
ho trovato questa regola:
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
  - number of components (1 byte), usually 1 = grey scaled, 3 = color YCbCr
    or YIQ, 4 = color CMYK)
  - for each component: 3 bytes
     - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
     - sampling factors (bit 0-3 vert., 4-7 hor.)
     - quantization table number
Questo sistema va benissimo ma NON per tutti, per alcuni files tra cui 
quelli della mia fotocamera la sequenza $ff, $c0 non si trova eppure se VB 
nel controllo image la riconosce in qualche altro maledetto posto deve stare 
ma io non riesco a trovarla nè sul sito anzidetto ho trovato lumi.
In tre testi il sistema è quello sopra descritto.
Sarei moooolto grato a chi mi illuminasse su questo problema.
A buon rendere con un sorgente interessante.
Ciao Peppe 

 ha scritto

passo sul problema. sulle dimensioni qui c'e' codice del ng, forse ti serve
http://www.sundaysw.com/sw/cod_img-size
ciao, j.

 Per conoscere le dimensioni (Width ed height) di una immagine JPG
cut
BEh probabilmente la fotocamera ha prodotto un file standard exif
Non ho tempo per provare un po di codice ma un buon punto di partenza
http://www.exif.org/
... 
http://www.exif.org/specifications.html
poi
c'è sto tizio che dice ha implementato il tutto via asp
http://www.spaz.com/mr/work/aspexiffuncs/
(non ho provato)
Alla sua pagina un po di link!
ed infine
http://www.vbaccelerator.com/home/VB/Code/vbMedia/Using_GDI_Plus/Reading_EXIF_and_Other_Image_Properties/article.asp
Facci sapere!
Ciao!
-- 
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

 ha scritto nel messaggio
news:eB3_d.34722$Of5....@nntpserver.swip.net...

Se hai Access, ho realizato un Demo per l'estrazione dei Dati EXIF dalle
Foto
provenienti dalle Digitali, all'interno forse trovi qualche cosa di utile:
FAQ 1.20 Estrarre dati EXIF da immagini JPG/JPEG (del sito sotto)
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

"Peppe"
Prova un po' questo *.vbs  io non ho la possibilita' di provarlo ... se
non fa'  quello che vuoi posta che ti metto un paio di *.au3
http://www.hiddensoft.com/autoit3/
che dovrebbero fare quello che vuoi e che vanno a leggere
direttamente il file in binario
strFolder = "C:\WINDOWS\TEMP"
strFile = "Test.JPG"
Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace(strFolder)
Set objFolderItem = objFolder.ParseName(strFile)
Dim arrHeaders(39)
For i = 0 To Ubound(arrHeaders)
    arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
Next
For i = 0 To Ubound(arrHeaders)
    Wscript.Echo i & vbtab & arrHeaders(i) _
       & ": " & objFolder.GetDetailsOf(objFolderItem, i)
Next
' original by Torgier
--
Fosco

A buon rendere con un sorgente interessante.
Il problema č che il Jpeg č un formato abbastanza bastardo, di cui ci
sono parecchie varianti.
Anzi, io approfitterei: ho un modulo che fa esattamente quello che
chiedi, e per le situazioni in cui l'ho testato io va bene. Non mi
dispiace se qualcun altro lo prova, in modo da darmi una casistica piů
ampia.
Mandami il tuo indirizzo a otluca AT yahoo PUNTO it, che te lo invio.
--
Ciao!
Luca Menegotto

 ha scritto nel messaggio 
news:pu2l3110o860jdnne...@4ax.com...

Ho provato non tutte le vostre gentili risposte, quello che va meglio č 
quello segnalatomi da jawalab che va benissimo per tutte salvo quelle 
originali delle fotocamere che inspiegabilmente random lo rifiutano.
Sono curioso anche io di provare il tuo codice e mi affretto a darti il 
recapito:
info chiocciola 
naglieri.com
Lo proverň subito sui files riottosi e ti farň sapere.
In genere quando trovo dei files bastardi li apro con qualsiasi paint - non 
gli faccio niente ma lo salvo con lo stesso nome e dopo va benissimo.
Ciao e grazie
Peppe 

 ha scritto nel messaggio 
news:39soavF...@individual.net...

Grazie molto l'ho provato, ma molto meglio del mio ma sulle JPG provenienti 
dalle fotocamere, per la sanyo va bene per altre non tanto - talvolta e 
questo è il caso strano fallisce random su una serie di scatti con lo stesso 
formato.
Comunque grazie sei stato molto gentile, a buon rendere,
Peppe 

On base alle gentili eisposte, e spigolando di qua e di la sui link ed i 
materiali inviatomi, ho risolto l'arcano delle immagini bastarde JPG, specie 
quelle provenienti dalle fotocamere.
In effetti il SOFO (FFC0) mentre nelle jpg create da programmi di paint 
acdsee e con gli ocx di VB risiede all'inizio del file ed in maggioranza al 
bite 129, nelle fotocamere questo SOFO è molto più in la, e cercandolo è 
facile che la coppia FFC0 faccia parte dell'immagine, per cui se ve ne sta 
più di uno quello buono è l'ultimo.
Ho fatto questa ricerca con l'editor binario su molte immagini, ed alla fine 
ho redatta una funzione che senza complicazioni e class od API mi risolve 
tutte le immagini che ho comprese le fotocamere Sanyo, Nikon, Canon - altre 
non ne ho.
Posto qui sotto per chi interessa la funzione per chi la volesse provare ed 
eventualmente suggerirmi varianti, a me sembra molto rapida.
Ecco la funzione:
#########################################
Public Function Dimens$(file$)
    'le icone e cursori le misuro con l'image sono piccole
    If InStr(UCase$(file$), ".ICO") Then GoSub perimg: Exit Function
    If InStr(UCase$(file$), ".CUR") Then GoSub perimg: Exit Function
  'Per trovare le dimensioni
  '- $ff, $c0 (SOF0) equivale in asci ÿÀ
  '- 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
  '- number of components (1 byte), usually 1 = grey scaled, 3 = color
    On Local Error GoTo esci
    'apro il file immagine
    Open file$ For Binary As #1
    'bastano solo i primi 25 bites
    content$ = Input(25, 1)
    Close #1
    Form1.ListView1.Visible = True
    'Form1.ListView1.Refresh
    If Mid(content$, 1, 3) = "GIF" Then
       'comincio con le GIF
       tp$ = "GIF"
       ImageWidth = Asc(Mid(content$, 7, 1)) + 256 * Asc(Mid(content$, 8, 
1))
       ImageHeight = Asc(Mid(content$, 9, 1)) + 256 * Asc(Mid(content$, 10, 
1))
       Dimens$ = CStr(ImageWidth) + " X " + CStr(ImageHeight) + " " + 
CStr(p)
       Exit Function
    ElseIf Mid(content$, 1, 2) = "BM" Then
       'poi le BMP
       tp$ = "BMP"
       ImageWidth = Asc(Mid(content$, 19, 1)) + 256 * Asc(Mid(content$, 20, 
1))
       ImageHeight = Asc(Mid(content$, 23, 1)) + 256 * Asc(Mid(content$, 24, 
1))
       Dimens$ = CStr(ImageWidth) + " X " + CStr(ImageHeight) + " " + 
CStr(p)
       Exit Function
    ElseIf Mid(content$, 7, 4) = "JFIF" Or InStr(UCase$(file$), ".JPG") Then
       'ed alla fine con le JPG
       tp$ = "JPG"
       Open file$ For Binary As #1
       'esamino i primi 1000 vites
       content$ = Input(1000, #1)
       Close #1
       'cerco l'header SOFO=FFC0 - in ascii=ÿÀ
       'lo cerco in asci con instr che è molto rapida
       p = InStr(content$, "ÿÀ")
       ' la posizione dell'header in genere ha posti fissi, se sono altri
       'è probabile che appartengono all'immagine per combinazione
       ' &HC0 To &HC3, &HC5 To &HC7, &HC9 To &HCB, &HCD To &HCF
       ' 192  195      197  199      201  203      205  207
       Select Case p
          'guardo se sono header ammessi
          Case 53, 159, 171, 190, 253, 331, 374, 528, 623, 627
            'Cista = True
            ' il p vabene
          Case Else
            'Cista = False
            'azzero p come se non l'avesse trovato
            p = 0
       End Select
       If p = 0 Then
            'Se p=0 allora si trova molto oltre questo capita con le 
immagini
            'che vengono dalle fotocamere digitali
            Open file$ For Binary As #1
            lu = FileLen(file$)
            If lu > 64000 Then lu = 64000
            'pongo in content$ i primu 64000 bites
            content$ = Input(lu, #1)
            Close #1
            'questo header per la sanyo
            p = InStr(content$, "ÿÀ")  '&hFFC0
            If p = 0 Then
               'questo header per la canon
               p = InStr(content$, "ÿÂ") '&hFFC2
               If p = 0 Then
                 'se non lo ha proprio trovato misuro l'immagine
                 GoSub perimg: Exit Function
               End If
            End If
60
             'per immagini da fotocamera deve essere l'ultimo marker
             'per essere sicuri che sia quello buono
             p1 = InStr(p + 1, content$, "ÿÀ")
             If p1 > p Then
             p = p1
             GoTo 60
           'End If
         End If
       End If
     End If
     ' estraggo dai seguenti bites height e width e creo la stringa
     ' si ritorno della funzione, e ci aggiungo (facoltativo) anche il
     'valore p di posizione header per vedere nelle varie immagini dove si 
trova
     'questo valore è interessante per vedere come una serie di foto della
     'stessa fotocamera hanno valori differenti chi lo sa petchè?
     ImageHeight = Asc(Mid(content$, p + 6, 1)) + 256 * Asc(Mid(content$, p 
+ 5, 1))
     ImageWidth = Asc(Mid(content$, p + 8, 1)) + 256 * Asc(Mid(content$, p + 
7, 1))
     Dimens$ = CStr(ImageWidth) + " X " + CStr(ImageHeight) + " (" + CStr(p) 
+ ")"
     'basta così per le immagini che ho le fa tutte
     Exit Function
perimg:
      'questa sub serve quando è refrattario
      'a qualsiasi sistema si estrae la dimens dell'image
      'occorre un'image 11 a questo scopo NON visibile - fa prima
      ' SCRWID = Screen.TwipsPerPixelX (va dichiarato in form.load)
      Form1.Image11.Stretch = False
      Form1.Image11.Picture = LoadPicture(file$)
      ImageWidth = Int(Form1.Image11.Width / SCRWID)
      ImageHeight = Int(Form1.Image11.Height / SCRWID)
      'la stringa di ritorno non ha offset e porta ] invece di X per notare
      'quando un'immagine è refrattaria a qualunque ricerca
      Dimens$ = CStr(ImageWidth) + " * " + CStr(ImageHeight)
      Return
esci:
   'trap di errore
   Dimens$ = "Non valida"
   MsgBox Error$
End Function
###################################
Grazie e chi mi volesse in privato scriva a:
info chiocciola 
naglieri.com
Ciao Peppe