Modifier périodiquement (25 fps) l'image dans une pictureBox

Résolu
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,

Je travaille actuellement sur des caméra AXIS qui fournissent un flux mjpg.
J'arrive à récupérer chaque fichier JPEG de ce flux et les ecrirent distinctement dans des fichiers.
Maintenant, j'aimerai en plus de les sauvegarder de pouvoir les visualiser dans une meme pictureBox (ou autre) pour voir la video depuis mon application.
J'ai parcouru le forum et j'ai trouvé des indications que je n'arrive pas à employer.
Je lis les image caractere par caractere afin de chercher le début et la fin de l'image dans le flux. Ensuite j'ecris chaque caractere dans un fichier. En plus de celà, je les place dans une ArrayList car je ne connais pas la taille de l'image à l'avance.



WebRequest myRequest;

StreamReader streamRead =
null;

FileStream fs;

StreamWriter ecrire;

Encoding encoding = System.Text.
Encoding.GetEncoding(
"iso-8859-1");

Stream myStream;

WebResponse myResponse;

char forallMASK =
Convert.ToChar(255);
//OxFF
char InitImgMASK =
Convert.ToChar(216);
//OxD8
char EndImgMASK =
Convert.ToChar(217);
//OxD9
char first =
Convert.ToChar(0);

char[] second =
new
char[1];

ArrayList myAL =
new
ArrayList();
myRequest = System.Net.
WebRequest.Create(IP);
myRequest.Credentials =
new System.Net.
NetworkCredential(User, Pass);
myResponse = myRequest.GetResponse();
myStream = myResponse.GetResponseStream();
streamRead =
new System.IO.
StreamReader(myStream, encoding);
fs =
new System.IO.
FileStream(path, System.IO.
FileMode.OpenOrCreate, System.IO.
FileAccess.Write);
ecrire =
new System.IO.
StreamWriter(fs, encoding);

while ((first.CompareTo(forallMASK) != 0) || (second[0].CompareTo(InitImgMASK) != 0))
{
first = second[0];
streamRead.Read(second, 0, 1);
}

while ((first.CompareTo(forallMASK) != 0) || (second[0].CompareTo(EndImgMASK) != 0))
{
ecrire.Write(first);
myAL.Add(first);
first = second[0];
streamRead.Read(second, 0, 1);
}
ecrire.Write(first);
myAL.Add(first);
ecrire.Write(second);
myAL.Add(second);
ecrire.Close();
fs.Close();
streamRead.Close();
myStream.Close();

A la fin de la réception d'une image, je me retrouve avec un fichier .jpg sauvegardé et une ArrayList en mémoire.
Je voudrais depuis les caractere contenu dans l'ArrayList cree mon image.
Depuis un MemoryStream je peux afficher l'image grace à un tableau de Byte[ ](image):


MemoryStream myMS =
new
MemoryStream(image);
pictureBox1.Image =
Image.FromStream(myMS);

Malheureusement, mon ArrayList (myAL) est rempli de Char. Je dois donc convertir chaque Char en Byte:


Array imageA = myAL.ToArray();

char[] imageB =
new
char[imageA.Length];

byte[] image =
new
byte[imageA.Length];

for (
int i = 0; i < imageA.Length-1; i++)
{
imageB[i] = (
char)imageA.GetValue(i);

}
image = System.Text.
ASCIIEncoding.UTF8.GetBytes(imageB, 0, imageA.Length - 1);

Ici, image est donc un tableau de bytes.

Mais ca marche pas
il me dit que mon myMS lors de l'appel à Image.FromStream(myMS); n'est pas valide.

Ca fait un moment que je me triture l'esprit mais là j'ai besoin d'aide.

Merci

f.colo

4 réponses

Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
OK, j'ai trouvé comment faire.
Lorsque je convertissais mon tableau de char[] en tableau de byte[], je ne respectais pas l'encodage que je me servais lors de la lecture du stream.

Dans ma fonction private byte[] getByteArrayList(ArrayList myAL) [le dernier code donné dans mon premier message), il faut remplasser la ligne

image = System.Text.ASCIIEncoding.UTF8.GetBytes(imageB, 0, imageA.Length - 1);
par

encoding.GetBytes(imageB, 0, imageB.Length, image, 0);
et se servir de ce tableau de byte[] pou le MemoryStream.

Voila.

f.colo
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut..

Pourquoi tu utilises cette expression "imageA.Length-1" au lieu de "imageA.Length" ?
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Je fais une boucle:
for (
int i = 0; i < imageA.Length-1; i++)
{
imageB[i] = (
char)imageA.GetValue(i);

}
de 0 jusqu'a
imageA.Length-1 pour avoir mes imageA.Length éléments, c'est un tableau a valeur initiale en zéro.
J'avais fait l'erreur au début et j'avais une erreur, pas un buffer overflow mais comme quoi imageB[i] ne pouvait pas prendre une valeur infini.

f.colo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Oula, je suis pas en forme de bon matin ...
Donc oui, tu as raison, il faudrais bien imageA.lengt mais il m'avait fait l'erreur decrite plus haut et j'ai pas réfléchie plus loin ..
Je ne l'ai toujours pas résolu, j'essais de faire plus simple deja, n'afficher que la premiere image, pas le flux, on verra ce que ca donne.

f.colo