Jak zrobic konwersje trzech wartosci RGB na liczbe typu Word tak aby ta wartosc wykorzysac we funkcji ustawiajacej kolor tekstu na konsoli?
var kolor : TColor;
kolor := Image1.Canvas.Pixels[x, y];
r := GetRValue(kolor); //konwertowanie TColor na Byte
g := GetGValue(kolor); //konwertowanie TColor na Byte
b := GetBValue(kolor); //konwertowanie TColor na Byte
Ten kod da w wyniku 24 bity, a pytanie było o 16 bitów :)
Oto moja funkcja w C++
Wystarczy male zmiany zrobic i bedzie dobrze.
to jest przesuniecie bitowe w prawo
<< to jest przesuniecie bitowe w lewo
| - or
& and
WORD Graphics::RGB16(BYTE r, BYTE g, BYTE b)
{
// r = RRRR RRRR; g = GGGG GGGG; b = BBBB BBBB
WORD Red = (r >> 3); // 5 bitów = 3 bity w prawo = 000R RRRR
WORD Green = (g >> 2); // 6 bitów = 2 bity w prawo = 00GG GGGG
WORD Blue = (b >> 3); // 5 bitów = 3 bity w prawo = 000B BBBB
// Red = 0000 0000 000R RRRR
// Green = 0000 0000 00GG GGGG
// Blue = 0000 0000 000B BBBB
return (Red << 11) | (Green << 5) | Blue;
// Red = 11 bitów w lewo = RRRR R000 0000 0000
// Green = 5 bitów w lewo = 0000 0GGG GGG0 0000
// Blue = = 0000 0000 000B BBBB
// suma logiczna... OR
// wynik = RRRR RGGG GGGB BBBB
}
Napisałbym wcześniej, ale zapomniałem jak są rozłożone bity poszczególnych kolorów (dzięki za przypomnienie Piasiu).
Na pascala będzie to tak:
function RGB16(R, G, B: byte): word;
begin
result := ((R shr 3) shl 11) or ((G shr 2) shl 5) or (B shr 3);
end;
Chyba dobrze :-P
Dzieki wszystkim [hurra] [cya] [hurra]