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

Ciao a tutti,
ho una funzione di una libreria che restituisce uno stream che contiene
un'immagine ...
non riesco a capire come e come ottenere l'immagine che ho nello stream
passatomi dalla libreria.
potete aiutarmi ?
Filippo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 potete aiutarmi ?
Come stream intendi ADODB.Stream?
C'č un metodo myStream.SaveToFile in tal caso.

 passatomi dalla libreria.
Assegnandola con l'= non funziona?
MyPicture = MyStream.Read
Ne ha parlato Rafunk 2 giorni fa nel post "Convertire un oggetto StdPicture 
in uno stream di Byte.", vedi se funziona.
Ciao 


Non credo ... uso ADO v. 2.8 (per usare gli stream, ma uso la variabile
Stream senza l'ausiliodi ADO.
Grazie
Ps. Se leggi la risposta che sto' per dare a Fabio ... capirai meglio !



Il mio problema e' capire come istanziare la funzione della dll ... mi
spiego meglio ...
La libreria dinamica (creata da me' in Delphi 7) si occupa di trasformare
dei bmp in diversi formati (Jpg, Tiff, Tiff G4, etc).
Finche' lavoro nello stesso ambiente (Delphi) non ho problemi di "passare"
l'immagine nello stream, in quanto dichiaro lo stream stesso come variabile
da passare ... ma in VB non so' come dichiarare la funzione esemp.
In delphi :
Function OutputStream(RetImg:Stream; LenBuff:integer):Integer
In VB dovrebbe essere:
Private Declare Function OutputStream Lib "Miadll.dll" (ByVal as Stream,
LenBuff as Long) as Long
secondo te' e' corretta ?
Comunque Ci provero' e vi faro' sapere ...
Il mio problem



No, VB non conosce nessuna classe di tipo stream, non che sia comune a 
quella usata da Delphi per lo meno.
Puoi provare a passare anzichč Stream un bel byte[], e da VB, se non ricordo 
male fai
Private Declare Function OutputStream Lib "Miadll.dll" (Data as Byte, 
LenBuff as Long) as Long
e gli passi il primo byte che essendo byref verrą usato come indirizzo 
iniziale del buffer.
Call OutputStream(Immagine(0), Ubound(Immagine) + 1)
Ciao 

 Call OutputStream(Immagine(0), Ubound(Immagine) + 1)
a cosa mi serve ? (scusa la domanda stupida) e Immagine a cosa si riferisce
?
Grazie ancora !


 riferisce ?
All'array di byte che sarebbe contenuto dallo stream.
Non so se funziona, è una prova, tra l'altro non ho ben capito a cosa serve 
a te.
Ciao 


Ciao Fabio,
sono ad un passo dalla soluzione, appena terminato, mettero' tutto on-line
per rendere partecipe tutto il NG.
Pero' prima volevo chiederti un'altra cosa, per poter riempire il mio array
di byte , l'ho dovuto dichiarare con un tot' di byte
Dim Mybuffer (0 to 6000000) as byte ' **** circa 6MB per essere sicuro
Dim Lenbuffer as Long '***** per sapere la dimensione dell'immagine
Chiamando la dll con - Call OutputStream(Mybuffer(0), lenbuffer)
ottengo sia il riempimento del buffer sia la lunghezza .
Dopo aver usato gli Stream (con ADO 2.8 ... si puo') ed aver copiato il
contenuto del
e salvato su file ... ottengo un file di 6 MB !!!!
E' normale, in quanto viene salvato su disco l'intero buffer ... allora la
mia domanda e'
COME POSSO RIDIMENSIONARE IL BUFFER ?
La soluzione l'ho trovata riallocando un altro buffer con la dimensione dell
lunghezza che ho ricevuto, e poi ho richiamato ancora la funzione per far
riempire il nuovo buffer ... pero' capirai che non e' il massimo della
programmazione !
A presto
Filippo


 programmazione !
Vediamo se ho capito.
Fai cosě:
Dim buffer() as byte
...
' c'č modo di sapere quanto c'č nello stream?
' io non lo conosco, poniamo una cosa del genere
Redim buffer(0 to stream.Length)
' Non c'č modo?
' Allora nel loop dove pigli i vari pezzi del buffer
Redim Preserve buffer(0 to newSize)
dove newSize č quanto hai letto fino alla fine del contenuto dello stream.
Ciao 


Il tuo ragionamento non fa' una "grinfia" .. ho pero' un piccolo problema
devo allocare il mio buffer
prima (Dim mybuffer (0 to 6000000) as byte ) xche' la dll va' a scrivere su
un buffer che deve essere per forza dimensionato ... altrimenti dove scrive
?
Percio' mi ritrovo al punto di partenza !
Ciao


 Percio' mi ritrovo al punto di partenza !
Capito :)
Puoi fare
1) una funzione in più che ti dice quanto dev'essere grande il buffer.
Dim buffer() as byte ' NON indicare qui la dimensione!
...
count = OutputStreamLength()
Redim buffer(0 to count - 1)
Call OutputStream(Immagine(0), count) ' ma il parametro count qui a che 
serve?
2) passare il buffer dimensionato a 6mb e ridurlo poi
Dim buffer() as byte ' NON indicare qui la dimensione!
...
Redim buffer(0 to 6000000)
count = OutputStream(Immagine(0), Ubound(Immagine) + 1)
Redim preserve buffer(0 to count - 1)
Ciao 

