Kolor 16Bit --> TColor

0

W jaki sposób mogę zamienić kolor zapisany jako 16bajtowa liczba na jego większy odpowiednik, czyli TColor? Znalazłem taki oto kod:

Color=( (((Color16 >> 10) & 0x1F) * 0xFF / 0x1F) |
((((Color16 >> 5) & 0x1F) * 0xFF / 0x1F) << 8) |
((( Color16 & 0x1F) * 0xFF / 0x1F) << 16));

Niestety po przetłumaczeniu na op nie chce działać :(.

Color:=(((Color shr 10) and $01F)$0FF/$01F) or ((((Color shr 5) and $01F)$0FF/$01F) shl 8) or (((Color and $01F)*$0FF/$01F) shl 16);

Proszę więc o przetłumaczenie tego kodu na pascalowy, ale działający :). Może też być jakiś inny sposób, byle by działało. A już najfajniej by było, gdyby można było obliczyć od razu składowe rgb :).

// Dopisane
Faktycznie, wykorzystywanych jest tylko 15 bitów, pierwszy jest nieużywany. Dzięki za kod, będę go zaraz testował. A msz może algorytm, działający w odwrotną stronę, tzn konwertujący rgb na najbliższy kolor w tymformacie?

0

Przy kodowaniu 16-bitowym zwykle jest system:
55, czyli najwięcej bitów jest na kolor zielony przeznaczone.

  R := (Kolor and $1F)*$FF div $1F;
  G := (Kolor shr 5 and $3F)*$FF div $3F;
  B := (Kolor shr 11 and $1F)*$FF div $1F;

Jak patrzę na ten kod, to tu raczej jest 15-bitowe kodowanie, więc po 5 bitów na każdą składową. Więc powinno być tak:

  R := (Kolor and $1F)*$FF div $1F;
  G := (Kolor shr 5 and $1F)*$FF div $1F;
  B := (Kolor shr 10 and $1F)*$FF div $1F;

A w twoim tłumaczeniu jest jeden błąd. '/' z C należy w tym wypadku na 'div' tłumaczyć.

0
Kolor := R*$1F div $FF or G*$1F div $FF shl 8 or (B*$1F div $FF shl 16;

Ale może lepiej spróbować wykorzystać funkcję API dopasowującą najbliższy kolor (GetNearestColor)? Nie wiem co prawda, czy z 16 bitami pracuje.

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