Bitmap en binaire

Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007 - 12 mars 2007 à 09:05
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007 - 22 mars 2007 à 15:54
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

Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
12 mars 2007 à 09:23
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
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 09:40
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# 
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
12 mars 2007 à 10:08
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()
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 mars 2007 à 10:17
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 mars 2007 à 10:46
Captain_Bomber, ferme le flux : PictureStream.Close( );
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
12 mars 2007 à 11:14
Aaaaahh... ces Stream qui se ferment pas automatiquement!!!

Thanks Lutinore et MorpionMx
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 11:33
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# 
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
19 mars 2007 à 13:34
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();
                }
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
20 mars 2007 à 13:04
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?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 mars 2007 à 12:05
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 !??
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
22 mars 2007 à 09:06
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 ??
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
22 mars 2007 à 12:39
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.
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
22 mars 2007 à 13:04
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
0
Captain_Bomber Messages postés 36 Date d'inscription lundi 4 septembre 2006 Statut Membre Dernière intervention 4 mai 2007
22 mars 2007 à 15:54
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.
0
Rejoignez-nous