kolor bialy FFF7FF 16Bitowy a 32 FFFFFF

0

ktos mi moze wyjasnic o co chodzi

jesli pobieram dane bmp.canvas.Pixels to bialy to ffffff w trybie 16 bitowym
jesli pobieram dane scanline to bialy to fff7ff w trybie 16 bitowym
natomiast w trybie 32 jest identycznie czyli ok . ffffff

czy ktos jest w stanie udzielic mi informacji jak zmusic scanline co zastosowac by kolor bialy byl ffffff
jakies smieszne przesuniecie jest na kolorku zielonym czy to mozliwe by pixel i scanline widzialy ten sam obraz inaczej ?? LOL

0

pewny jesteś że te ff7f dotyczy białego piksela ? scanline czyta prosto z pamięci więc piksel 16 bitowy będzie zajmował dwa bajty i co tyle musisz się przesuwać, biały to będzie wtedy 0xFFFF, jeśli chcesz mieć w formacie 24 bitowym to musisz sobie obliczyć

0

prostuje kolor to taki mala literowke popelnilem .. ff7fff

kolor := PColor(ptr2)^ ;
kolor := RGB(GetBValue(kolor), GetGValue(kolor), GetRValue(kolor));
wiec to w zielonym kolorku jest cos nie tak ..

jesli ktos wie jak obliczyc te kolory dla 24 bitow to prosze o pomoc

Pozdrawiam

0

Ponieważ w dostępie przez Pixels wykorzystywane są funkcja Winapi GetPixel/SetPixel, które obsługują tylko tryb 24 bitowy, trybie 16 bitowym jedyny poprawny dostęp do pamięci to dostęp bezpośredni (ScanLine).

Dodatkowo interpretacja:

kolor := PColor(ptr2)^ ;
kolor := RGB(GetBValue(kolor), GetGValue(kolor), GetRValue(kolor));

jest zupełnie niepoprawna, ponieważ ptr2 (zakładam, że pobrany w dostępie przez ScanLine) nie wskazuje na PColor a na PWord. Swoją drogą na PColor nie wskazuje ani w dostępie 24 bitowym ani nawet 32 bitowym (a na PRGBQuad, PRGBTriple).

Zatem wartość zwrócona do zmiennej kolor już jest nieprawidłowa i rozkładanie jej na RGB (nawet z zamianą składowych) nie ma sensu.

Napisz konkretnie, jaki cel przyświeca Twoim poszukiwaniom.

0

@Szczawik
usiluje zrobic funkcje do przeszukiwania za wybranym pikselem jednak nie moge brac pod uwage funkcji getpixel winapi .

oto moje wypociny cos tutaj na pewno jest nie tak bo to 4 dzien mojej dzialalnosci w Delphi

function pixelsearch(X, Y,X1,Y1: Integer;color:string): string;
const
CAPTUREBLT = $40000000;
var

hdcScreen: HDC;
hdcCompatible: HDC;
bmp: TBitmap;
hbmScreen: HBITMAP;
kolor: Tcolor;
ptr : pointer;
ptr2: pointer;
i: integer;
ii:integer;
posx:integer;
posy:integer;
begin

hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
hdcCompatible := CreateCompatibleDC(hdcScreen);
hbmScreen := CreateCompatibleBitmap(hdcScreen,1024,768);
SelectObject(hdcCompatible, hbmScreen);
bmp := TBitmap.Create;
bmp.Handle := hbmScreen;
BitBlt(hdcCompatible, 0, 0,X1-X, Y1-Y, hdcScreen, X, Y, SRCCOPY or CAPTUREBLT);
posx:=0;
posy:=0;
for i:=1 to Y1-Y-1 do
begin
ptr := Pointer(Integer(bmp.ScanLine[i]));

for ii:=1 to X1-X-1 do
begin
ptr2 := Pointer(integer(ptr) + (ii*4) );
kolor := PColor(ptr2)^ ;
kolor := RGB(GetBValue(kolor), GetGValue(kolor), GetRValue(kolor));

if color = inttohex(integer(kolor),8) then
begin
posx:= ii+X;
posy:=i+Y;
{wyskok na koniec}
end;
//sleep(500);
end;
end;

0

Z tego co rozumiem, chcesz na ekranie w trybie 16 bitowym znaleźć w kwadracie (x, y, x1, y1) współrzędne piksela o kolorze color? Jeśli tak, to powyższy kod niewiele się do tego nadaje.

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