Pages: [1]   Go Down
Author Topic: transformation de 3 couleur en 16bit de donné  (Read 703 times)
0 Members and 1 Guest are viewing this topic.
Region ile de france.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 452
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut j'ai un petit souci en regardant de plus prés les couleur que me donné mon ecrant je remarque quelque chose de bizard sur la generation d'un nuancier de couleur
 mon ecrant est un itdb02 5" et j'utilise la librairie UTFT.h

le code pour genere mon nuancier est le suivant :

Code:
int x=100;
  int X=100;
  int y=100;
  byte R=0;
  byte G=0;
  byte B=0;
  int ct=0;
for (R=0; R<255; R++){
      lcd.setColor( R, G, B);
      lcd.drawRect( X, y,X+1,y+50);
       ct++;
      X=x+(2*ct);
     };
    ct=0;
    X=100;
    R=0;
    
   for (G=0; G<255; G++){
      lcd.setColor( R, G, B);
      lcd.drawRect( X, y+50,X+1,y+100);
       ct++;
      X=x+(2*ct);
     };
    X=100;
    ct=0;
    G=0;
    
    for (B=0; B<255; B++){
      lcd.setColor( R, G, B);
      lcd.drawRect( X, y+100,X+1,y+150);
       ct++;
      X=x+(2*ct);
     };
    X=100;
    ct=0;
    B=0;

et la photo du nuancier en piece jointe.
on remarque que le rouge et le bleu ne s'etale pas corectement et je pense que c'est ce qui me pose des souci de couleur .
en regardant dans la librairie j'ai trouve la partie de code qui code sur 16 bit le melange des trois couleur RGB et je me demander si mon souci ne venai pas de la :
Code:
void UTFT::setPixel(byte r,byte g,byte b)
{
LCD_Write_DATA(((r&248)|g>>5),((g&28)<<3|b>>3)); // rrrrrggggggbbbbb

}

le probleme c'est que je pige pas le bout de code ((r&248)|g>>5),((g&28)<<3|b>>3), si j'ai bien compris le commentaire le rouge est coder sur 5 bit le ver sur 6 et le bleu sur 5  donc 16 au total mais
ne faut til pas 24 bit (3x8) pour le coder correctement ?

quelqu'un peut t'il m'expliqué le bout de code s'il vous plais je comprend rien a la manipulation des doné en bit!!


autre question il y a t'il un rapport entre le 16 du bus de doner et le 16 du couleur en 16 bit ou est ce que je peut envoyer des donner de couleur sour forme de 24bit (apres configuration de l'ecran), car je buche pas mal sur la doc technique mais c'est pas simple pour un novice!


* IMG_20130123_155308.jpg (89.03 KB, 480x640 - viewed 11 times.)
« Last Edit: January 24, 2013, 07:31:36 am by Heloderma-kris » Logged


Region ile de france.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 452
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

alors en y regardant de plus prés j'ai trouvé que

         
Code:
  ch=((fcolorr&248)|fcolorg>>5);
   cl=((fcolorg&28)<<3|fcolorb>>3);
           LCD_Write_DATA(ch,cl);
 
ou ecrire ça etait la meme chose:

    word c=((fcolorr & 0xF8) << 8) | ((fcolorg & 0xFC) << 3) | (fcolorb >> 3);
    LCD_Write_DATA(c>>8,c);

la derniere formle si dessu ser a convertire en  Format de 16 bits (565)

Quote
Avec ce format de 5 bits sont donnés sur le canal rouge, 6 sur le canal vert et 5 sur le canal bleu. Apparemment, la raison pour le petit supplément d'aller au canal vert est que l'oeil humain peut voir plus de nuances de vert que n'importe quelle autre couleur. Cela donne 32 * 64 * 32 (65.536) de différentes couleurs.

j'avance donc dans la compréhension du "machin" mais je ne m'explique pas encor les saut de teinte dans le rouge avez vous une idée?
Logged


france
Offline Offline
God Member
*****
Karma: 15
Posts: 880
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

