Newsgroup: it.comp.lang.perl
Titolo: Image::MetaInfo - aggiustare jpeg problematici

 e seguenti) per i
dettagli.
(Un file con problemi apparentemente analoghi si può trovare all'indirizzo:
http://www.hcii.de/test.jpg
.)
Visto che recentemente si è parlato di questo modulo, mi chiedevo se è
possibile usarlo per aggiustare file come questo (si tratta, a quanto pare,
di modificare i campi Xdensity e Ydensity del segmento APP0, che sono
probabilmente scorretti, o, se legali, non utilizzabili da pdftex).
Ho dato una scorsa alla documentazione, ma la questione mi sembra
abbastanza complessa e non sono sicuro di avere ben compreso. Approfitterei
volentieri della probabile presenza dell'autore (o comunque di chi
chiumnque abbia una migliore conoscenza del formato jpeg) per un parere un
po' più informato.
In particolare, la mia diagnosi ha qualche probabilità di essere corretta?
Il segmento APP0 è comunque sempre presente, ed è ragionevolmente sicuro
confidare nella sua esistenza, e modificare i suddetti parametri di
densità? O è preferibile un intervento di altro tipo?
Ciao.

Ciao a tutti,
mi chiamo Francesco e mi sto avvicinando or ora al mondo del Perl.
La domanda è un po' spinosetta: se io volessi stampare (su video o
su file è indifferente) dei numeri con un formato preciso (non lo
so, ad esempio con 3 decimali piuttosto che 2) come faccio in Perl?
grazie mille
Francesco

so, ad esempio con 3 decimali piuttosto che 2) come faccio in Perl?
Funzione printf (o sprintf), piů o meno gli stessi parametri che in C.
Per i dettagli: perldoc -f sprintf
Ciao.

Giovanni Zezza wrote:

Grazie, adesso provo
Francesco

 un intervento di altro tipo?
Ciao,  provo a rispondere analizzando prima il contenuto del
file che hai collegato (test.jpg) e poi facendo delle ipotesi.
Scrivendo a schermo il risultato di get_description() dal mio
modulo ottieni le seguenti informazioni:
  0B <0xd8   SOI>
 14B <0xe0  APP0>
    [               Identifier]<......> = [    ASCII] "JFIF\00"
    [             MajorVersion]<......> = [     BYTE]  1
    [             MinorVersion]<......> = [     BYTE]  1
    [                    Units]<......> = [     BYTE]  1
    [                 XDensity]<......> = [    SHORT]  1
    [                 YDensity]<......> = [    SHORT]  1
    [               XThumbnail]<......> = [     BYTE]  0
    [               YThumbnail]<......> = [     BYTE]  0
 65B <0xdb   DQT>
    [   PrecisionAndIdentifier]<......> = [  NIBBLES]  0 0
    [        QuantizationTable]<......> = [     BYTE]  8 6 6 7 6 5 8 7 ... (56 more values)
  9B <0xc0 SOF_0>
    [          SamplePrecision]<......> = [     BYTE]  8
    [            MaxLineNumber]<......> = [    SHORT]  735
    [        MaxSamplesPerLine]<......> = [    SHORT]  551
    [          ImageComponents]<......> = [     BYTE]  1
    [      ComponentIdentifier]<......> = [     BYTE]  1
    [          SamplingFactors]<......> = [  NIBBLES]  1 1
    [    QTDestinationSelector]<......> = [     BYTE]  0
 26B <0xc4   DHT>
    [       ClassAndIdentifier]<......> = [  NIBBLES]  0 0
    [              CodeLengths]<......> = [     BYTE]  0 1 5 1 1 1 0 0 ... (8 more values)
    [                 CodeData]<......> = [     BYTE]  0 1 2 3 4 5 6 7 ... (1 more values)
 85B <0xc4   DHT>
    [       ClassAndIdentifier]<......> = [  NIBBLES]  1 0
    [              CodeLengths]<......> = [     BYTE]  0 2 1 3 3 1 6 2 ... (8 more values)
    [                 CodeData]<......> = [     BYTE]  1 2 3 0 4 17 5 18 ... (60 more values)
  6B <0xda   SOS>
    [           ScanComponents]<......> = [     BYTE]  1
    [        ComponentSelector]<......> = [     BYTE]  1
    [          EntropySelector]<......> = [  NIBBLES]  0 0
    [   SpectralSelectionStart]<......> = [     BYTE]  0
    [     SpectralSelectionEnd]<......> = [     BYTE]  63
    [ SuccessiveAp...tPosition]<......> = [  NIBBLES]  0 0
55484B <ECS (Raw data)>
  0B <0xd9   EOI>
Qui, tutti i segmenti a parte APP0 servono per decodificare
l'immagine. APP0 invece contiene informazioni sulla anteprima
(thumbnail). Le dimensioni dell'immagine in pixels si trovano
nel segmento SOF_*, specificamente nei campi 'MaxLineNumber' e
'MaxSamplesPerLine', che danno 551x735). 
Passiamo ora ad APP0. Per il momento non ho ancora scritto la
funzione che riscrive un segmento APP0 modificato a disco, dunque
non si puo' fare quello che serve a te (ma se mi dici che serve
lo realizzo subito o per lo meno in fretta). I campi 'Units',
'XDensity' e 'YDensity' di APP0 sono da interpretarsi assieme
(vedi la sezione 'JFIF data ("APP0" segments)' nella documenta-
zione del mio modulo). Tu hai 1-1-1, che significa che i secondi
due numeri (1 e 1) rappresentano le densita' orizzontali e
verticali in punti per pollice; quindi, 1-1-1 e' evidentemente
un errore, perche' questa densita' porterebbe la tua immagine ad
avere una dimensione fisica di 551x735 pollici, ovvero, in unita'
piu' civili, 1400x1867 cm, ovvero in unita' piu' primitive, circa
46x61 piedi. Se e' vero che pdflatex si lamenta al di la' dei 19
piedi, questo e' il problema.
Si puo' risolvere sovrascrivendo i tre campi con (esempi):
0-1-1	  (l'immagine ha una aspect ratio di 1:1)
1-72-72   (l'immagine ha una densita' di 72 punti per pollice)
2-180-180 (l'immagine ha una densita' di 180 punti per cm)
Se mi confermi che la possibilita' di riscrivere questi valori
in modo semplice ti interessa, la realizzo per la prossima
versione del modulo, che sottomettero' al CPAN. 
Infine, il segmento APP0 non e' sempre presente; lo e' solo se
la tua immagine e' di tipo JFIF. Se l'immagine e' di tipo Exif
conterra' un segmento APP1 invece (completamente diverso, ma
puo' contenere informazioni sulla densita'). Ancora, e' del
tutto legale per un file jpeg non avere segmenti APP*, per cui
penso che pdflatex si attrezzi in questa evenienza ad utilizzare
una densita' predefinita.  Nel mondo JPEG la sicurezza non 
esiste. 
Ciao,
			Stefano

Nel mondo JPEG la sicurezza non esiste.
Questa è l'idea che mi sono fatto, leggendo la documentazione del tuo
modulo, e quella che ho trovato in rete. Il principio di fondo da cui
deriva questa situazione mi sembra sacrosanto (permettere a tutti di
registrare tutte le informazioni che vogliono, come vogliono), un po' di
rigidità in più su alcuni elementi essenziali, però, credo che sarebbe
stata utile.
Ciao.