IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Screenshot et flux


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [C#] Screenshot et flux
    Bonsoir,
    a tous je realiser des screenshots grace a ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
              Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
                Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);
                gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
    bmpScreenshot.Save("img.png", ImageFormat.Png);
    J'aurai voulu savoir comment stocker l'image dans un string afin que je puisse l'envoyer par socket ?

    Merci d'avance,
    Cordialement,
    NeoKript

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tu doit pouvoir l'envoyer en tant que variable image avec .net remoting par socket

    sinon tu peux transformer l'image en tableau d'octets avec .save et la surcharge qui demande un string je crois
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par défaut
    Sinon, tu peux regarder du coté de la classe MemoryStream qui te permet de stocker le flux mémoire d'une image.


    http://msdn.microsoft.com/fr-fr/libr...8VS.95%29.aspx

    La classe System.Drawing.Image à une fonction Save() permettant de stocker l'image dans un MemoryStream.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Bonjour et merci pour vos réponses.

    J'ai essayé ceci d'un côté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private void    ScreenShot(String Destinataire, String Commande, String Elem)
            {
                Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
                Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);
                gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
                MemoryStream m = new MemoryStream();
                bmpScreenshot.Save(m, ImageFormat.Png);
                String content = Convert.ToString(m);
                String packet = Packet.BuildPacket(Destinataire, Commande, content);
                this.PushSend(packet);
            }
    et ce la de l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            private void ScreenShot(String Content)
            {
                try
                {
                    MemoryStream m = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(Content));
                    Bitmap bmp = new Bitmap(m);
                    bmp.Save("C:\\coucou.png");
                }
                catch (Exception e)
                {
                    String test = e.Message;
                }
            }

    Cependant j'ai une exception test vaut
    "Le paramètre n'est pas valide.."
    a cette ligne =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bitmap bmp = new Bitmap(m);
    Si vous avez une idée.
    Merci d'avance.

    Cordialement,
    NeoKript

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    l'erreur vient surement du fait que les octets obtenus et les octets récupérés de l'autre coté ne sont pas les même

    si tu as plus de 8ko à transférer, le socket coupe la trame en plusieurs partie
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    Bonjour,
    Pour un transfert via le réseau en mode texte, passé par un encoding en base 64 peut être une idée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MemoryStream ms = new MemoryStream();
    // Save to memory using the Jpeg format
    bmp.Save (ms, ImageFormat.Jpeg);
    string base64String  = System.Convert.ToBase64String(ms.GetBuffer(),0,ms.GetBuffer().Length

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Concernant la trame elle est complète...

    J'ai un buffer tournant et pour chaque trame, j'envoie la taille du packet en début de packet (codé sur 3 octects).

    Pour l'encodage en base 64 je ne voit pas trop l'intérêt pourrais-tu développer ?


    EDIT ->

    En fait le souci cést que : renvoie
    "System.IO.MemoryStream"
    Merci !

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    J'ai corriger cela maintenant j'ai les bonnes trames avec les bon caractères
    "?PNG\n\t\0\0->" ... etc

    Voici le code ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            private void    ScreenShot(String Destinataire, String Commande, String Elem)
            {
                Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
                Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);
                gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
                DateTime d = DateTime.Now;
                String name = Convert.ToString(d.Year) + "-" + Convert.ToString(d.Month).PadLeft(2, '0') + "-" + Convert.ToString(d.Day).PadLeft(2, '0') + "__" + Convert.ToString(d.Hour).PadLeft(2, '0') + "-" + Convert.ToString(d.Minute).PadLeft(2, '0') + "-" + Convert.ToString(d.Second).PadLeft(2, '0') + ".png";
                MemoryStream m = new MemoryStream();
                bmpScreenshot.Save(m, ImageFormat.Png);
                String content = System.Text.Encoding.ASCII.GetString(m.GetBuffer());
                String packet = Packet.BuildPacket(Destinataire, Commande, content);
                this.PushSend(packet);
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            private void ScreenShot(String Content)
            {
                try
                {
                    MemoryStream m = new MemoryStream((System.Text.Encoding.ASCII.GetBytes(Content)));
                    Bitmap bmp = new Bitmap(m);
                    bmp.Save("C:\\coucou.png");
                }
                catch (Exception e)
                {
                    String test = e.Message;
                }
            }

    Si vous avez une idée ...
    Merci

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    Bonjour,
    Je passais sur le poste et j'ai posté un peu vite sans voir les derniers messages qui sont arrivés pendant ma rédaction

    Je me disais juste qu'une conversion en base 64 permettrait de passer vite fait d'un byte[] en string en étant sur de finir avec quelque chose de facile à envoyer (être sur de n'avoir que des caractères affichables, pas d'octet à zéro...)

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Dac mais le fait d'encoder en base 64 on perd de la place du coup .. non ?

    bon j'ai fait un projet de test et cela ne passe pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
                Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);
                gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
                MemoryStream m = new MemoryStream();
                bmpScreenshot.Save(m, ImageFormat.Png);
                String content = System.Text.Encoding.ASCII.GetString(m.GetBuffer());
                MemoryStream mem = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(content));
                Bitmap t = new Bitmap(mem);
                t.Save("C:\\rtyui.png");
    Ça lance une exception a la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bitmap t = new Bitmap(mem);
    ....

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par défaut
    Attention, tu converti un PNG, peut-être faut-il dire qu'il s'agit d'un PNG lorsque tu recrée ta nouvelle image, non ?

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    J'avais penser a cela mais il n'y a pas de surcharges qui prend en param un ImageFormat ...

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    pas de soucis la dessus, ca se débrouille à regarder dans le stream ce que c'est je pense

    essaie de comparer avant le départ et après l'arrivée le nombre d'octets, le début et la fin pour voir si ca a l'air de concorder

    ou sinon comme j'ai du le dire plus haut, passer par .net remoting permet de faire abstraction du codage du transfert, une propriété as image arrive de l'autre coté as image directement ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par défaut
    Ah oui, il y a ca aussi :

    System..::.ArgumentException sera lancée lorsque :
    stream contains a PNG image file with a single dimension greater than 65,535 pixels.
    http://msdn.microsoft.com/en-us/library/z7ha67kw.aspx

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par alexadvance Voir le message
    Ah oui, il y a ca aussi :

    System..::.ArgumentException sera lancée lorsque :
    stream contains a PNG image file with a single dimension greater than 65,535 pixels.

    http://msdn.microsoft.com/en-us/library/z7ha67kw.aspx
    Ma résolution est 1680x1050 => 1 764 000 pixel ...
    Donc ca ne peut pas être cela.
    JPEG -> Pas mieu

    Citation Envoyé par Pol63 Voir le message
    pas de soucis la dessus, ca se débrouille à regarder dans le stream ce que c'est je pense

    essaie de comparer avant le départ et après l'arrivée le nombre d'octets, le début et la fin pour voir si ca a l'air de concorder

    ou sinon comme j'ai du le dire plus haut, passer par .net remoting permet de faire abstraction du codage du transfert, une propriété as image arrive de l'autre coté as image directement ...
    Le problème c'est que ne pourrai plus utliser mon protocole...

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    Citation Envoyé par NeoKript Voir le message
    Le problème c'est que ne pourrai plus utliser mon protocole...

    c'est bien le but oui, que ca soit microsoft qui code tout à ta place (comme un peu tout dans le framework d'ailleurs)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Oui je sais bien mais je ne m'y connais pas du tout ... moi je suis plus bas niveau d'ordinaire.
    Je ne vois pas comment faire et ca ferais bcp de changement..
    Serveur .. client..

    Surtout que cela ne doit pas être infaisable.
    Au pire, j'enregistre l'image, je l'ouvre j'envoie le ficher .. je le reconstruit de l'autre cote .. mais bon ca m'embête un peu.

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Bon je vais me débrouiller avec les fichiers...

    Cependant il n'y a pas de méthode en C# qui lit un fichier binaire et qui retourne tout sont contenu dans un string ??
    Car je ne vois cette méthode que dans le StreamReader et nom dans le inary reader.

    Merci

  19. #19
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    system.io.file.readalltext
    system.io.file.readallbytes
    etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut a tous et merci pour readallbyte / all text je ne connaissais pas.

    Bon il semblerait que le problème viennent du protocole en fait des que la taille tu paquet dépasse 256 octets je reçois un paquet avec une mauvaise taille.

    Cependant je ne vois pas l'erreur voici comment sont codé mes paquet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
        class Packet
        {
            public static String PacketSize(Int32 Size)
            {
                Char c1 = Convert.ToChar(Size / Convert.ToInt32(Math.Pow(2, 16)));
                Size -= Convert.ToInt32(Math.Pow(2, 16)) * Convert.ToInt32(c1);
                Char c2 = Convert.ToChar(Size / Convert.ToInt32(Math.Pow(2, 8)));
                Size -= Convert.ToInt32(Math.Pow(2, 8)) * Convert.ToInt32(c2);
                Char c3 = Convert.ToChar(Size);
                String test = Convert.ToString(c1) + Convert.ToString(c2) + Convert.ToString(c3);
                return (test);
            }
            public static Int32 PacketSize(String Size)
            {
                return (Convert.ToInt32(Size[0]) * Convert.ToInt32(Math.Pow(2, 16)) + Convert.ToInt32(Size[1]) * Convert.ToInt32(Math.Pow(2, 8)) + Convert.ToInt32(Size[2]));
            }
            public static Boolean ParsePacket(ref String Pack, ref String Destinataire, ref String Commande, ref String Content)
            {
                String current = Pack;
                if (current.Length > 3)
                {
                    Int32 Size = Packet.PacketSize(current.Substring(0, 3));
                    MessageBox.Show(Convert.ToString(Size));
                    if (current.Length < 3 + Size)
                        return (false);
                    String cur = current.Substring(3, Size);
                    Pack = current.Substring(3 + Size);
                    Size = Packet.PacketSize(cur.Substring(0, 3));
                    String Header = cur.Substring(3, Size);
                    String[] tab = Header.Split('\0');
                    Destinataire = tab[0];
                    Commande = tab[1];
                    Content = cur.Substring(Size + 3);
                    return (true);
                }
                return (false);
            }
            public static String BuildPacket(String Destinataire, String Commande, String Content)
            {
                String pack = Packet.PacketSize(Destinataire.Length + Commande.Length + Content.Length + 3 + 1) + Packet.PacketSize(Destinataire.Length + Commande.Length + 1) + Destinataire + "\0" + Commande + Content;
                return (pack);
            }
            public static String BuildPacket(String Destinataire, String Commande)
            {
                String pack = Packet.PacketSize(Destinataire.Length + Commande.Length + 3 + 1) + Packet.PacketSize(Destinataire.Length + Commande.Length + 1) + Destinataire + "\0" + Commande;
                return (pack);
            }
     
        }
    Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. screenshot
    Par Heimdall dans le forum Windows
    Réponses: 9
    Dernier message: 08/08/2003, 11h33
  2. Screenshot
    Par rellik dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/08/2003, 12h28
  3. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04
  4. Copie d'un flux dans un autre
    Par Morvan Mikael dans le forum Langage
    Réponses: 5
    Dernier message: 03/06/2003, 09h40
  5. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo