Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Scrivere dati EXIF

E' relativamente facile leggere i file EXIF delle immagini JPG ma non ho 
trovato modo di scrivere questo tipo di dati, specialmente lo UserComment e 
l'ImageDescription.
Qualche idea ?
AlpVir 

 ha scritto nel messaggio
news:474daf95$0$4789$4faf...@reader4.news.tin.it...

Relativamente cosa significa...?
Come fai a leggerle...?
Da quanto ricordo(vado un pò a memoria, è passato qualche giorno...) si
legge il file in un Byte(Array) aperto in modalità Binary quindi si punta ai
rispettivi Byte rispettando l'Offset definito dallo standard previsto per i
dati Exif... se tu li leggi in questo modo quale difficoltà trovi a
riscriverli... il metodo è lo stesso solo che invece di fare la lettura fai
la scrittura nel file...
Cosa mi perdo nel problema...?
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------


Se vuoi, ad esempio in UserComment, scrivere 300 byte e prima c'era lo
spazio per soli 10 byte bisogna far spazio e spostare un mucchio (credo) di
puntatori.
Almeno questo è quello che capisco io, anche guardanto un file JPG con un
editor esadecimale.
Ciao
AlpVir


Magari stò sottovalutando la cosa, in effetti io mi ero limitato a
Leggere, ma hai provato a vedere se scrivendo semplicemente, quindi
shiftando il tutto in avanti di N Byte l'immagine è compatibile...?

 shiftando il tutto in avanti di N Byte l'immagine è compatibile...?
Troppo semplice. Ho provato ad aggiungere 2 byte sia con un edito 
esadecimale che con codice VB6 e ... "immagine non compatibile".
De resto se cerchi su Internet trovi un mucchio di codice per leggere ma 
niente per scrivere, almeno in VB6.
Segno che la cosa è alquanto complicata.
Altre idee ?
Ciao
AlpVir
(
www.lalpinistavirtuale.it
)

 (
www.lalpinistavirtuale.it
)
qui
http://it.wikipedia.org/wiki/Exchangeable_image_file_format
parla delle specifiche e segnala anche varie librerie.
http://www.zoner.it/support/faqs/media-explorer-5.htm
parla p.e. di casini nella lettura
i riferimenti di base suppongo siano qui
http://www.exif.org/specifications.html
e se cerchi "exif specification" trovi parecchi altri link.
ciao, a.

 Altre idee ?
Se non sbaglio questo lo fa:
http://freeimage.sourceforge.net/
Lo uso, ma non ho mai provato a lavorare con gli Exif.
Se vuoi stasera al lavoro ci provo e ti faccio sapere.
Bye, G.

"Paperino" <non...@lo.dico.invalid> ha scritto nel messaggio 
news:fimnn3$n6a$1...@registered.motzarella.org...

Nella  miriade di documentazione che mi son letto, fra cui quella segnalata 
da Andrea Palazzi, ho visto anche freeimage che ho però scartato in quanto 
(posso anche sbagliarmi) mi sembrava che potese solo leggere i dati Exif, 
non scriverli.
Se non ti è di troppo disturbo, visto che sai meglio di me dove mttere le 
mani, potresti verificare quanto ho detto ?
A me interessa unicamente scrivere un migliaio di byte in un campo 
qualsiasi; credo che lo UserComment sia il più indicato.
Grazie e ciao
AlpVir 

 credo che lo UserComment sia il più indicato.
Funziona :-)
Allora, piccola spiegazione: la FreeImage è una DLL scritta in C++;
c'è però un wrapper per VB6. Usando questo,  le cose si semplificano
e non di poco.
Nella cartella freeimage\wrapper\vb6\test c'è un microprogramma
di prova in VB.
Fallo funzionare, poi cambia quello che c'è dentro con queste righe
modificate e fammi sapere.
'********************************
Private Sub btnTest_Click()
      Dim dib As Long
      Dim bOK As Long ' perché poi non hanno usato una boolean ?
      ' Carica una Jpeg esistente in una bitmap in memoria
      dib = FreeImage_Load(FIF_JPEG, "test.jpg", 0)
      ' aggiunge il commento
      bOK = FreeImage_SetImageComment(dib, "testo di prova")
      ' e la risalva, sempre come Jpeg
      bOK = FreeImage_Save(FIF_JPEG, dib, "test2.jpg", 0)
      ' Scarica la bitmap in memoria
      FreeImage_Unload (dib)
    MsgBox "Finito"
End Sub
'********************************
Volendo fare di più puoi usare al posto della FreeImage_SetImageComment
la FreeImage_SetMetadata, riempiendo prima i campi della struttura
necessaria, e dovresti poter usare i campi IPTC e/o XMP, ma se ho
capito bene non ti serve, almeno per ora.
Bye, G. 

"Paperino" <non...@lo.dico.invalid> ha scritto nel messaggio 
news:finbf2$gti$1...@registered.motzarella.org...

Funziona perfettamente !!! Con un
S = FreeImage_GetImageComment(dib)
si può leggere.
E' proprio quello che cercavo: leggere e scrivere questi benedetti dati EXIF
Grazie infinite.
Terrò ben presente FreeImage che mi pare essere libreria molto potente. 
Probabilmente è in grado di sostituite altre librerie che fin qui, da 
ignorante, ho utilizzato.
Ad esempio quella dell'Intel per trasformare BMP in JPG.
Grazie ancora
AlpVir
P.S.: Approfitto ancora della tua estrema cortesia: avresti una soluzione 
per il mio post (andato deserto, ma me lo aspettavo) "Picture box a 360 
gradi" su questo stesso newsgroup ? 

 questo stesso newsgroup ?
Ci ho dato giusto un'occhiata. Così d'impulso, direi che si potrebbe
tenere la bitmap in memoria e blittarne sulla picturebox solo la parte,
o meglio le parti, necessarie al momento, ma non so dirti quanta
fluidità potresti ottenere, temo pochina, sia normalmente che con
le API grafiche.
Dipende tutto dalla fluidità di movimento che vuoi ottenere, se non
hai grosse pretese la BitBlt è sufficiente, anche se non è un granché.
Ti ho preparato un esempio molto, MOLTO grezzo, lo trovi qui:
http://paperino.port5.com/bitblt.zip
. Scaricalo, correggi il percorso
alla bitmap e lancialo, poi trascina lo scroller.
Se non è abbastanza fluido, può darsi che ti tocchi ricorrere alle
DirectX o qualcosa di simile, immagino. Non è proprio il mio campo.
Bye, G. 


Quando ha realizzato non è altro che il rifacimento, utilizzando la BitBlt, 
del meccanismo che utilizzo ora.
Ossia:
C'è una una picture box contenitore, larga 900 pixel. All'interno ce n'è 
un'altra, alta 900 pixel e larga (esempio) 4000 pixel la quale contiene 
l'immagine panoramica a 360 gradi.
Con queste semplici linee di codice si sposta l'immagine dentro a destra e a 
sinistra; proprio come nel tuo caso.
Private Sub Scroll_Change()
   Dim H As Single
   H = -Scroll.Value
   PicFoto.left = H
 End Sub
Tuttavia non è quanto avrei desiderato. Avrei desiderato, come succede nelle 
decine e decine di Applet Java atte a visualizzare un panorama a 360 gradi, 
il bordo destro dell'immagine si confondesse con quello sinistro. Non deve 
esistere quindi una barra i scorrimento orizzontale la quale varia un valore 
fra un Min e un Max.
Lo spostamento dell'immagine avviene con una specie di drag & drop 
sull'immagine stessa oppure (più semplicemente) con due pulsantini con 
freccia sinostra e destra, schiacciando uno dei quali l'immagini (il 
panorama) comincia a ruotare senza fermarsi mai. Esiste anche ovviamente un 
pulsante di stop e può esserci un regolatore di velocità.
Se guardi nel mio sito (
www.lalpinistavirtuale.it
 - sezione PANORAMI) potrai 
vedere appunto all'opera un'applet Java dal funzionamento simile a quello 
sopra descritto.
Al link 
www.lalpinistavirtuale.it/Panorami/DalParvo.jpg
 puoi vedere la bozza 
del risultato finale del programma che sto cercando di costruire.
Ciao
AlpVir 

Chiedo scusa. Non avevo ben compreso il meccanismo da te inventato e che, 
con qualche aggiuntamento, potrebbe rappresentare  la soluzione al mio 
problema.
Hai ragione. Adesso bisogna lavorare di matematica per perfezionare la 
modalità di visualizzazione.
Ancora scusa per aver esaminato il tuo progetto in modo superficiale.
AlpVir

 modalità di visualizzazione.
Buon divertimento ;-)
Così a occhio dovrebbe essere abbastanza semplice.
Spostamento verso sinistra:
      PuntoAttuale = PuntoAttuale - Scostamento
      If PuntoAttuale < 0 Then PuntoAttuale = LarghezzaOriginale
      Sposta
Spostamento verso destra:
      PuntoAttuale = PuntoAttuale + Scostamento
      If PuntoAttuale > LarghezzaOriginale Then PuntoAttuale = 0
      Sposta
La routine "Sposta" non è altro che quello che nel prog di prova era
dentro hscroll1_scroll, ovviamente senza la prima riga.
Bye, G.