PDA

View Full Version : [C#] Inviare serie di oggetti bitmap client/server


Honik
04-05-2010, 23:23
Salve a tutti.. avrei la necessità di inviare tramite TCP tra client e server una serie in successione di immagini Bitmap..questi oggetti Bitmap mi vengono fornite direttamente dalla webcam (quindi con una certa velocità di creazione dei singoli frames)..Avrei la necessità di mantenere una velocità tale da consentire una certa fluidità dell'immagine!!
Al momento invio le immagini ma risultano molto "LENTE".. ho modo di velocizzare il tutto?? mi è stato detto di inserire n elementi bitmap in coda e poi inviarle tutte in successione ma sinceramente lo trovo molto lento ugualmente!!
ho altre possibilità?
grazie

nuovoUtente86
04-05-2010, 23:41
dovresti utilizzare un protocollo di trasporto più leggero come l' RTP che opera in real-time su udp offrendo servizi di controllo aggiuntivi

!k-0t1c!
05-05-2010, 08:37
"Off the top of my head" direi che potresti salvare ogni immagine in un direttamente compressa sul NetworkStream su cui stai operando.
Ovviamente se la risoluzione è qualcosa di decente avrai ancora un flusso lento (oltre a un consumo di CPU piuttosto elevato, a seconda del framerate) ma se vuoi qualcosa di meglio devi comprimere e decomprimere in maniera differenziale, e dalla domanda che hai postato ho il sospetto che la cosa vada un po' oltre il tuo skill set (per ora ;))

Edit: con salvare specifico che intendo usare il metodo Image.Save, non una serializzazione classica tramite binary formatter o simili.

Honik
07-05-2010, 21:22
Avevo trovato in internet metodi di compressione però usavano tutti alla fine Image.Save con conseguente salvataggio su file.. personalmente non devo salvare su file ma inviare via rete.. e questo non so proprio farlo!!
e dopo questa domanda.. in che senso in modo differenziale??

nuovoUtente riguardo all'rtp cosa sai dirmi?

nuovoUtente86
07-05-2010, 22:07
nuovoUtente riguardo all'rtp cosa sai dirmi?

inizia a dare un' occhiata alle specifiche del protocollo, e solo dopo come utilizzarlo per il tuo progetto.

Honik
11-05-2010, 21:53
Ho visto in giro e ho letto qualcosa.. dove potrei trovare un'esempio dove trovo l'invio di bitmap??
Grazie

nikel
14-05-2010, 15:51
io ho appena finito una cosa del genere. via tcp/ip se ti interessa posto il codice ;)

EDIT: non ho letto tutto ma le comprimi prima di inviarle?

Honik
16-05-2010, 12:56
io ho appena finito una cosa del genere. via tcp/ip se ti interessa posto il codice ;)

EDIT: non ho letto tutto ma le comprimi prima di inviarle?

Nikel grazie mille.. posta pure.. sono interessato!!

nikel
16-05-2010, 17:52
allora per inviare dal server tramite socket uso questo.
(in pratica salva l'immagine (comprimendola in png) in un memorystream e poi lo mette in un array di bytes)


byte[] data;
Socket s1;
Bitmap diff;

using (MemoryStream stream = new MemoryStream())
{
diff.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Position = 0;
data = new byte[stream.Length];
stream.Read(data, 0, Convert.ToInt32(stream.Length));
stream.Close();
}
s1.Send(data);


per ricevere e ritrasformare i byte in oggetto bitmap uso questo:


byte[] b = new byte[1000000] //un valore in cui stia l' immagine
Stream stm; //lo stream del tcpclient (lo inizializzi con tuotcplient.getstream)
stm.Read(b,0,1000000);
using (MemoryStream mstream = new MemoryStream(b))
{
screen = new Bitmap(mstream);
}


ecco fatto.

unico accorgimento da prendere è gestire in modo intelligente l'invio delle "bitmap" in modo che non venga inviata la successiva prima che il client sia in grado di riceverla (puoi ad esempio processare l'immagine nel server e attendere una "richiesta del client" per inviarla)

Honik
17-05-2010, 15:29
grazie mille.. ora me lo guardo per bene.. grazie ancora..
ne approfitto per chiederti.. perchè usi la clausola "using" per inizializzare le due variabili??

nikel
17-05-2010, 17:04
semplicemente perchè non essendo utili al di fuori di quella parte di codice

usando using dovrebbe cancellarle automaticamente dalla memoria in modo da liberare risorse ;)

se hai bisogno di spiegazione chiedi pure:D