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 :

Bits par pixel & mémoire


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Bits par pixel & mémoire
    Bonjour,

    Lors de la copie d'information en mémoire (à partir d'un framebuffer par exemple) vers un écran, j'aimerai savoir comment peut on faire correspondre un pixel de 2, 3 voir 4 bits avec une case mémoire de 1 octet?

    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Si j'ai bien compris ta question (qui n'est pas très claire), tu veux sortir d'un bloc mémoire des pixels codés sur X bits et disposés les uns à la suite des autres ? du style (exemple sur 3 bits) :
    bits 7, 6 et 5 de l'octet 0 : pixel 0
    bits 4, 3 et 2 de l'octet 0 : pixel 1
    bits 1 et 0 de l'octet 0, bit 7 de l'octet 1 : pixel 2
    bits 6, 5 et 4 de l'octet 1 : pixel 3
    etc...

    C'est bien ça ?
    Dans ce cas, le décalage de bits est ton ami.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    On va reprendre un peu ( suivant le titre du sujet )

    Un pixel , en fait, c'est un nombre d'octet, qui dépend de la configuration. Ce nombre on l'appelle très logiquement: Bytes per Pixel ( octets par pixel ).

    Ce nombre change cela la configuration de l'écran, effectivement un pixel ( ou une couleur donc ) peut être codé sur 1, 2, 4, 8, 16, 24, 32 bits, 32bits ayant la transparence en plus.

    Donc, normalement, lors des correspondance mémoire / framebuffer, il n'y a pas de problème, car finalement, un framebuffer est comme une zone mémoire.

    Juste qu'il faut définir assez de mémoire selon la formule:
    Bytes per Pixel * largeur * hauteur

    Voilà, maintenant, si vous le voulez bien reposez votre question de manière très clair et le plus précisément possible.

    Merci
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Pour être plus clair:

    Admettons que je veuille coder chaque pixel en 4 bits (16 couleurs) et que je dispose d'un écran 320x200 (ce qui représente une zone mémoire de (320x200x4) / 8 = 32000 octets)

    J'aimerai que la première partie (4 premier bits MSB) de l'octet 0 de mon framebuffer corresponde au pixel(0,0).
    La seconde partie de cet octet (LSB) corresponde au pixel(1,0)
    etc.. jusqu'au pixel (320,200)

    Donc ma question est comment faire pointer une "partie" d'un octet (dans le fb) vers un pixel?

    J'espère avoir été plus clair

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Salut

    Si j'ai bien compris ta question (qui n'est pas très claire), tu veux sortir d'un bloc mémoire des pixels codés sur X bits et disposés les uns à la suite des autres ? du style (exemple sur 3 bits) :
    bits 7, 6 et 5 de l'octet 0 : pixel 0
    bits 4, 3 et 2 de l'octet 0 : pixel 1
    bits 1 et 0 de l'octet 0, bit 7 de l'octet 1 : pixel 2
    bits 6, 5 et 4 de l'octet 1 : pixel 3
    etc...

    C'est bien ça ?
    Dans ce cas, le décalage de bits est ton ami.
    c'est effectivement ça.. Mais je vois pas trop comment m'y prendre

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Hum, d'accord, mais c'était juste parce que normalement, le framebuffer à la même forme que la mémoire.
    Pour le cas d'un pixel à 16 couleurs ( 4 bits ), les 8 premiers bits du framebuffer forment deux pixels.
    Bon, je vais quand même expliquer le truc
    Le décalage ce fait avec '>>' et '<<'. Les premier décale vers la droite, le deuxième vers la gauche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    p1 = fb[0];
    p2 = fb[0] >> 4;
    ( Enfin ça dépend si c'est en little ou big indien ... )
    Pour p2 je fais un décalage de 4 bit sur la droite.
    Mais cela ne suffit pas, car p1, peut avoir des informations qui ne le concerne pas. ( les informations de p2 )
    Pour ce cas on va utiliser la masquage de bits ( operation bit par bit )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    p1 = fb[0] & 0x0F;
    Voilà comment, avec un ET logique, on ne va garder que les 4 bits qui nous concerne
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Héhé merci, c'est exactement ce que je cherchais!

    Sinon, y a t-il un moyen efficace pour assigner les bits aux pixels? là j'assigne avec un modulo (si l'indice % 2 == 0, j'assigne le MSB sinon le LSB)

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Il n'y a pas de moyen de parcourir la mémoire 4 bits par 4 ...
    Du coup, dans le cas précédent, fb[0] donnera toujours deux pixels à la fois.

    Du coup, mais avec un code comme vous sembliez m'indiquer, il n'y a pas moyen d'assigner 1 pixel ou 1 autre. Vous assignerez dans tout les cas, deux pixels à la fois ...

    ( Je ne suis pas sur d'avoir compris la question )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Admettons que j'ai un tableau de la taille de mon écran : data[320x200].
    Chaque indice du tableau représente un pixel, et j'aimerai assigner chaque valeur au pixel correspondant.
    Du genre:
    pixel(0,0):
    data[0] = fb[0] & 0x0F;
    pixel(1,0):
    data[1] = fb[0] >> 4;

    Enfin, peut être que je n'ai pas tout saisi finalement..

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Oui vous avez raison comme ça, ça peut marcher
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    . J'aurai une tout dernière question: Comment faire lorsque les bpp sont plus grand que 8 bits (16bits, 24bits...)?

    En changeant le type d'un pixel? par exemple pour un 16 bits, le caster avec un long int?

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Pour le cas, lorsque c'est plus grand, normalement on a un tableau de taille
    320 x 200 x 2 ( pour du 16 par pixel sur 320 x 200 )
    On a une fonction getPixel, qui renvoie directement 16 bit ( unsigned short int )
    ou alors on cast le pointeur du tableau ( qui est généralement un unsigned char* ) pour que ce soit un ( unsigned short int* ) mais faut être précautionneux.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Tu veux faire une fonction qui gère un nombre bien déterminé de bits par pixel ou au contraire une fonction qui gère un nombre quelconque de bits par pixel (qu'on lui enverra en paramètre) ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Tu veux faire une fonction qui gère un nombre bien déterminé de bits par pixel ou au contraire une fonction qui gère un nombre quelconque de bits par pixel (qu'on lui enverra en paramètre) ?
    Un nombre quelconque, car au final elle pourra être utilisée en différents mode (1, 2, 4, 8 bits...)

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 663
    Points
    23 663
    Par défaut
    Le plus simple est de compter directement en bits et pas en octets. Ensuite, tu convertis le résultat pour trouver ce qui t'intéresse. Par exemple, dans le cas d'une définition de 1080×1024×12 bits de profondeur, si tu veux gérer l'état du pixel de coordonnées (150;100), alors le premier bit concerné sera le numéro

    (100×1080+150)×12 = 1297800, et le dernier, le 1297811.

    Partant de cela, tu convertis en nombre d'octets en divisant par huit, tout simplement :

    1297800 ÷ 8 = 162225, soit 279B1 en hexadécimal.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Les librairies de format raster (c'est à dire ce dont il s'agit) ont une fonction ScanLine(). En tout cas, celles que je connais.
    Cela signifie que rien n'est généralement prévu pour adresser un pixel DIRECTEMENT.
    Je pense que vous n'avez aucune information sur la façon dont frambuffer est écrit, stockée, gérée etc. donc, à mon avis toute tentative de gestion directe Mémoire <==> Ecran a peu de chance de réussir. Naturellement ceci n'était pas vrai il y a 15 ans.
    Je pense que si vous décriviez ce que vous voulez faire, on pourrait mieux vous orienter.
    [perso] J'ai toujours affiché sur mon mur une image dessinée avec une imprimante à aiguilles. Cette image représente un plan de lotissement. J'ai l'impression que c'est ce genre de chose que vous voulez faire, mais je crains que ce ne soit plus possible, sauf si vous gérez TOUT à tous les niveaux. [/perso]

Discussions similaires

  1. nombres de bit par pixel
    Par hassiba_45 dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/04/2008, 12h51
  2. nombre de bits par pixel
    Par madjidri dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/05/2007, 16h01
  3. Modifier une image par pixels
    Par mateo.14 dans le forum MFC
    Réponses: 10
    Dernier message: 21/01/2005, 15h09
  4. [TImage] Transfert de Picture par pixels.
    Par H2D dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2003, 14h37
  5. [VB6] [Graphisme] Transfert d'image pixel par pixel
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/10/2002, 09h53

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