* La première boucle fait bien varier graduellement R ( Red), mais dans la seconde instruction qui choisit la couleur
lcd.setColor( R, G, B);
G et B n'ont pas l'air d'être explicitement initialisés à zéro:  Tu demandes d'afficher (R, ?, ?) et ça dessine 8 paliers de teintes.

* Dans la seconde boucle G (=Green) varie bien, R=0 est maintenant initialisé, donc tu demandes (0, G, ?) et le bleu n'est pas défini, donc affichage de 64 paliers.

* Seule la troisième boucle (0,0,B) définit bien tous les 3 paramètres de couleur explicitement.

-> Remède à tester : Initialiser avec R=0; G=0; B=0; au tout début de ce code.
Logged

Christian

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 452
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

désoler je n'avais pas mis le bon code j'ai rectifier ! mais le probleme ne vien pas du code de l'affichage  de la variation mais de la variation de rouge  de 0 a 255 qui n'est pas lineaire du coup certain de mes gris sont rosé par exemple !

je vais essayer une autre formule pour convertire le 24bit en 16 bit 565  et voir ce que sa me done:
http://mchobby.be/wiki/index.php?title=Tutoriel_Librairie_Adafruit_GFX_-_Couleurs_16_Bits
Logged


Region ile de france.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 452
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon toujours pas trouver de solution j'ai chercher dans tout les sens que ce soit en essayant diferent parametre de gama de l'ecrant ou different algorythme de convertion du RGB888 en RGB 565 comme suit :


Code:
uint8_t r,g,b;
            r = (uint8_t)((fcolorr/255.0)*31); //R component
            g = (uint8_t)((fcolorg/255.0)*63); //G component
            b = (uint8_t)((fcolorb/255.0)*31); //B component
           word bitcouleurfort  = ((r & 0x1f) << 3) | ((g >> 3) & 0x7); //R (5 bits) +  G (upper 3 bits)
          word bitcouleurfaible   = ((g & 0x7) << 5) | (b & 0x1f); //G (lower 3 bits) + B (5 bits)

mais rien n'y fait , j'ai toujours ce probleme de non  linéarité dans mes couleur avec dans la plage de 0 a 255 pour le rouge, il y a  des eclaircicement qui s'intercale dans les couleur sombre et vise versa du coup il y a des saut dans les couleur lorsque l'on y assosie le bleu et le vert, je suis preneur de toute idée ... merci
Logged


France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pas la peine de se compliquer la vie avec des boucles compliquées ou des histoires de gamma. Si tu veux voir le rouge, tu remplis l'écran avec un dégradé de rouge et tu comptes combien tu vois de nuances de rouge. Si la couleur est codées sur 5 bits tu devrais en dénombrer 32 (comme on le voit sur le bleu dans l'image que tu as jointe). C'est pas plus compliqué que ça. Maintenant si tu en trouves moins c'est qu'il y a un problème soit dans la liaison entre l'écran et ton arduino soit sur la carte de l'écran.

Une fois que tu as confirmé la liaison matérielle entre l'écran et l'arduino si cela ne fonctionne toujours pas, tu sors la loupe et tu examines la carte. il y a peut être une piste coupée, une mauvaise soudure ou un pâté de soudure entre 2 broches.

Si j'en crois l'image que tu as envoyée, il y a de fortes chances que 2 bits soient court-circuités (ou échangés) car le dégradé de rouge obtenu n'est pas monotone.


Logged

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 452
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok merci je vais regardez a ça ce soir , mais du coup je me demande si le souci n'est effectivement pas entre la carte et l'ecran car le pross d'affichage reçoi bien les commande hexa donc j'imagine que le souci ce trouve après le pross d'affichage , en tout cas j'ai une piste merci!!!
Logged


Region ile de france.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 452
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bon j'ai rien vue de couer ou autre , c'est peutetre un probleme de l'ecran , je laisse tomber pour le moment ce probleme de couleur je verai plus tard ou si je rachete un ecran car d'aprés ce que j'ai vue sa ne vien ni de la librairie ni de mon programe donc reste le hardware , merci en tout cas !
Logged


Pages: [1]   Go Up
Jump to: