PDA

Visualizza la versione completa : [C++] Conversione di una immagine in un array di bytes


SkyNET290897
07-08-2018, 22:30
Ciao, come da oggetto, come posso convertire un file immagine in un array di bytes? Grazie.

linoma
08-08-2018, 10:23
Normalmene un file immagine contiene i colori già in bytes preceduti da un header. Poi ovviamente dipende da formato del file. Se posti qualche info in più magari ti si può dare un mano.

oregon
08-08-2018, 10:35
Ciao, come da oggetto, come posso convertire un file immagine in un array di bytes? Grazie.

Oltretutto, se lavori con Windows potrebbero essere sufficienti delle API già esistenti. Bisogna saperne di più sulla questione ovviamente.

SkyNET290897
08-08-2018, 11:50
La situazione è questa, l'ambiente di sviluppo è l'Arduino Create (quindi linguaggio C++), la piattaforma è una scheda UP Squared.
In sostanza vorrei realizzare lo streaming remoto da una webcam connessa alla board e le immagini (i singoli frame) vengono catturati tramite l'uso della libreria OpenCV.

Le immagini sono in formato "Mat" e quello che vorrei fare è convertirle in bytes per inviarle all'applicazione client scritta in Visual C# che lavora su una macchina Windows 10.

Avevo fatto una cosa analoga in Visual C# dove il server era presente su una macchina Windows ed inviava l'immagine come un array di bytes ai client presenti sia su macchine Windows che Android.

Nello specifico, sul server Visual C# utilizzavo questa sintassi:



// Conversione da immagine a byte
MemoryStream ms = new MemoryStream();
immagineWebCam.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] immBytes = ms.ToArray();

Grazie.

oregon
08-08-2018, 12:10
Beh, erano informazioni da dare subito, non pensi ...?

Con queste due funzioni dovrebbe andare la conversione nei due sensi


byte* matToBytes(Mat image)
{
int size = image.total()* image.elemSize();
byte* bytes =newbyte[size];
std::memcpy(bytes,image.data,size *sizeof(byte));
}

Mat bytesToMat(byte* bytes,int width,int height)
{
Mat image =Mat(height,width,CV_8UC3,bytes).clone();
return image;
}

ma devi pensare tu a convertire in C# la parte in ricezione. Mi sembra scontato che non potrai utilizzare il codice per il Jpeg ma dovrai utilizzare OpenCV anche lato C# dato che l'immagine è di tipo trattato da quella libreria.

SkyNET290897
08-08-2018, 13:53
Grazie per la risposta.

Lato client utilizzo questa sintassi.



int bytesRec = client.Receive(bytes); // Ricezione della risposta da parte del server

// Ricevo l'immagine e la stampo nella pictureBox
MemoryStream ms = new MemoryStream(bytes);
System.Drawing.Image bytesImm = System.Drawing.Image.FromStream(ms);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = bytesImm;

Loading