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 :

Générér une image en c# (binary image data)


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Par défaut Générér une image en c# (binary image data)
    Bonjour a tous,

    Dans le cadre du développement d'une application pour afficher l'ecran d'une SoundBridge, j'ai besoin de créer une image.

    Je me connecte en telnet à la soundbridge, et elle me renvoie l'image sous forme d'une "binary image data".
    Ça ressemble à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0000380038003800fe007c00380010000000fefe02020202020202020000000000005e5e0000000000003e3e101020202020101000001c1c2a2a2a2a2a2a1a1a0000000000000000000000000000fefe909090989094806200000004002a5e2a002a001e00003e0c10122012201210fe00001c002a002a5e2a001a000000101c10227e229022501c000000008200fe00020000000000200012820cfe108220000000003e001000200020001e0000fe20402030fc4022fe2400001c1c2a2a2a2a2a2a1a1a00000c3e121012201220fe100000003e00105e200020001e0000041c2a2a2a2a2a2a1e1a00000020002000fc00220024000062009200920092008c0000001c002a002a002a001a0000003e00100020002000100000003800040002000400380000001c002a002a002a001a0000003e0010002000200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fc47fc6ffff7fc63fc4000000000000000000007fff7fff7fff60606060607070f83ffc3fde1f8f0f07000301f903fc07fe070e0e070e070e07070e07fe03fc01f8000007ff07ff07ff007000f801fc03de078f070706030401000007fc07fe07ff000f000700070007000e07fc07fe07ff00000000
    Je voudrais à partir de la générer un fichier image, mais je ne trouve pas comment faire.

    Existe il une fonction pour faire cela ?

    La documentation de la soundbridge qui decrit le format explique cela :

    returns binary image data
    Format of the Bitmap Display Data
    The bitmap display data is returned as a stream of bytes. The format of the data
    is unusual in that the bytes represent columns of pixels. (Most bitmaps store
    data as bytes of pixel rows.) For example, when the display is a 280 x 16
    bitmapped display, GetDisplayData will return 560 bytes of data, with every 2
    bytes representing a single column of pixel data, starting at the left-most column.
    Within each byte, the most-significant bit represents the pixel nearest the top of
    the bitmap, and the least-significant bit represents the pixel nearest the bottom of
    the bitmap.
    Merci à vous.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    je pense qu'il faut déjà transformer l'hexa en tableau de bytes en tableau de bytes
    puis mettre le tableau de bytes dans un io.memorystream et enfin pour du windows forms utiliser drawing.image.fromstream()
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Elle ressemble à ça ton image ?



    C'est pas évident à décoder, mais on y arrive

    Voilà le code commenté:

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    string hex = "0000380038003800fe007c00380010000000fefe02020202020202020000000000005e5e0000000000003e3e101020202020101000001c1c2a2a2a2a2a2a1a1a0000000000000000000000000000fefe909090989094806200000004002a5e2a002a001e00003e0c10122012201210fe00001c002a002a5e2a001a000000101c10227e229022501c000000008200fe00020000000000200012820cfe108220000000003e001000200020001e0000fe20402030fc4022fe2400001c1c2a2a2a2a2a2a1a1a00000c3e121012201220fe100000003e00105e200020001e0000041c2a2a2a2a2a2a1e1a00000020002000fc00220024000062009200920092008c0000001c002a002a002a001a0000003e00100020002000100000003800040002000400380000001c002a002a002a001a0000003e0010002000200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fc47fc6ffff7fc63fc4000000000000000000007fff7fff7fff60606060607070f83ffc3fde1f8f0f07000301f903fc07fe070e0e070e070e07070e07fe03fc01f8000007ff07ff07ff007000f801fc03de078f070706030401000007fc07fe07ff000f000700070007000e07fc07fe07ff00000000";
     
    // Conversion de la chaine hexa en tableau d'octets
    byte[] pixelsOn1Bit = HexToBytes(hex);
     
    // On met les pixels sur 8 bits, plus facile à manipuler
    byte[] pixelsOn8Bits = pixelsOn1Bit.SelectMany(b => Get8BitPixels(b)).ToArray();
     
    Image img = CreateImage(280, 16, pixelsOn8Bits);
     
    ...
     
    static IEnumerable<byte> Get8BitPixels(byte b)
    {
        byte[] bits = new byte[8];
        byte mask = 0x80; // binaire 10000000
        for (int i = 0; i < 8; i++)
        {
            bits[i] =
                ((b & mask) != 0)
                    ? (byte)0 // pixel noir
                    : (byte)255; // pixel blanc
            mask = (byte)(mask >> 1);
        }
        return bits;
    }
     
    static Image CreateImage(int width, int height, byte[] pixels)
    {
        // Format: 8 bits par pixel
        PixelFormat format = PixelFormat.Format8bppIndexed;
     
        // On crée une image vide de la taille voulue
        // Pour l'instant on inverse largeur et hauteur (puisque les données en entrée sont "retournées")
        // On retournera plus tard...
        Bitmap bmp = new Bitmap(height, width, format);
        BitmapData data = null;
        try
        {
            // Copie des pixels vers l'image
            Rectangle rect = new Rectangle(0, 0, height, width);
            data = bmp.LockBits(rect, ImageLockMode.WriteOnly, format);
            Marshal.Copy(pixels, 0, data.Scan0, pixels.Length);
        }
        finally
        {
            if (data != null)
                bmp.UnlockBits(data);
        }
        // Retournement de l'image
        bmp.RotateFlip(RotateFlipType.Rotate270FlipY);
        return bmp;
    }
     
    static byte[] HexToBytes(string s)
    {
        using (var ms = new MemoryStream())
        {
            for (int i = 0; i < s.Length - 1; i += 2)
            {
                string hexByte = s.Substring(i, 2);
                byte b = Convert.ToByte(hexByte, 16);
                ms.WriteByte(b);
            }
            return ms.ToArray();
        }
    }


    Citation Envoyé par Pol63 Voir le message
    je pense qu'il faut déjà transformer l'hexa en tableau de bytes en tableau de bytes
    puis mettre le tableau de bytes dans un io.memorystream et enfin pour du windows forms utiliser drawing.image.fromstream()
    Effectivement ça aurait été plus simple, mais vu que le tableau de bytes ne contient que les données des pixels (pas les en-têtes), ça n'aurait pas pu marcher... à moins de générer les en-têtes à la main, mais pour l'avoir déjà fait, ce n'est pas une partie de plaisir
    Images attachées Images attachées  

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

Discussions similaires

  1. Champs SQL Server Binary (image) conversion LINQ-objet image
    Par pierrot2k dans le forum Windows Presentation Foundation
    Réponses: 15
    Dernier message: 05/05/2008, 16h56
  2. [VB.net 2005] Extraire un binary image à partir d'une base access
    Par WriteLN dans le forum Accès aux données
    Réponses: 1
    Dernier message: 29/01/2007, 09h23
  3. Problème avec une TImageList contenant des grandes images
    Par Manopower dans le forum Composants VCL
    Réponses: 8
    Dernier message: 17/11/2005, 15h20
  4. [JAR] créer une archive .jar contenant des images.
    Par keny dans le forum Général Java
    Réponses: 2
    Dernier message: 14/03/2005, 13h17
  5. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32

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