Newsgroup: it.comp.lang.visual-basic
Titolo: traduzione file

Salve a tutti.
Ho uno strumento termografico che mi salva i dati in un formato "suo"
definito come segue:
 ogni file (da 51712 byte) è composto da due parti: la prima (immagine) è
lunga 51200 byte, la parte rimanente sono dati semplici in formato ASCII.
L'immagine è composta da 256*100 pixels (larghezza*altezza). Ogni pixel è
caratterizzato da 16 bit (density come c'e' scritto sul manualetto dello
strumento)
Ho problemi ad estrarre l'immagine...
Ho scritto il codice qua sotto, ma l'immagine che ottengo sembra uno
stereogramma, cioè punti colorati disposti a caso nella picturebox.
Ho trastformato i 16 bit di "density" in RGB come in fondo... spero in
maniera corretta.
Qualcuno ha qualche trucco e/o vede qualcosa di sbaglato?
Grazie mille
Pelo
Option Explicit
Dim Immagine() As Long
Const NRighe = 100
Const NColonne = 256
Private Sub OpenFile_btn_Click()
Dim NomeFile As String
Dim i As Integer 'Indice di riga
Dim j As Integer 'Indice di colonna
Dim PrimoByte, SecondoByte As Single
ReDim Immagine(NColonne, NRighe) As Long
Dim ByteCount As Single
CommonDialog1.ShowOpen
NomeFile = CommonDialog1.FileName
ByteCount = 0
Open NomeFile For Binary As #1
For j = 1 To NColonne
    For i = 1 To NRighe
        PrimoByte = Asc(Input(1, #1))
        SecondoByte = Asc(Input(1, #1))
        Immagine(j, i) = CSng(PrimoByte * 256 + SecondoByte)
        ByteCount = ByteCount + 2
    Next i
Next j
Close #1
Call Draw
End Sub
Private Sub Draw()
Dim i As Integer
Dim j As Integer
Dim Blue, Green, Red As Integer
PictureBox.ScaleHeight = NRighe
PictureBox.ScaleTop = 0
PictureBox.ScaleWidth = NColonne
PictureBox.ScaleLeft = 0
PictureBox.Refresh
For j = 1 To NColonne
    For i = 1 To NRighe
        Red = Immagine(j, i) Mod 32
        Green = ((Immagine(j, i) - Blue) Mod 2048) / 32
        Blue = (Immagine(j, i) - Blue - Green * 32) / 2048
        PictureBox.PSet (j, i), RGB(Int(Red * 255 / 32), Int(Green * 255 /
64), Int(Blue * 255 / 32))
    Next i
Next j
End Sub

Guarda a occhio e croce il codice non è scorretto, mi pare non ci siano 
problemi nella lettura dei dati dell'immagine.
Però... hai impostato la picture di destinazione con ScaleMode=vbPixels?
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

 Però... hai impostato la picture di destinazione con ScaleMode=vbPixels?
Provato, ma non cambia nulla! :-(

> Provato, ma non cambia nulla! :-(
Prova a espandere i singoli valori RGB che leggi dal file, in un formato 
a 24 bit.
Se leggi valori a 16 bit dal fil, vuol dire che avrai rosso, verde e blu 
da 5 pixel ciascuno (e un bit inutilizzato, probabilmente il più 
significativo).
Ora, presi i 5 bit di ogni pixel, avrai i 3 colori di quel pixel.
Ciascuno dei tre devi moltiplicarli per 8 e otterrai 3 valori a 8 bit.
Mettili insieme in una variabile Long (gli 8 bit meno significativi sono 
il red, poi vengono gli 8 bit del green e poi il blue, con gli 8 bit più 
significativi inutilizzati).
Dimmi che succede....


Aggiungo che nella sub che disegna l'immagine, devi fare i cicli 
diversamente da come fai ora: il più esterno riguarda le righe e il più 
interno riguarda le colonne. Non come fai tu che ci metti all'esterno le 
colonne e all'interno le righe.
Comunque perchè non posti su uno spazio uno di quei file che utilizzi 
così faccio delle prove? O magari postamelo in privato: il mio indirizzo 
di posta è: asepran chiocciola tin punto it


 significativi inutilizzati).
Non capisco perchè mi consigli di moltiplicare i valori per 8... non
equilave a shiftare a sinistra di 3 posizioni? In quel modo non avrei i tre
bit meno significativi praticamente inutilizzati?
Io ho riscalato i valori come indicato sopra... cioè in modo proporzionale.
Proverò a cercare qualcosa ancora sulla codifica a 16 bit...
Ti ho spedito in pvt un paio di files di esempio, purtroppo non ho uno
spazio pubblico dove postarli.
Grazie mille
Pietro
P.S. Perchè mi dici inoltre di cambiare l'ordine dei cicli nel disegno della
figura? Non è identico disegnare per righe o per colonne? c'e' qualcosa che
mi sfugge?

 bit meno significativi praticamente inutilizzati?
Non è una scelta casuale moltiplicare per 8.
Ho presupposto che i bit fossero sempre 5 (in questo caso il verde è di 
6 e quindi il codice cambierebbe leggermente).
Il fatto è questo: il colore ross usa 5 bit. Questo significa che ha 
massimo 32 combinazioni. Per avere l'equivalente su 8 bit dovresti fare 
(VALORE/32)*256, o anche (VALORE*256)/32, o anche VALORE*(256/32) che 
significa VALORE*8. Alla fine è solo questione di semplificazione.
Controllo la posta e vedo di cosa si tratta di preciso :)


Chiedo venia: si fa (VALORE/31)*256... quindi niente 8
Comunque faccio qualche prova e ti faccio sapere...


Qualcosa sono riuscito a vederla... però dovresti darmi maggiori info 
riguardo il formato di quel tipo di file... guarda bene sul manuale. 
Dovrebbe esserci specificato quanti bit sono utilizzati da ogni pixel.
Ecco il codice che finora sono riuscito a buttare giù:
Dim Colori(1 To 25600) As Long
Private Sub Form_Load()
Dim F As Byte
Dim B As Byte
Dim I As Long, J As Long
Dim Colore As Long
Dim Red As Long, Green As Long, Blue As Long
     Open "C:\frame003.200" For Binary As #1 Len = 1
         For I = 1 To 25600
             Get #1, , B
             Colore = CLng(B) * 256
             Get #1, , B
             Colore = Colore Or B
             Red = (Colore And &H7C00&) \ 1024
             Red = Red * CSng(255 / 31)
             Green = (Colore And &H3E0&) \ 32
             Green = Green * CSng(255 / 31)
             Blue = Colore And &H1F&
             Blue = Blue * CSng(255 / 31)
             Colori(I) = RGB(Green, Blue, Red)
         Next I
     Close #1
     For I = 0 To 99
         For J = 1 To 256
             Pic.PSet (J, I), Colori(I * 256 + J)
         Next J
     Next I
End Sub
Sul form ho messo una picturebox chiamata Pic... sia il form che la 
picturebox hanno Autoredraw=true e i file che mi hai mandato devono 
trovarsi in C:\
Sicuramente c'è qualcosa di strano nella codifica perchè non i pixel non 
sono memorizzati nè come RGB nè come BGR, ma come Green Blue Red. Quindi 
qualcosa mi diche che se leggi sul manuale c'è scritto anche quanti bit 
sono usati da ogni colore


Scusa aggiungo che la picturebox deve avere ScaleMode = vbPixels


 Dovrebbe esserci specificato quanti bit sono utilizzati da ogni pixel.
Il manuale riporta paro paro: "One image (frame memory data) has 256 pixels
horizontally, 100 lines vertically and 1 pixel (16 bits) for densisty. The
image data format is as shown in figure XX".
In Figura XX c'e scritto che il file da 51200 bytes contiene prima la prima
riga e in fondo la riga 100.
La faccenda si fa perň molto fosca.
Dopo una settimanina mi hanno finalmente risposto i giapponesi che hanno
prodotto lo strumento. Gli ho mandato il serial number e mi hanno rispedito
indietro un programmino che dicevano essere corredato allo strumento. dopo
aver trovato un pc col dos 6.2 e win 3.11 (perchč a 16 bit) lěho fatto
girare e lě le immagini e i dati saltavano fuori che era una bellezza...
Ho esportato le immagini in formato .tif (che č l'unico sopportato) e mi
sono spostato su una macchina recente (win2k) e magia delle magie...
utilizzando un programma che gestisce uno scanner HP l'immagine si vede,
utilizzando explorer o altri programmi si vede un bel quadrato di pixel
colorati a caso *in toni di grigio in entrambi i casi*.
Non capisco piů nulla...
Pelo

 riga e in fondo la riga 100.
Uhm....
Ma il codice che ho postato lo hai utilizzato?


 Ma il codice che ho postato lo hai utilizzato?
Parto ora.
Avevo il PC occupato da una simulazione.
Ciauuuu

 Avevo il PC occupato da una simulazione.
Ecco che le immagini appaiono! Ma: perchè sembra che ci sia una rete
appoggiata sopra?
Immagino dipenda dalla dimensione dei pixels...
ORa non mi resta che esportarle in qualche formato compatibile...
Grazie mille
Pelo