Convertir un object contennant une image JPEG en image

Signaler
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
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:
----------------------------------------------------------------------------------------------------

Syntax

HRESULT GetCurrentImage(int theFormat, [C++]
VARIANT* theBuffer,
LONG* theBufferSize
);

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: 0 JPEG, 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 ?

f.colo

16 réponses

Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

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!

Woot
Alias Wouter Tjon.
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
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.

f.colo
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Est-ce que tu as essayé de la passer directement ton object dans la picture box?

Woot
Alias Wouter Tjon.
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
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
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

N'y a-t-il pas une propriété dans ta pictureBox Qu'il faudrai changer?

Woot
Alias Wouter Tjon.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Ca donne quoi si tu castes ton objet en tableau de byte ??

byte

[ ] buffer = ( byte[ ] )theBuffer;
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
essaie Image MonJPG = Image.FromHBitmap(GetCurrentImage (...) );

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....
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
HRESULT c'est un code d'erreur, pas un handle..
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
erf.....dc jai dis une grosse connerie....
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
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.

f.colo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Quelqu'un sait ce qu'est le type 'System.Byte[*]' ???

f.colo
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Bon je tente quelque chose, mais je suis pas sûr du tout.
Est-ce que ce ne serait pas un entier non-signé?(unsigned int)

Woot
Alias Wouter Tjon.
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
C'est un tableau d'octet, une suite d'octet (0à255) comme ça:
00000000:
FF D8FF FE00 0F
0A 00 01 3D 04 0C 06 00 40 8C ÿØÿþ.....=....@Œ

00000010:
6B 44 0A FF FE00 0F
0A 01 44 85 AD 83 1E 02 C1 kD.ÿþ....D…­ƒ..Á

00000020:
BA 63 10 00 FF DB00 43
00 10 0B 0C 0E 0C 0A 10 ºc..ÿÛ.C........

00000030:
0E 0D 0E 12 11 10 13 18 27 19 18 16 16 18 30 22 ........'.....0"

00000040:
24 1C 27 39 32 3C 3B 38 32 37 36 3F 47 5A 4C 3F $.'92<;8276?GZL?

00000050:
43 55 44 36 37 4E 6B 4F 55 5D 60 65 66 65 3D 4B CUD67NkOU]`efe=K

00000060:
6F 77 6E 62 76 5A 63 65 61 FF
DB00
43 01 11 12
ownbvZceaÿÛ.C...

00000070:
12 18 15 18 2E 19 19 2E 61 41 37 41 61 61 61 61 ........aA7Aaaaa

00000080:
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa

00000090:
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa

000000A0:
61 61 61 61 61 61 61 61 61 61 61 61 61 61 FF
C0 aaaaaaaaaaaaaaÿÀ

C'est le code d'une image JPEG.

f.colo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
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.

f.colo
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Quand on regarde la doc (si je me suis pas planté de doc), on a un exemple en VB

<hr />Dim b As Variant<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>

Dim Size As Variant

Dim a() As Byte

Call CamImage1.GetCurrentImage(b, Size)

a() = b

Open "C:/Test.jpg" For Binary Access Write As #1

Put #1, , a()

Close #1

<hr />
Doit bien y avoir moyen d'en faire qqchose non ?

http://www.markmaker.co.uk/AxisCamControl.doc

Mx
MVP C# 
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
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.

f.colo