Всем привет. Во вложении файлик с функцией получения из десятичного значения цвета, цвета в формате RGB
Насколько я знаю десятичное значение цвета ColorVal из RGB получается по формуле: ColorVal = 255^0*R + 255^1 * G + 255^2 * B
а как отсюда отбратно вычленить R , G и B ?
В функции ниже вычленение происходит по такой формуле (Загадка! как они их ОДНОГО уравнения с тремя неизвестными нашли эти три неизвестные):
R= ColorVal \ 256 ^ 0 And 255 G = ColorVal \ 256 ^ 1 And 255 B= ColorVal \ 256 ^ 2 And 255
Кто может объяснить , что делает оператор AND 255 в этих формулах?
[vba]
Код
Function DECIMAL2RGB(ColorVal) As Variant ' Converts a color value to an RGB triplet ' Returns a 3-element variant array DECIMAL2RGB = Array(ColorVal \ 256 ^ 0 And 255, ColorVal \ 256 ^ 1 And 255, ColorVal \ 256 ^ 2 And 255) End Function
[/vba]
Всем привет. Во вложении файлик с функцией получения из десятичного значения цвета, цвета в формате RGB
Насколько я знаю десятичное значение цвета ColorVal из RGB получается по формуле: ColorVal = 255^0*R + 255^1 * G + 255^2 * B
а как отсюда отбратно вычленить R , G и B ?
В функции ниже вычленение происходит по такой формуле (Загадка! как они их ОДНОГО уравнения с тремя неизвестными нашли эти три неизвестные):
R= ColorVal \ 256 ^ 0 And 255 G = ColorVal \ 256 ^ 1 And 255 B= ColorVal \ 256 ^ 2 And 255
Кто может объяснить , что делает оператор AND 255 в этих формулах?
[vba]
Код
Function DECIMAL2RGB(ColorVal) As Variant ' Converts a color value to an RGB triplet ' Returns a 3-element variant array DECIMAL2RGB = Array(ColorVal \ 256 ^ 0 And 255, ColorVal \ 256 ^ 1 And 255, ColorVal \ 256 ^ 2 And 255) End Function
255 это 11111111 в двоичном виде AND в данном случае производит побитное логическое И и например 85,85,85 буде закодировано как 010101001010101101010101 ( 5 548 885) 000000000000000011111111 =================== 000000000000000001010101 (85) делением на 256 просто сдвигаеются разряды на 8 бит.
каждый цвет закодирован в 8 разрядах. Вот и весь фокус.
255 это 11111111 в двоичном виде AND в данном случае производит побитное логическое И и например 85,85,85 буде закодировано как 010101001010101101010101 ( 5 548 885) 000000000000000011111111 =================== 000000000000000001010101 (85) делением на 256 просто сдвигаеются разряды на 8 бит.
Function DECIMAL2RGB(ColorVal) As Variant ' Converts a color value to an RGB triplet ' Returns a 3-element variant array With Application DECIMAL2RGB = .Bitand(.Bitrshift(ColorVal, Array(0, 8, 16)), &HFF) End With End Function
Function DECIMAL2RGB(ColorVal) As Variant ' Converts a color value to an RGB triplet ' Returns a 3-element variant array With Application DECIMAL2RGB = .Bitand(.Bitrshift(ColorVal, Array(0, 8, 16)), &HFF) End With End Function
Справка показала , что функция Bitshift(x,y) сдвигает битовое Х на Y разрядов. У вас в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как? И еще непонятно , что такое &HFF ...
Понимаю, что может быть это глупые вопросы и если скучно разжевывать , то все равно спасибо за ответ.
Спасибо за ответ. Видимо это очевидно для профи, но я -пока чайник и не понял эту строку.
Справка показала , что функция Bitshift(x,y) сдвигает битовое Х на Y разрядов. У вас в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как? И еще непонятно , что такое &HFF ...
Понимаю, что может быть это глупые вопросы и если скучно разжевывать , то все равно спасибо за ответ.t330
Разряды сдвигать чтоб получить именно те 8 бит чем закодирован следующий цвет.
Что-то я запутался.
RGB - это представление цвета в виде трех байтов по 8 бит.
То есть Цвет в RGB формате можно записать так:
Цвет = rrrrrrrgggggggbbbbbbbb (8 бит для оттенков Red, потом 8бит для оттенков Gren и потом 8 бит для оттенков Blue ИТОГО 24 бита)
Чтобы вычленить из Цвета отдельные Байты для Red Green и Blue , нужно сделать следующее:
Чтобы получить старшие 8 бит для Red = rrrrrrrr нужно арифметически сдвинуть вправо на 16 разрядов весь Цвет= rrrrrrrgggggggbbbbbbbb , что эквивалентно побитовому делению на 256^2
Чтобы получить вторые 8 бит для Green = gggggggg нужно сначала арифметически сдвинуть вправо на 8 разрядов Цвет= rrrrrrrgggggggbbbbbbbb , что эквивалентно побитовому делению на 256 а далее полученное после сдвига значение rrrrrrrggggggg обрезать до последних 8 битов через оператор логического И то есть rrrrrrrggggggg AND 255 = ggggggg = Green
Чтобы получить самые младшие 8 бит для Blue = bbbbbbbb нужно просто значение Цвета = rrrrrrrgggggggbbbbbbbb обрезать до последних 8 битов через оператор логического И то есть rrrrrrrgggggggbbbbbbbb AND 255 = bbbbbbbb = Blue
Если я все правильно понял , то тогда почему в коде
[vba]
Код
DECIMAL2RGB = Array(ColorVal \ 256 ^ 0 And 255, ColorVal \ 256 ^ 1 And 255, ColorVal \ 256 ^ 2 And 255)
[/vba]
первое значение в массиве = ColorVal \ 256 ^ 0 And 255 - это Red , а не Blue ? Должно же быть наоборот!
ColorVal \ 256 ^ 0 And 255 расшифровывается как выборка из значения Colorval младших 8 битов , то есть цвет BLUE, а не REd...
Либо я где-то ошибаюсь, либо в файлу Уокенбаха ошибка...
Разряды сдвигать чтоб получить именно те 8 бит чем закодирован следующий цвет.
Что-то я запутался.
RGB - это представление цвета в виде трех байтов по 8 бит.
То есть Цвет в RGB формате можно записать так:
Цвет = rrrrrrrgggggggbbbbbbbb (8 бит для оттенков Red, потом 8бит для оттенков Gren и потом 8 бит для оттенков Blue ИТОГО 24 бита)
Чтобы вычленить из Цвета отдельные Байты для Red Green и Blue , нужно сделать следующее:
Чтобы получить старшие 8 бит для Red = rrrrrrrr нужно арифметически сдвинуть вправо на 16 разрядов весь Цвет= rrrrrrrgggggggbbbbbbbb , что эквивалентно побитовому делению на 256^2
Чтобы получить вторые 8 бит для Green = gggggggg нужно сначала арифметически сдвинуть вправо на 8 разрядов Цвет= rrrrrrrgggggggbbbbbbbb , что эквивалентно побитовому делению на 256 а далее полученное после сдвига значение rrrrrrrggggggg обрезать до последних 8 битов через оператор логического И то есть rrrrrrrggggggg AND 255 = ggggggg = Green
Чтобы получить самые младшие 8 бит для Blue = bbbbbbbb нужно просто значение Цвета = rrrrrrrgggggggbbbbbbbb обрезать до последних 8 битов через оператор логического И то есть rrrrrrrgggggggbbbbbbbb AND 255 = bbbbbbbb = Blue
Если я все правильно понял , то тогда почему в коде
[vba]
Код
DECIMAL2RGB = Array(ColorVal \ 256 ^ 0 And 255, ColorVal \ 256 ^ 1 And 255, ColorVal \ 256 ^ 2 And 255)
[/vba]
первое значение в массиве = ColorVal \ 256 ^ 0 And 255 - это Red , а не Blue ? Должно же быть наоборот!
ColorVal \ 256 ^ 0 And 255 расшифровывается как выборка из значения Colorval младших 8 битов , то есть цвет BLUE, а не REd...
Либо я где-то ошибаюсь, либо в файлу Уокенбаха ошибка...t330
Шестнадцатеричное представление числа 255, по совместительству RGB(255,0,0), vbRed t330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как?
в коде я использовал вызов функции листа БИТ.СДВИГП и БИТ.И (Bitrshift и Bitand соответсвенно), только забыл указать, что работает только начиная с Excel 2013. Вызов функций листа в vba в контексте Application позволяет предоставлять им массивы в качестве аргументов (в отличие от вызова в контексте WorksheetFunction).
t330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
Шестнадцатеричное представление числа 255, по совместительству RGB(255,0,0), vbRed t330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как?
в коде я использовал вызов функции листа БИТ.СДВИГП и БИТ.И (Bitrshift и Bitand соответсвенно), только забыл указать, что работает только начиная с Excel 2013. Вызов функций листа в vba в контексте Application позволяет предоставлять им массивы в качестве аргументов (в отличие от вызова в контексте WorksheetFunction).krosav4ig
То есть в RGB последние 8 бит - это BLUE Тогда почему для получения BLUE выполняется сдвиг вправо на 16 разрядов в формуле ColorVal \ 256 ^ 2 And 255 ? Ведь BLUE - это последние 8 бит из 24 битного RGB числа?
По логике чтобы получить последние 8 бит для BLUE формула должна быть без всяких сдвигов вот такая: ColorVal And 255
То есть в RGB последние 8 бит - это BLUE Тогда почему для получения BLUE выполняется сдвиг вправо на 16 разрядов в формуле ColorVal \ 256 ^ 2 And 255 ? Ведь BLUE - это последние 8 бит из 24 битного RGB числа?
По логике чтобы получить последние 8 бит для BLUE формула должна быть без всяких сдвигов вот такая: ColorVal And 255t330