J'ai un ActiveX de capture de flux vidéo.
Cet ActiveX possède une fonction getCurrentImage() définie comme ceci:
void AxAxisMediaControl.GetCurrentImage(int theFormat, out object theBuffer, out int theBufferSize)
Dans la doc technique, je n'ai que que les information suivante:
----------------------------------------------------------------------------------------------------
GetCurrentImage(ByVal theFormat As Integer, [Visual Basic]
ByRef theBuffer As Variant,
ByRef theBufferSize As Long
)
Parameters
* : theFormat
Identifier specifiying the format of the image data. Valuesavailable are: 0JPEG, 1 BMP
* : theBuffer
The buffer where the image data is returned.
* : theBufferSize
<dd class="paradesc">Size of the image data buffer returned.
----------------------------------------------------------------------------------------------------
Actuellement, j'arrive à utiliser la fonction:
object theBuffer;
int theSize;
this.axAxisMediaControl1.GetCurrentImage(0,out theBuffer, out theSize);
et dans le débugger, je retrouve bien dans theBuffer un les octet d'une image JPEG ({Dimensions:[0x00000001..0x00006007]}.
Maintenant, j'aimerai transformer cet object avec image mais je n'y arrive pas, j'ai essayé de passer par un memoryStream en castant l'object en byte[], avec une boucle for pur essayer de récupérer octet par octet les valeurs mais rien n'y fait.
Avez vous une solution pour récupérer une image contenu dans un objet ?
Je dis peu être une bêtise mais dans un précédent projet, j'avais récuperer une image dans une picture box. Mais je ne sais pas si c'est ce que tu veu. Et puis je l'aivais fait en VB6!
Merci de ton aide mais désolé, dans mon cas je voudrais récupérer une image depuis un object contenant les octets de l'image puis l'afficher dans un pictureBox.
Directement, il ne veut pas car il demande de d'abord caster l'objet.
Ensuite, j'ai mis un try/catch en castant l'object en Image et avec un mesageBox qui affiche l'erreur.
L'erreur est:
enable to cast object of type 'System.Byte[*]' to type 'System.Drawing.Image'
Donc déjà je sais que l'object est du type System.Byte[*] mais comment m'en servir??
en gros le HRESULT (si je ne me trompe pas) est le handle de ton image, ca devrait le faire mais pomper pas mal de ressources....enfin deja en attendant une solution plus optimisée ca doit au moins en donner une fonctionnelle....
Si je fais:
byte[ ] buffer = ( byte[ ] )theBuffer;
ca me donne
enable to cast object of type 'System.Byte[*]' to type ' System.Byte[]'
------------------
Pour le Image.FromHBitmap je ne peux pas l'appliquer comme tu le préconise car le résultat de la fonction GetCurrentImage est donnée en référence pour l'attribut out.
Mais j'ai essayé comme ceci:
this.pictureBox1.Image = Image.FromHbitmap((IntPtr)theBuffer);
Mais ca me dit que le cast n'est pas valide.
object theBuffer;
int theSize;
this.axAxisMediaControl1.GetCurrentImage(0, out theBuffer, out theSize);
Byte[] buff = new Byte[theSize];
int i = 0;
foreach (byte b in theBuffer as Array)
{
buff[i] = b;
i++;
}
this.pictureBox1.Image = new Bitmap(new MemoryStream(buff));
buff=null;
theBuffer = null;
J'appelle cette fonction chaque foi que l'ActiveX reçoit une image et ca prend trop de temps et je n'ai pas le temps d'afficher l'image dans la pictureBox qu'il y en a une autre arrivée.
Deplus, ca me prend 100% du CPU et j'ai la mémoire système qui augmente linéaiement ( je passe de 300Mo à 1Go de mémoire occupée en 5 secondes ...).
Je pense qu'il doit y avoir une solution plus rapide de convertir un object en tableau de byte.
Oui, en C#, le variant du VB est traduit par un objet.
Mais je ne sais pas quoi faire apres avec cet objet.
Il est bien rempli du tableau d'octet de l'image (quand je regarde avec le débugueur avant que ca plante) mais je n'arrive pas a la convertir:
J'aimerai le caster en byte[] car ensuite je voudrais utiliser new Bitmap(new memorystream( byte[]) ) mais je ne suis pas contre une autre facon de faire pour récupérer l'image jpeg depuis cet object.
Le probleme n'est pas d'utiliser la fonction de l'activeX mais de convertir cet object en image.