Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDernière intervention 4 mai 2007
-
12 mars 2007 à 09:05
Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDerniè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?
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
Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDerniè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()
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDerniè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();
}
Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDerniè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 ??
Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDerniè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
Captain_Bomber
Messages postés36Date d'inscriptionlundi 4 septembre 2006StatutMembreDerniè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...