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

[PASCAL] Graph - BMP - Zniekształcone kolory przy przenoszeniu palety 8-bitowej

one_eddie 11 Gru 2004 21:10 2781 8
REKLAMA
  • #1 1053016
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Ustawiam sobie tryb SVGA (BGI) 640x480x256.

    Bitmapka 8 bitowa.
    Wczytuje naglowek, palete i dane.

    Potem na rozne sposoby probowalem przeniesc palete z BMP do tej z "ekranu" ale za kazdym razem kolory sa znieksztalcane.

    Ponizej podaje kod o ktorym pisze.

        {Odczyt palety}
        BlockRead(pFile, Palette, SizeOf(Palette)); {Palette : Array[0..255] Of Record B,G,R,Blank : Byte; End;}
    
        {}
        For x:=0 To 255 Do
          SetRGBPalette(x, Palette[x].R, Palette[x].G, Palette[x].B);
    
        { Rysujemy bitmape }
        For y:=BMPHeader.biHeight DownTo 1 Do
        Begin
          For x:=1 To BMPHeader.biWidth Do
          Begin
            BlockRead(pFile, BMPByte, 1);
            PutPixel(x, y, BMPByte);
          End;
    
          {Pomijamy puste bajty}
          BlockRead(pFile, Unused, 4 - (BMPHeader.biWidth Mod 4));
    
    
        End;
    
        ReadKey;


    Prosze o nie czepiac sie ew wydajnosci kodu, jedyne co ma on zrobic to wyswietlic bitmape (1 raz i czekac na klawisz).

    Jedyne co przychodzi mi do glowy to ze driver nie wyciska 256 kolorow??
    Jesli tak to czy znacie jakis DRIVER BGi ktory obsluzy 256 kolorow w min 320x200 (nie chce uzywac 13H).

    Co robie zle?

    Zamykam. - arnoldziq
  • REKLAMA
  • Pomocny post
    #2 1053045
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Nie załączyłeś w jaki sposób ładujesz palete do karty graficznej, ale z tego co przypuszczam wykorzystujesz bezpośrednie zapisywanie do rejestrów. Nie wiem gdzie, ale kiedyś wyczytałem taką uwage, że rejestry karty graficznej przechowujące wartość każdej ze składowych są tylko 6cio bitowe, przy czym ważne jest właśnie 6 młodszych bitów. Aby załadowanie palety było realizowane dobrze, należy każdy bajt przesunąć o dwa bity w prawo, wtedy najstarsze bity palety z pliku trafią do 6 młodszych bitów palety w pamięci karty.
  • REKLAMA
  • #3 1053712
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    jezeli mnie pamiec nie myli to elektryk dobrze gada :)

    Swoja droga klasa graph jest beznadziejnie wolna i nie polecam uzywania jej do czegokolwiek bardziej skomplikowanego niz wyswietlanie tla :)
  • REKLAMA
  • #4 1054113
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Heh wydawalo mi sie ze ladowanie palety odbywa sie za pomoca procedurki SetRGBPalette(x, Palette[x].R, Palette[x].G, Palette[x].B); z modulu GRAPH, ktora podalem w kodzie.

    To jest jedyna funkcja odpowiedzialna za ustawianie palety w moim kodzie.

    Narazie probuje zrobic to bez ASM-a (czy PASCALOWYCH rejestrow), uzywajac wylacznie modulu GRAPH.

    Ale widze ze chyba nie obejdzie sie bez zmiany biblioteki.
  • #5 1054140
    linx
    Poziom 21  
    Posty: 600
    Pomógł: 26
    Ocena: 81
    Pamiętam kiedyś był jakiś driver BGi 320x200 256 kolorów, ale beznadziejnie wolny i on też wykorzystywał tryb 13h, a dobrze napisany moduł do 13h swoją szybkością niejednego zaskoczy(niestety to nie graph :-( ) :!:
  • REKLAMA
  • #6 1054471
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    tak wiem ma mten driver (albo podobny) svga256.bgi wlanczam go w 640x480x256 kopiuje palete ale wyswietlane kolory nie sa = z tymi z BMP ??
  • #7 1054977
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    Gdybys przeczytal dokladnie to co pisalismy to bys zrozumial.

    Normalnie paleta zapisana jest w trybie 24bpp (8bitow zmiennej red, 8 green, 8 blue). Ale w pascalu o ile sie nie myle jest to zmienione i pascal przyjmuje po 6 bitow na kazda skladowa koloru.

    Wiec:

    
    Linijke
    
    SetRGBPalette(x, Palette[x].R, Palette[x].G, Palette[x].B); 
    
    zmien na
    
    SetRGBPalette(x, Palette[x].R>>2, Palette[x].G>>2, Palette[x].B>>2); 
    
    i chyba ruszy
    


    Powodzenia zycze

    PS.w razie niepowodzenia sprawdz set/get rgb palette czy kolor jaki zapisujesz jest dokladnie tym kolorem ktory wraca z getrgbpalette.
  • #8 1055497
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Macie racje przesuniecie o 2 bity pomaga, dzieki.

    MirekCz:1 uwaga -> w pascalu nie ma operatora ">>" pomylilo ci sie z C. Jego odpowiednikiem w paszczaku jest SHR (ale to tak w celu sprostowania).
  • #9 1055731
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    hihi, racja, SHR.. jak moglem o tym zapomniec...

    Ciesze sie, ze wszystko juz smiga. Milej zabawy zycze.

Podsumowanie tematu

✨ Problem dotyczy zniekształcenia kolorów podczas przenoszenia 8-bitowej palety z pliku BMP do trybu SVGA 640x480x256 w Pascalu z użyciem modułu GRAPH. Paleta BMP jest w formacie 24-bitowym (8 bitów na każdą składową RGB), natomiast karta graficzna w trybie VGA/SVGA wykorzystuje 6-bitowe rejestry kolorów. W efekcie bez odpowiedniego przeskalowania wartości kolorów następuje zniekształcenie barw. Rozwiązaniem jest przesunięcie bitowe wartości składowych RGB o 2 bity w prawo (w Pascalu operator SHR), co dopasowuje 8-bitowe wartości z pliku BMP do 6-bitowego formatu palety karty graficznej. Użycie funkcji SetRGBPalette z przesuniętymi bitami poprawia wyświetlanie kolorów. Dyskusja wskazuje również na ograniczenia i niską wydajność klasy GRAPH oraz alternatywne sterowniki BGI dla trybu 13h, które są szybsze, ale nie są używane w tym przypadku.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA