Convertir un object contennant une image JPEG en image
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
7 juin 2006 à 11:04
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
8 juin 2006 à 14:53
Bonjour,
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 ?
woot6768
Messages postés393Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention23 mars 2007 7 juin 2006 à 11:13
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!
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 7 juin 2006 à 11:24
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.
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 7 juin 2006 à 11:39
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??
f.colo
Vous n’avez pas trouvé la réponse que vous recherchez ?
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....
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 7 juin 2006 à 14:14
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.
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 7 juin 2006 à 15:14
Pour le moment j'en suis à ça:
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.
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 20072 8 juin 2006 à 14:53
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.