Bitmap en binaire

Signaler
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007
-
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007
-
Bonjour tout le monde!!!

J'ai un ch'tit problème là: Je dois faire une appli client-serveur qui permet de dessiner des formes sur une picturebox et qui affiche le même dessin sur chaque client (pas bien méchant quoi...)

Problème: Comment créer un tableau byte transmissible sur un NetworkStream à partir de PictureBox.Image ou à partir du fichier .bmp???

Et aussi: Quand je veux charger le fichier Bitmap pour PictureBox.Image, il me dit "Mémoire insufisante ?! alors que l'image fait 4.0k!
Pourquoi?

Merci d'avance pour votre aide!

14 réponses

Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Désolé pour la mise en page,  je viens de m'apercevoir que Opera ne prends pas en charge la TextBox évoluée...

Vive FireFox
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Salut,

Tu peux procéder ainsi :

<hr />private
static
byte[] GetBytes(
Bitmap bmp)
{

   using (
MemoryStream ms =
new
MemoryStream())
   {
      bmp.Save(ms,
ImageFormat.Jpeg);

      byte[] bytes = ms.GetBuffer();

      return bytes;
   }
}
<hr />
Pour ton probleme de "mémoire insuffisante", je pense qu'il va nous falloir un bout de code (et l'erreur complete) pour qu'on puisse t'aider

Mx
MVP C# 
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Ok le GetBytes va bien, merci!!

Pour la mémoire, voilà le code:
<hr size="2" width="100%" />PictureStream = new FileStream("./Screen.Bmp", FileMode.Create);

//Enregistre le dessin sous forme d'image .Bmp
Bitmap myBmp = new Bitmap(pictureBox1.Image);
myBmp.Save(PictureStream,System.Drawing.Imaging.ImageFormat.Bmp);

/Applique l'image dans la PictureBox
pictureBox1.Image = Image.FromFile("./Screen.bmp");
<hr size="2" width="100%" />Et l'erreur:

L'exception System.OutOfMemoryException n'a pas été gérée
  Message="Mémoire insuffisante."
  Source="System.Drawing"
  StackTrace:
       à System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
       à System.Drawing.Image.FromFile(String filename)
       à TableauClient.Form1.pictureBox1_MouseUp(Object sender, MouseEventArgs e) dans C:\Documents and Settings\cp-04cda\Bureau\TIP\TableauClient\TableauClient\Form1.cs:ligne 188
       à System.Windows.Forms.Control.OnMouseUp(MouseEventArgs e)
       à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       à System.Windows.Forms.Control.WndProc(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.Run(Form mainForm)
       à TableauClient.Program.Main() dans C:\Documents and Settings\cp-04cda\Bureau\TIP\TableauClient\TableauClient\Program.cs:ligne 17
       à System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       à System.Threading.ThreadHelper.ThreadStart()
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Mx, t'as compressé l'image en jpeg  Cela dit ce sera moins lourd à passer par le réseau. On peut aussi faire la même chose avec ImageLock + Marshal.Copy.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Captain_Bomber, ferme le flux : PictureStream.Close( );
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Aaaaahh... ces Stream qui se ferment pas automatiquement!!!

Thanks Lutinore et MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Mince j'ai pas fait attention pour le jpeg, j'ai copié-collé une méthode que j'avais qquepart dans mes sources ^^

Mx
MVP C# 
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Et.. j'ai encore un message d'erreur
J'utilise une image récupérée depuis le réseau, et
stockée dans un .Jpeg, comme PictureBox.Image.
Mais le code bloque sur cette ligne et me remet un
/&ç%* de message "Mémoire Insuffisante...", alors que
tous les FileStream sont fermés. (l'image pèse 47.8Ko)

voilà le code:

<hr size="2" width="100%" />StringBuilder mystring = new StringBuilder();
            byte[] Buffer = new byte[50000];
            PictureStream = new FileStream("./ScreenR.Jpeg", FileMode.Create);
            if (frm2.MyStream.CanRead)
            {
                //Lecture des données du NetworkStream
                frm2.MyStream.Read(Buffer, 0, Buffer.Length);
                int nbBytesLus = frm2.MyStream.Read(Buffer, 0, Buffer.Length);
                mystring.AppendFormat("{0}", Encoding.ASCII.GetString(Buffer, 0, 10));
                //Si c'est un message de déconnexion:
                if (mystring.ToString() == "Disconnect")
                {
                    frm2.Deconnexion();
                }
                //Si c'est une image
                else
                {
                    //On l'enregistre
                    PictureStream.Write(Buffer, 0, nbBytesLus);
                    PictureStream.Flush();
                    PictureStream.Close();
                    //Et on l'applique
                    pictureBox1.Image.Dispose();
                    Et c'est là que ça couille
                    pictureBox1.Image = Image.FromFile("./ScreenR.Jpeg");
                    pictureBox1.Refresh();
                }
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Pourtant, l'image envoyée par le serveur arrive
correctement sur le client, et elle est entière...
Mais pour l'utiliser : bah non, y veux pas!

Personne ne peux m'aider?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Tu veux dire que ton client recoit bien l'image, qu'elle est entière, on peut l'ouvrir avec Paint par exemple mais pas avec la PictureBox !??
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Non en fait, elle n'était même pas ouvrable avec paint.
Mais j'ai résolu le problème ce matin : Le serveur ne remplissait pas correctement le buffer qu'il envoyait au client, d'où une image inutilisable.
Et en plus le client prenait les données du Stream, et le refesait encore
une fois alors que le flux était vide (une ligne en double ).

En revanche, l'image envoyée par le client est composée
de formes diverses (lignes, droites et rectangles) sur un fond blanc.
Et l'image que je reçoit (et que j'utilise) à bien les mêmes formes,
mais le fond est noir.
D'où cela vient-il?
Est-ce à cause des valeurs de l'image, genre le blanc vaut 0 dans le dessin, mais quand le programme en fait un .Jpeg, 0 noir et 255 blanc ??
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Peut être une valeur alpha qui ne peut pas être gardée dans le jpeg ou le buffer n'est toujours pas correctement remplie et les pixels sont décalés.
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

J'ai déja revu plusieurs fois l'utilisation et le remplissage des buffers,
donc ça m'étonnerais que ce soit ça...
Mais le coup des alpha, c'est possible... je vais voir ce que je trouve
Messages postés
36
Date d'inscription
lundi 4 septembre 2006
Statut
Membre
Dernière intervention
4 mai 2007

Oh punaise!!
Finalement j'vais m'simplifier la vie:
je vais transmettre les formes du dessin sous
forme d'objets avec leurs coordonnées, Pen, etc..
En plus, ça me permettera de sélectionner les formes
et de les retravailler par la suite...

Merci à tous, eeeet....  non, rien.