tasumisra Ответов: 2

Как преобразовать 24-битный rgb в 8-битный rgb


Здравствуйте Друзья,

можете ли вы помочь мне преобразовать 24-битное RGB-изображение в 8-битное RGB-изображение?..

и 16-битная серая шкала до 24-битного RGB..

Спасибо,
PS: Я новичок в программировании изображений и изучаю новые аспекты

Что я уже пробовал:

я попытался сдвинуть биты, как показано ниже ...
r = r >> 1;
g = g >> 2;
b = b >> 1;

2 Ответов

Рейтинг:
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