Przepisanie kodu z C# na C

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 40
Rejestracja: środa 04 kwie 2018, 16:48

Przepisanie kodu z C# na C

Postautor: StaryAnoda_NEW » piątek 06 kwie 2018, 17:47

Hej

Przedstawiam Wam kod napisany w jezyku C# chciałbym ten sam kod przekształcić do formy odpowiadajęcej językowi C, Muszę dokonać kilka konwersji i z tym wiążą się moje pytania.

Kod w języku C#:

Kod: Zaznacz cały

                    for (var n2 = 0; n2 < WIDTH; ++n2)
                    {
                        for (var n3 = HEIGHT - 1; n3 >= 0; --n3)
                        {
                            if (!sp.IsOpen)
                                return;

                            var byte1 = sp.ReadByte();

                            var blue = byte1;
                            var green = byte1;
                            var red = byte1;

                            MyBitmap.SetPixel(n2, n3, Color.FromArgb(1, red, green, blue));
                        }
                    }


Kod w języku C:

Kod: Zaznacz cały

      #define RGB2COLOR(r, g, b) ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)))
      #define HEIGHT 320
      #define WIDTH  240
      int C;
      
      for(uint16_t n2 = 0; n2 < WIDTH;  ++n2)
      {
         for (uint16_t n3 = 0; n3 < HEIGHT; ++n3) // Zmiana kierunku kreślenia
         {
            while(!((C = uart3_get_char())>= 0)); Czekaj aż pojawi się nowa wartość >= 0

            uint8_t blue = (uint8_t)C;
            uint8_t green = (uint8_t)C;
            uint8_t red = (uint8_t)C;

            SPFD5408_draw_pixel(n2, n3, RGB2COLOR(red, green, blue)); // Mój wyświetlacz używa standardu RGB565
         }
      }


Czy Waszym zdaniem to jest równoznaczne ?
Mam wątpliwości z tym zapisem Color.FromArgb(1, red, green, blue). Czy dobrze rozumiem, że ta metoda zwraca kolor 32 bitowy w standardzie ARGB8888 ? gdzie składową A mogę pominąć ?
Pytam ponieważ bitmapa na wyświetlaczu zupełnie nie przypomina tego co na komputerze na aplikacji w C# ?
Pragnę zaznaczyć, że odbieram bitmapę czarno białą w standardzie yuv422. Tym bardziej sposób konwersji tego do posta RGB jest moim zdaniem dziwny patrząc nawet na kod w C#
done is better than perfect

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1083
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Przepisanie kodu z C# na C

Postautor: Antystatyczny » piątek 06 kwie 2018, 18:03

StaryAnoda_NEW pisze:Mam wątpliwości z tym zapisem Color.FromArgb(1, red, green, blue). Czy dobrze rozumiem, że ta metoda zwraca kolor 32 bitowy w standardzie ARGB8888 ? gdzie składową A mogę pominąć ?


Z tego co pamiętam A (kanał alfa ustalający opacity - przezroczystość) może przyjmować wartość od 0 do 1, z czego 0 oznacza piksel zupełnie przezroczysty, a 1 oznacza piksel całkowicie kryjący niższe warstwy, może również przyjmować wartość procentową lub wartość z zakresu 0 do 255. To po prostu trzeba sprawdzić w opisie frameworka. Pozostałe składowe są w formacie 888.

Co do reszty kodu na razie się nie wypowiadam, bo nie bardzo rozumiem sens pobierania JEDNEGO bajtu i wpisywania go do wszystkich trzech składowych koloru. Może to ma jakiś głębszy sens, którego nie dostrzegam.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
j23
User
User
Posty: 356
Rejestracja: czwartek 08 paź 2015, 18:40

Re: Przepisanie kodu z C# na C

Postautor: j23 » sobota 07 kwie 2018, 16:18

Antystatyczny pisze:(...)Co do reszty kodu na razie się nie wypowiadam, bo nie bardzo rozumiem sens pobierania JEDNEGO bajtu i wpisywania go do wszystkich trzech składowych koloru. Może to ma jakiś głębszy sens, którego nie dostrzegam.

Kolor całkowity jest 24 bitowy, gdzie:
R - 8 bitów (bajt),
G - 8 bitów (bajt),
B - 8 bitów (bajt)
RAZEM: 24 bity (3 bajty) + kanał Alpha (przeźroczystość lub nie).
W C# ustaleniem tych wszystkich składowych koloru zajmuje się funkcja FromArgb (z klasy Color), która powinna zwrócić liczbę rzędu long int (nie jestem pewny, trzeba by zobaczyć jaką wartość jest zwracana przez funkcję).
Teraz.. Dla C trzeba by napisać taką samą funkcję, lub napisać funkcję która wyświetla pixel, KTÓRY może lub nie przyjmować ODCIENIE (czyli być lub nie przeźroczysty = kanał Alpha).
Edit: Kanał Alpha jest w ogóle potrzebny? -jeśli nie, to mogłoby uprościć trochę funkcję FromArgb.

Z racji, że nie programuję w C# a nie znam funkcji SPFD5408_draw_pixel nie mogę pomóc więcej.

Pozdrawiam! J23


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość