Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Copiare array senza uso di Marshal
Forum - C# / VB.NET - Copiare array senza uso di Marshal

Avatar
julius (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/06/2015

Segnala al moderatore
Postato alle 17:37
Giovedì, 25/06/2015
Ciao a tutti,
avrei dei chiarimenti da sottoporvi, ho un dispositivo (telecamera) che attraverso una callback mi passa un indirizzo ad un puntatore di memoria e una dimensione del buffer. Ora per poter utilizzare questi dati sono costretto (per quanto ne so io) ad utilizzare Marshal, ma questo comporta un certo dispendio di tempo e un impegno non trascurabile da parte della cpu. Vorrei sapere se e esistono dei metodi e, se potete indicarmi esempi in merito, che mi permettano di eseguire una copià in modo più rapido.
la dimensione dell'array da copiare è di 1280*1024*3 quindi 3.932.160 byte
Codice sorgente - presumibilmente VB.NET

  1. Public mCamBuf() As Byte 'buffer pubblico dei dati raw
  2. Public mCameraLiveBitmap As Image 'immagine pubblica da utilizzare nel programma
  3.  
  4. Public Function MyCallbackFunc(ByVal pBuf As IntPtr, ByVal lBufferSize As Integer) As Integer
  5.  
  6.         'ridimensiono l'array
  7.         ReDim mCamBuf(lBufferSize)
  8.  
  9.         'copio i dati dalla memoria non gestita
  10.         Marshal.Copy(pBuf, mCamBuf, 0, lBufferSize)
  11.  
  12.         'creo una nuova bitmap
  13.         Dim CameraLiveBitmap As Bitmap = New Bitmap(1280, 1024)
  14.  
  15.         'blocco i bit
  16.         Dim bData As Imaging.BitmapData = CameraLiveBitmap.LockBits(New Rectangle(0, 0, 1280, 1024), _
  17.                                           Imaging.ImageLockMode.WriteOnly, Imaging.PixelFormat.Format24bppRgb)
  18.  
  19.         'copia i valoi rgb nella bitmap
  20.         Marshal.Copy(mCamBuf, 0, bData.Scan0, mCamBufLen)
  21.  
  22.         'sblocco i bit
  23.         CameraLiveBitmap.UnlockBits(bData)
  24.  
  25.         mCameraLiveBitmap = CameraLiveBitmap
  26.     Return 1


Ultima modifica effettuata da julius il 25/06/2015 alle 17:55
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:23
Giovedì, 25/06/2015
Non puoi saltare il marshalling, ma il problema di performance non è nel Marshal.Copy, ma in tutto il resto!

Non ridimensionare l'array, siccome le dimensioni non cambiano! (Elimina redim)

Perchè fai due Marshal.Copy? Ne basta uno.

Non creare una nuova Bitmap ad ogni chiamata, usa direttamente la Bitmap esistente.


Il mio blog: https://piero.dev
PM Quote
Avatar
julius (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/06/2015

Segnala al moderatore
Postato alle 23:23
Giovedì, 25/06/2015
innanzitutto grazie per la risposta.
proverò appena possibile a eliminare il redim in effetti l'immagine ha sempre le stesse dimensioni per via delle impostazioni fisse della telecamera.
il doppio marshal lo avrei evitato volentieri ma da esempi che ho trovato pare sia l'unico modo per poi ottenere un'immagine.

PM Quote
Avatar
taly (Normal User)
Newbie


Messaggi: 7
Iscritto: 01/10/2018

Segnala al moderatore
Postato alle 18:14
Lunedì, 01/10/2018
Buongiorno Julius ti volevo chiedere, sempre che non sia un disturbo, come hai risolto il problema menzionato riguardo la gestione della telecamera. Io possiedo una telecamera 1391x1039 progressiva gestita da una DLL esterna che per mezzo di una chiamata API mi passa un indirizzo ad un puntatore di memoria al buffer 16bit.
vorrei convertire questi dati in colore e immagine da trasferire su un PictureBox. Saluti Grazie

PM Quote