logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwersja kodu koloru z RGB do tablicy C ?

darres1 20 Lis 2010 20:41 4814 16
REKLAMA
  • #1 8768751
    darres1
    Poziom 13  
    Witam,
    Mam taki programik napisany w c++ Builder:

    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
     TCanvas *Canvas = new TCanvas();
       Canvas->Handle = GetDC(0);
       TPoint Point;
       GetCursorPos(&Point);
       TColor Color = Canvas->Pixels[Point.x][Point.y];
       delete Canvas;
    
       int RGB = ColorToRGB(Color);
       TVarRec args[3] = {GetRValue(RGB), GetGValue(RGB), GetBValue(RGB)};
       Form1->Caption = Format("#%.2x%.2x%.2x", args, 3);
       Edit1->Text = Format("#%.2x%.2x%.2x", args, 3);
       Label1->Color = Color;
       Label2->Caption  = GetRValue(RGB);
       Label3->Caption  = GetGValue(RGB);
       Label4->Caption  = GetBValue(RGB);
    }
    
    


    Program wyswietla kolor w HTML, a ja potrzebuje w takiej wersji np:

    COLOR_RED = 0xf800
    COLOR_WHITE = 0xffff

    potrzebuję to do obsługi kolorowego wyświetlacza sterowanego atmegą, może ktoś mnie nakieruje, jak napisać program lub konwerter, a może są jakieś programy do konwersji np: z "white = #FFFFFF" na "COLOR_WHITE = 0xffff"
  • REKLAMA
  • #3 8768880
    darres1
    Poziom 13  
    No właśnie napisałem że potrafię wyświetlić RGB z piksela np: obrazka, a potrzebuję w takiej postaci:

    COLOR_RED = 0xf800
    COLOR_WHITE = 0xffff

    ale nie wiem, jakie to jest kodowanie ?
  • REKLAMA
  • #4 8768964
    arnoldziq
    VIP Zasłużony dla elektroda
    darres1 napisał:
    COLOR_RED = 0xf800
    COLOR_WHITE = 0xffff

    No dobra, ale co to za "postać" ?
    I czemu nie, na przykład : COLOR_RED = 0xff0000 ?
  • REKLAMA
  • #5 8769111
    darres1
    Poziom 13  
    No właśnie tego nie wiem, zaczynam programować mikroprocesory atmega w języku c++, i chciałem napisać program do konwersji obrazka żebym mógł go wyświetlić na LCD graficznym, znalazlem przykłady w sieci i wszędzie jest właśnie np tak:
    
    #define S65_COLOR_AQUA		0x07ff
    #define S65_COLOR_FUCHSIA	0xf81f
    #define S65_COLOR_GRAY		0x8410
    #define S65_COLOR_GREEN		0x0c00
    #define S65_COLOR_MAROON	0x8000
    #define S65_COLOR_NAVY		0x0010
    #define S65_COLOR_OLIVE		0x8400
    #define S65_COLOR_PURPLE	0x8010
    #define S65_COLOR_RED		0xf800
    #define S65_COLOR_SILVER	0xc618
    #define S65_COLOR_TEAL		0x0410
    #define S65_COLOR_YELLOW	0xffe0
    
  • #6 8769227
    arnoldziq
    VIP Zasłużony dla elektroda
    Nie możesz opisać wszystkich dostępnych kolorów w ten sposób.
    Ale tego typu stałe mają sens tylko w przypadku rysowania z danym kolorem swoich własnych rysunków.
    To ma sens tylko w przypadku gdy masz zdefinjwane procedury typu :
    rysuj_punk(x,y,colour)

    Wtedy wywołujesz ją np.:
    rysuj_punkt(10,25,S65_COLOUR_RED)

    W przypadku re-kodowania rysunków, to kompletnie nie ma sensu!
    Musisz napisać funkcję która zamienia kolor RGB na dostępną ci paletę kolorów.
    S65_colour = konwertuj( R,G,B )
  • #7 8769256
    Dżyszla
    Poziom 42  
    to próbując to rozszyfrować, to jest to chyba układ rgb w takiej postaci:

    RRRR RRGG GGGB BBBB

    czyli: R = <0..63>, G=<0..31>, B=<0..31>
    Ale pewny nie jestem. Jeśli tak jest, to wystarczy ułożyć zwykłą proporcję:
    OutR = R * 64 / 256, lub prościej: OutR = R shr 2
    i analogicznie reszta

    Potem tylko zrzucić do jednej liczby:
    
    OutColor = (OurR shl 11) or (OurG shl 6) or OurB

    (jeśli się nie pomyliłem - późno już)

    Dodano po 8 [minuty]:

    Korekta - to jednak nie będzie taki układ :( Być może jest to po prostu 16-bitowa tablica zdefiniowanych kolorów. A więc wówczas pozostaje tłumaczenie słownikowe.
  • #8 8770971
    darres1
    Poziom 13  
    Witam,
    No widzę żę muszę troszke więcej rozwinąć temat, o co mi chodzi:

    Chcę napisać programik, do konwersji mapy bitowej do postaci tablicy w języku C

    Potrzebuję tego do wyświetlania obrazków na LCD od Siemensa S65 sterowanego atmegą32

    Na początku pisałem w Bascomie i to już mi działa, do konwersji obrazków używałem programu "LCD RGB Converter", ale jakość jest kiepska, dlatego przechodze na pisanie w języku C dla AVR i chciałbym sam sobie konwertować obrazy do pliku tekstowego, które będe mógł odczytywać z karty SD...

    np tak:

    https://www.elektroda.pl/rtvforum/topic1135749.html
  • #9 8771390
    Konto nie istnieje
    Poziom 1  
  • #11 8773491
    webmortiz
    Poziom 20  
    Witam!

    W odpowiedzi na maila przesłanego drogą prywatną udzielę Ci podpowiedzi ;) Nie może być za łatwo. Chciałbym żebyś sam do tego doszedł, będziesz wtedy lepiej to rozumiał. A więc ta podpowiedź:

    Weź pod uwagę wpis kolegi Dżyszela oraz coś co się nazywa przesunięcia bitowe.

    Jeśli na prawdę nie dasz rady dam Ci gotową klasę w C#, łatwo (mam nadzieję) przełożysz sobie to na C++. Jak pisałem swój konwerter dopiero zaczynałem z C# ale mam nadzieję że jak teraz spojrzę na swój kod to się nie przerażę ;)

    pozdro.
  • #12 8773857
    darres1
    Poziom 13  
    Dzięki webmortiz za odpowiedź, poszukam trochi o tych przesunięciach i się pomęcze, narazie używam twojego konwerterka do wyświetlania obrazków na LCD, ale muszę mocno edytować pliki po konwersji, dlatego wolałbym sam napisać podobny program,
    narazie - pozdrawiam.
  • REKLAMA
  • #15 8782948
    webmortiz
    Poziom 20  
    Co do teorii
    mamy 24 bitowy kolor czyli w przelozeniu na bity RRRR RRRR GGGG GGGG BBBB BBBB
    a tu 16 bitowy czyli RRRR RRGG GGGB BBBB

    czyli literka R odpowiada za wartosc koloru czerwonego (np. 1011 0110 - czysty przyklad z kalosza ciagniety) G i B analogicznie - z takiego czegos sklada sie caly kolor

    Skupmy sie na R (reszta analogicznie) w 24 bitach mamy RRRR RRRR a w 16 RRRR RR czyli 2 bity mniej. Zwroc uwage ze ilosc bitow dla poszczegolnych skladowych nie musi byc taka sama. A wiec co robimy zeby 24 bitowa czerwona skladowa stala sie 16 bitowa? Najmniej na kolor wplywaja najmniej znaczace bity czyli robimy przesuniecie bitowe w prawo (o ile sie nie myle ze najmniej znaczace sa po prawej bo nie pamietam) i wtedy dostaniemy w 24 bitowym kolorze 00RR RRRR i kolor jest juz 16 bitowy. Jezeli chcesz otrzymac odpowiedną wartość 16stkowa to zloz kolor wedlug wzorow na poczatku mojgo eseju i masz tak na prawde liczbe ktora mozesz zapisac w dowolnym formacie, w przypadku konwersji na 16 bit obcinasz zera na poczatku. Analogiczne dzialanie na wszystkich skladowych, ino tak jak mowie w przypadku czerwonego na 16 bitach jest 6 bitow a zielony i niebieski to juz piec. Oraz analogicznie z przejściem z 16 bitowego na 8 bitowy.

    Mam nadzieje ze nakierowalem i tym samym pomoglem.
REKLAMA