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.
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.
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.
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.
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
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.
( Enfin ça dépend si c'est en little ou big indien ... )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 p1 = fb[0]; p2 = fb[0] >> 4;
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 )
Voilà comment, avec un ET logique, on ne va garder que les 4 bits qui nous concerne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 p1 = fb[0] & 0x0F;
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.
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)
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.
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..
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.
. 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?
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.
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) ?
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.
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]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager