Рейтинг:
16
CPallini
Как было отмечено например здесь "цвета - как преобразовать 24 - битный RGB в 8-битный RGB-переполнение стека"[^] формат 8 бит на пиксель обычно используется в качестве индекса палитры.
Однако предположим, что у вас есть следующие форматы:
bit number 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
b7 b6 b5 b4 b3 b2 b1 b0 g7 g6 g5 g4 g3 g2 g1 g0 r7 r6 r5 r4 r3 r2 r1 r0
bit number 7 6 5 4 3 2 1 0
B1 B0 G2 G1 G0 R2 R1 R0
Then
B1 = b7, B0 = b6
G2 = g7, G1 = g6, G0 = g5
R2 = r7, r1 = r6, r0 = r5
that is
b = (rgb >> 16) & 0xFF;
g = (rgb >> 8) & 0xFF;
r = rgb & 0xFF;
B = b >> 6;
G = g >> 5;
R = r >> 5;
RGB = (B << 6) | ( G << 3 ) | R;
tasumisra
Большое вам спасибо,Паллини, я так долго ждал вашего ответа, и я знаю, что вы чемпион :) не могли бы вы помочь мне с некоторыми хорошими учебниками\ссылками для того же самого...
кроме того, как преобразовать 16-битную серую шкалу в 24-битную RGB ... просто исследую несколько вещей вокруг
CPallini
Видеть здесь
http://stackoverflow.com/questions/835753/convert-grayscale-value-to-rgb-representation
Единственное отличие заключается в том, что ваше изображение имеет 16-битный оттенок серого, поэтому вам придется выполнить дополнительный предварительный шаг:
серый = серый >> 8
jartinez
Ваше решение неверно. Чтобы преобразовать 24-битный цвет в 8-битный цвет, вы должны учитывать, что 255 должно быть преобразовано в 7, поэтому формула должна быть Red3 = Red8 * 7 / 255
8-битный цвет = (красный * 7/25) < & lt; 5 + (Зеленый * 7/25) < & lt; 2 + (синий * 3/25)
В вашем примере цвет #c0c0c0 приведет к неправильному 8-битному RGB. Протестируйте его с помощью этой ссылки:
http://neildowning.com/HEX_to_RGB_color_converter.php
CPallini
Мое решение, конечно, правильное :-D
0xC0C0C0
b = 0xC0 = 10100000b
g = 0xC0 = 10100000b
r = 0xC0 = 10100000b
B = b >> 6 = 00000010b
G = g >> 5 = 00000101b
R = r >> 5 = 00000101b
RGB = (B << 6) | ( G << 3 ) | R = 10101101b
Это 10110110b с обратным битом.
Рейтинг:
1
jartinez
Код для VB.NET
Private Function ColorRGB8bits(ByVal RGBColor As Color) As Byte
'Converts RGB (Hex 24 bits) to 8-bit color
'(3 bits for red, 3 bits for green and 2 bits for blue)
'To convert 8bit [0 - 255] value into 3bit [0, 7]
'the 0 Is Not a problem, but remember 255 should be converted To 7
'so the formula should be Red3 = Red8 * 7 / 255.
'To convert 24bit color into 8bit (RRRGGGBB):
'8bit Color = (Red * 7 / 255) << 5 + (Green * 7 / 255) << 2 + (Blue * 3 / 255)
Dim r, g, b As Byte
Dim RGB8BIT As Byte
Dim RGB24BIT As Long
RGB24BIT = RGBColor.ToArgb And &HFFFFFF 'Mask with &H00FFFFFF to remove the Alpha
b = RGB24BIT And &HFF
g = (RGB24BIT >> 8) And &HFF
r = (RGB24BIT >> 16) And &HFF
RGB8BIT = ((r * 7 / 255) << 5) + ((g * 7 / 255) << 2) + (b * 3 / 255)
Return RGB8BIT
End Function