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#] Parcourir les bits d'un octet (byte)


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Points : 23
    Points
    23
    Par défaut [C#] Parcourir les bits d'un octet (byte)
    Bonjour à tous,

    Je cherche à faire du traitement d'image sous C#, j'utilise le mode unsafe afin de gagner en temps de calcul.
    Néanmoins, étant nouveau, je n'ai pas encore trouvé comment parcourir les bits d'une image binaire (format 1bpp).
    J'utilise la classe bitmap et bitmapData.

    Voici un petit bout de mon code
    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
     
    unsafe
                {
                    BitmapData bmpData = image1.LockBits(new Rectangle(0, 0, width,
                    height), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
     
                    Byte* pix = (Byte*)bmpData.Scan0;  
     
                    // traverses of each pixel > negative it
                    for (int i = 0; i < height ; i++)
                    {
                        for (int j = 0; j < width ; j++)
                        {
                                pix[0] = 0 ; // pix pointe sur l'octet courant
                                pix++;                        
                        }
    	       }
                    image1.UnlockBits(bmpData);
                }
                System.Console.WriteLine("parcours termine");
    Ici je peux parcourir mon image octet par octet, mais j'aimerais pouvoir travailler sur les bits de mon image, étant donné que celle ci est binaire ... Est ce que quelqu'un a une idée ? Je me doute que cette question parait simple, mais cela fait plusieurs heures que je cherche, et je n'ai toujours pas trouvé

    Merci à la bonne âme qui me viendra en aide !

    Raph

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    J'ai écrit il y a quelques années deux fonctions pour manipuler les bits d'un byte, jettes-y un coup d'oeil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static bool IsBitSet(byte b, byte pos)
            {
                return (b & (1 << pos)) != 0;
            }
     
            public static void SetBit(ref byte b, byte pos)
            {
                b = (byte)(b | (1 << pos));
            }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Points : 23
    Points
    23
    Par défaut
    Merci l'ami,

    Effectivement en regardant tes fonctions j'ai bien compris comment on parcourait les bits d'un octet. J'ai complété tes fonctions avec celles ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // permet de recuperer le bit a la position pos de l'octet b
    public static byte GetBit (byte b, byte pos)
    {
        return (b & (1 << pos)) >> pos;
    }
     
    // permet de mettre le bit a la position pos à 0 dans l'octet b
    public static void UnsetBit(ref byte b, byte pos)
    {
        b = (byte)(b & (~( 1 << pos));
    }
    peut être que cela fera gagner du temps à un futur nouveau en C# comme moi

    ++

    Raph

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Il existe une classe toute faite ici.
    M'enfin bon, n'aurai tu pas oublié le tag ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Points : 86
    Points
    86
    Par défaut
    Pourquoi ne pas utiliser la classe BitArray, présente de base dans le framework .Net ? Tu lui donnes un tableau d'octets à manger, et rulez !

  6. #6
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par GroXx Voir le message
    Pourquoi ne pas utiliser la classe BitArray, présente de base dans le framework .Net ? Tu lui donnes un tableau d'octets à manger, et rulez !
    Bonne remarque, pour ma part, je ne me rapelle plus pourquoi le choix de le faire manuellement plutot que via BitArray mais il devait bien y avoir une bonne raison

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Points : 23
    Points
    23
    Par défaut
    Hello smyley & GroXx,

    merci pour vos réponses.
    Effectivement, je ne connaissais pas la classe bitArray (je ne connais pas encore toutes les classes du framework .net ! yen a tellement )
    je n'avais pas non plus la connaissance de la classe présentée ici, qui a l'air encore plus complète que les méthodes que j'ai utilisé jusqu'à présent.

    Etant donné que je fais du traitement d'image, il me faut des méthodes les plus optimales possibles. Je pense pour l'instant que les petites méthodes que j'utilise : celles proposées par neptune et celle de la classe proposée par smyley sont plus optimales que celle du framework .net : Bitarray.

    Merci donc, ça répond entièrement à ma question
    Raph.

    PS : oui, j'avais un chtit peu oublié le tag !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par neptune Voir le message
    Bonne remarque, pour ma part, je ne me rapelle plus pourquoi le choix de le faire manuellement plutot que via BitArray mais il devait bien y avoir une bonne raison
    Je pense que les petites méthodes que tu as présenté utilisant des opérateurs binaires de décalage de bit sont plus optimales. Car en utilisant les classes du framework, certes le code est bien managé, mais je ne pense pas qu'il soit optimal ... tes méthodes doivent sans doute être plus rapide

  9. #9
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par Dark Raph Voir le message
    Je pense que les petites méthodes que tu as présenté utilisant des opérateurs binaires de décalage de bit sont plus optimales. Car en utilisant les classes du framework, certes le code est bien managé, mais je ne pense pas qu'il soit optimal ... tes méthodes doivent sans doute être plus rapide
    Et bien, la classe BitArray fait exactement la meme chose que moi dans le cas du SetBit:

    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
     
    public void Set(int index, bool value)
    {
        if ((index < 0) || (index >= this.m_length))
        {
            throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
        }
        if (value)
        {
            this.m_array[index / 0x20] |= ((int) 1) << (index % 0x20);
        }
        else
        {
            this.m_array[index / 0x20] &= ~(((int) 1) << (index % 0x20));
        }
        this._version++;
    }
    Sinon, je crois que pour du traitement d'image, la rapidité d'exécution pourrait être améliorée en utilisant une partie de code non-managé.

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

Discussions similaires

  1. Prendre les bits significatifs d'une trame d'un octet
    Par berberat dans le forum MATLAB
    Réponses: 4
    Dernier message: 21/08/2007, 13h22
  2. Récupérer les bits qui composent un byte
    Par ToTo13 dans le forum Langage
    Réponses: 4
    Dernier message: 25/01/2007, 17h12
  3. récupérer les bits d'un byte
    Par ToTo13 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2006, 16h25
  4. Isoler les 2 parties d'un Byte
    Par bobby-b dans le forum Langage
    Réponses: 4
    Dernier message: 08/07/2004, 09h46
  5. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42

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