[Delphi] 32bitowa bitmapa i rysowanie po masce

0

Witam, mam sobie obiekt TBitmap z 32bitową bitmapą w środku. Teraz chcę coś na niej narysować i problem jest taki, że rysuje mi też po masce (czwartym kanale bitmapy) to samo wartością alpha 0. W efekcie jak dam np. napis, to prześwituje przez niego to co było pod spodem. Czy dałoby się to jakoś wyłączyć, aby operacje na canvasie dotyczyły tylko kanałów RGB?

0

Swego czasu napisałem program graficzny, i nie spotkałem się z takimi problemami. Upewnij się, czy niechcący nie ładujesz do bajtu kanału alfa wartości z R; zwróć uwagę na kolejność bajtów: R (bity 0-7), G (8-15), B (16-23), A (24-32), obrazowo to ujmując - które czytane od lewej w rejestrze procesora są w kolejności od nastarszego do najmłodszego, natomiast w pamięci ułożone są od najmłodszego do najstarszego, a stąd już niewiele potrzeba, żeby pomylić coś, np. podczas odwołania innego niż przez zmienną czterobajtową. Jeśli przeprowadzasz operacje na pojedynczych bajtach, to tam może tkwić problem.

0

Może źle ująłem problem. Przy samodzielnym rysowaniu na poziomie bajtów wszystko jest ok, ale jeśli mam wykorzystać metody canvasa takie jak rectangle, czy textout, to operacja wykonywana jest na wszystkich czterech kanałach. Aktualnie poradziłem sobie zapisując fragment maski w pamięci, a potem ładując go z powrotem, ale to nie jest zbyt elegancka metoda. Jeśli ktoś ma jakiś pomysł, to będę wdzięczny za informacje.

0

hmm ja proponuje zrobić taki "Myk"
Przed Rysowniem Na Bitmapie 32bitowej przeskanowac ją ;-P ScanLinem i zapamiętać ustawienia tego
4-tego nieszczęsnego bajtu dla każdego pixela
następnie cos rysujesz
i znowu lecisz scan'Linem ztym że teraz odtwarzasz te bajty pixela

albo stworzyć sobie procedure rysującą bitmapę 32 bitową na bitmapie 32 bitowej (oczywiście na scanLine)
odbywa się to tak:
Rysujesz "Na Brudno" to co masz narysować a potem to samo przerysowywujesz w ScanLine omijając 4 bajt każdego pixela (oczywiście obie bitmapy 32bitowe i tych samych wielkości)
Przykład :

procedure DrawWithoutReserved(Bitmap32bit,NormalBitmap:TBitmap);
var
H,V:Integer;
WskNormal // wskaznik do pixela bitmapy "brudnopisu" po niej rysujesz jak po canvasie
,Wsk32bit:^TRGBQuad;  // wsk do  pixela bitmapy "oryginału"
begin

for V:=0 to NormalBitmap.Height -1 do
begin
WskNormal:=NormalBitmap.ScanLine [V];
Wsk32bit:=Bitmap32bit.ScanLine[V];
for H:=0 to NormalBitmap.Width -1 do
  begin
  Wsk32bit^.rgbBlue :=WskNormal^.rgbBlue;   //przepisuje tylko interesujące mnie bajty
  Wsk32bit^.rgbGreen :=WskNormal^.rgbGreen;
  Wsk32bit^.rgbRed :=WskNormal^.rgbRed;
 inc(Wsk32bit);
 inc(WskNormal);
  end;
end;
end;

Nie sprawdzałem ale powinno chodzić

1 użytkowników online, w tym zalogowanych: 0, gości: 1