Fabio,
facciamo cosi' ... ti scrivo il codice del programmino (sono proprio due
righe) cosi' capisci meglio ;-)
Private Declare Function OutputStream Lib "ImgTools.dll" (ByRef ImgStream As
Byte, ByRef Numero As Long) As Long
Private Sub Command1_Click()
Dim mystream As Stream
Dim mybuffer(0 To 6291456) As Byte ' fittizzio a 6MB .. riempito da Imgtools
Dim LenBuffer As Long ' Lunghezza restituita da ImgTools
'Chiamo funzione e ricevo byte +lunghezza immagine
Call OutputStream(mybuffer(0), LenBuffer)
'istanzio stream
Set mystream = New Stream
mystream.Type = adTypeBinary
'apro
mystream.Open
'scrivo su stream
mystream.Write (mybuffer)
'salvo ...su file
mystream.SaveToFile ".\Campione2.bmp", adSaveCreateOverWrite
mystream.Close
Set mystream = Nothing
End Sub
Ciao
Filippo


 Byte, ByRef Numero As Long) As Long
Lungi da me frustrare chicchessia, eh, ma hai visto freeimage ?
******************
http://freeimage.sourceforge.net/
What is FreeImage?
FreeImage is an Open Source library project for developers who
would like to support popular graphics image formats like PNG,
BMP, JPEG, TIFF and others as needed by today's multimedia
applications. FreeImage is easy to use, fast, multithreading safe,
compatible with all 32-bit versions of Windows, and cross-platform
(works both with Linux and Mac OS X).
******************
Bye, G. 

 capito di cosa stiamo parlando ?
Penso, credo, spero, di sì. Altrimenti spiegami, che a capire meglio
faccio sempre in tempo :-).
Bye, G. 

 Lungi da me frustrare chicchessia, eh, ma hai visto freeimage ?
Non mi hai frustrato affatto :-)
Vedi Paperino ... io ci lavoro in questo settore, e non posso usare elementi
di altri ... io sono pagato anche per fare quei tipo di librerie che tu hai
citato.
Il mio problema e' dato solo da Visual Basic, xche' in altri linguaggi un
po' piu' evoluti (non sto' parlando di 
VB.NET
 o Visual Studio 2005) il
problema lo avrei risolto da solo ;-)
Siccome ho realizzato la libreria (che tu hai riportato quotata), sto'
cercando informazioni per sviluppare dei piccoli esempi (anche in VB) da
distribuire chi vorra' utilzzare la libreria ... e siccome non sono un
programmatore VB (lo conosco ma non e' il mio pane quotidiano) mi sto
avvalendo della gentilezza di Fabio (che ringrazio ancora) per poter
realizzare un demo.
Dato che "lunge da te' frustrare" ... lunge da me offenderti ... ma hai
capito di cosa stiamo parlando ?
Ciao
