Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Преобразование цветов в RGB и обратно - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Преобразование цветов в RGB и обратно (Макросы/Sub)
Преобразование цветов в RGB и обратно
t330 Дата: Четверг, 16.05.2019, 18:29 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Всем привет.
Во вложении файлик с функцией получения из десятичного значения цвета, цвета в формате 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]
К сообщению приложен файл: color_conversio.xlsm(49.3 Kb)
 
Ответить
СообщениеВсем привет.
Во вложении файлик с функцией получения из десятичного значения цвета, цвета в формате 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]

Автор - t330
Дата добавления - 16.05.2019 в 18:29
bmv98rus Дата: Четверг, 16.05.2019, 19:32 | Сообщение № 2
Группа: Проверенные
Ранг: Участник клуба
Сообщений: 2524
Репутация: 436 ±
Замечаний: 0% ±

Excel 2013/2016
255 это 11111111 в двоичном виде
AND в данном случае производит побитное логическое И
и например 85,85,85 буде закодировано как
010101001010101101010101 ( 5 548 885‬)‬
000000000000000011111111
===================
000000000000000001010101 (85)
делением на 256 просто сдвигаеются разряды на 8 бит.

000000000101010101010101 (21 845)‬
000000000000000011111111
===================
000000000000000001010101 (85)

000000000000000001010101 (21 845)‬
000000000000000011111111
===================
000000000000000001010101 (85)

каждый цвет закодирован в 8 разрядах. Вот и весь фокус.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение255 это 11111111 в двоичном виде
AND в данном случае производит побитное логическое И
и например 85,85,85 буде закодировано как
010101001010101101010101 ( 5 548 885‬)‬
000000000000000011111111
===================
000000000000000001010101 (85)
делением на 256 просто сдвигаеются разряды на 8 бит.

000000000101010101010101 (21 845)‬
000000000000000011111111
===================
000000000000000001010101 (85)

000000000000000001010101 (21 845)‬
000000000000000011111111
===================
000000000000000001010101 (85)

каждый цвет закодирован в 8 разрядах. Вот и весь фокус.

Автор - bmv98rus
Дата добавления - 16.05.2019 в 19:32
krosav4ig Дата: Четверг, 16.05.2019, 20:13 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2162
Репутация: 902 ±
Замечаний: 0% ±

Excel 2007,2010,2013
что делает оператор AND 255 в этих формулах?

Извлекает младший байт
[vba]
Код
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
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение
что делает оператор AND 255 в этих формулах?

Извлекает младший байт
[vba]
Код
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
[/vba]

Автор - krosav4ig
Дата добавления - 16.05.2019 в 20:13
t330 Дата: Суббота, 18.05.2019, 01:05 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016


000000000000000001010101 (21 845)‬
000000000000000011111111
===================
000000000000000001010101 (85)

каждый цвет закодирован в 8 разрядах. Вот и весь фокус.


Спасибо за ответ.
У вас нет ошибки ? Почему в последнем И в скобках 21845 ?

И еще вопрос:
делением на 256 просто сдвигаеются разряды на 8 бит.

Зачем сдвигать на 8 бит разряды?
 
Ответить
Сообщение


000000000000000001010101 (21 845)‬
000000000000000011111111
===================
000000000000000001010101 (85)

каждый цвет закодирован в 8 разрядах. Вот и весь фокус.


Спасибо за ответ.
У вас нет ошибки ? Почему в последнем И в скобках 21845 ?

И еще вопрос:
делением на 256 просто сдвигаеются разряды на 8 бит.

Зачем сдвигать на 8 бит разряды?

Автор - t330
Дата добавления - 18.05.2019 в 01:05
t330 Дата: Суббота, 18.05.2019, 01:14 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Спасибо за ответ.
Видимо это очевидно для профи, но я -пока чайник и не понял эту строку.

DECIMAL2RGB = .Bitand(.Bitrshift(ColorVal, Array(0, 8, 16)), &HFF)


Справка показала , что функция Bitshift(x,y) сдвигает битовое Х на Y разрядов.
У вас в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как?
И еще непонятно , что такое &HFF ...

Понимаю, что может быть это глупые вопросы и если скучно разжевывать , то все равно спасибо за ответ.
 
Ответить
СообщениеСпасибо за ответ.
Видимо это очевидно для профи, но я -пока чайник и не понял эту строку.

DECIMAL2RGB = .Bitand(.Bitrshift(ColorVal, Array(0, 8, 16)), &HFF)


Справка показала , что функция Bitshift(x,y) сдвигает битовое Х на Y разрядов.
У вас в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как?
И еще непонятно , что такое &HFF ...

Понимаю, что может быть это глупые вопросы и если скучно разжевывать , то все равно спасибо за ответ.

Автор - t330
Дата добавления - 18.05.2019 в 01:14
bmv98rus Дата: Суббота, 18.05.2019, 12:16 | Сообщение № 6
Группа: Проверенные
Ранг: Участник клуба
Сообщений: 2524
Репутация: 436 ±
Замечаний: 0% ±

Excel 2013/2016
У вас нет ошибки ?

да, копипэст подвел, там 85

Разряды сдвигать чтоб получить именно те 8 бит чем закодирован следующий цвет.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение
У вас нет ошибки ?

да, копипэст подвел, там 85

Разряды сдвигать чтоб получить именно те 8 бит чем закодирован следующий цвет.

Автор - bmv98rus
Дата добавления - 18.05.2019 в 12:16
t330 Дата: Воскресенье, 19.05.2019, 20:35 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Разряды сдвигать чтоб получить именно те 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
Дата добавления - 19.05.2019 в 20:35
krosav4ig Дата: Понедельник, 20.05.2019, 13:50 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 2162
Репутация: 902 ±
Замечаний: 0% ±

Excel 2007,2010,2013
t330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
что такое &HFF

Шестнадцатеричное представление числа 255, по совместительству RGB(255,0,0), vbRed
t330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как?
в коде я использовал вызов функции листа БИТ.СДВИГП и БИТ.И (Bitrshift и Bitand соответсвенно), только забыл указать, что работает только начиная с Excel 2013. Вызов функций листа в vba в контексте Application позволяет предоставлять им массивы в качестве аргументов (в отличие от вызова в контексте WorksheetFunction).


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 20.05.2019, 15:49
 
Ответить
Сообщениеt330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
что такое &HFF

Шестнадцатеричное представление числа 255, по совместительству RGB(255,0,0), vbRed
t330, в VB цвет в шестнадцатеричном представлении кодируется в виде &Hbbggrr, в HTML в виде #rrggbb
в формуле вместо Y стоит массив Array (0,8,16) а не число... Это как?
в коде я использовал вызов функции листа БИТ.СДВИГП и БИТ.И (Bitrshift и Bitand соответсвенно), только забыл указать, что работает только начиная с Excel 2013. Вызов функций листа в vba в контексте Application позволяет предоставлять им массивы в качестве аргументов (в отличие от вызова в контексте WorksheetFunction).

Автор - krosav4ig
Дата добавления - 20.05.2019 в 13:50
t330 Дата: Понедельник, 20.05.2019, 14:15 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Спасибо, начал понимать.

Осталось разобраться с фразой:
Шестнадцатеричное представление числа 255, по совместительству RGB(0,0,255), vbRed


То есть, RGB(0,0,255) - это RED?

Вот тут http://x-phantom.ru/zhtml/tablica_cvetov_html.php пишут , что RGB(0,0,255) - это не RED , а BLUE

Или в VB все наоборот?
 
Ответить
СообщениеСпасибо, начал понимать.

Осталось разобраться с фразой:
Шестнадцатеричное представление числа 255, по совместительству RGB(0,0,255), vbRed


То есть, RGB(0,0,255) - это RED?

Вот тут http://x-phantom.ru/zhtml/tablica_cvetov_html.php пишут , что RGB(0,0,255) - это не RED , а BLUE

Или в VB все наоборот?

Автор - t330
Дата добавления - 20.05.2019 в 14:15
RAN Дата: Понедельник, 20.05.2019, 15:02 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 5121
Репутация: 1023 ±
Замечаний: 0% ±

2010
[vba]
Код
ActiveCell.Interior.Color = rgb(0,0,255)
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
ActiveCell.Interior.Color = rgb(0,0,255)
[/vba]

Автор - RAN
Дата добавления - 20.05.2019 в 15:02
t330 Дата: Понедельник, 20.05.2019, 15:30 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
ActiveCell.Interior.Color = rgb(0,0,255)


Спасибо.
RGB (0,0,255) - это BLUE.

То есть в RGB последние 8 бит - это BLUE
Тогда почему для получения BLUE выполняется сдвиг вправо на 16 разрядов в формуле ColorVal \ 256 ^ 2 And 255 ?
Ведь BLUE - это последние 8 бит из 24 битного RGB числа?

По логике чтобы получить последние 8 бит для BLUE формула должна быть без всяких сдвигов вот такая: ColorVal And 255
 
Ответить
Сообщение
ActiveCell.Interior.Color = rgb(0,0,255)


Спасибо.
RGB (0,0,255) - это BLUE.

То есть в RGB последние 8 бит - это BLUE
Тогда почему для получения BLUE выполняется сдвиг вправо на 16 разрядов в формуле ColorVal \ 256 ^ 2 And 255 ?
Ведь BLUE - это последние 8 бит из 24 битного RGB числа?

По логике чтобы получить последние 8 бит для BLUE формула должна быть без всяких сдвигов вот такая: ColorVal And 255

Автор - t330
Дата добавления - 20.05.2019 в 15:30
t330 Дата: Понедельник, 20.05.2019, 15:43 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
В общем сдается мне, что в RGB в побитовом формате расположение цветов идет вот по такой схеме:

bbbbbbb gggggggg rrrrrrrr
то есть сначала идут 8 бит оттенков BLUE
затем идут 8 бит оттенков Green
затем идут 8 бит оттенков Red

BLUE -GREEN- RED
а не RED - GREEN-BLUE

Например:
берем rgb(0,0,255)
в десятичном формате это 16 711 680

в двоичном формате - это 11111111 00000000 00000000

Отсюда видно ,что первые 8 бит = 11111111 - это и есть BLUE , а не RED

ПЦ...
Зачем они так сделали? RGB в двоичном виде оказывается BGR ... чтобы людей запутать наверное)))
 
Ответить
СообщениеВ общем сдается мне, что в RGB в побитовом формате расположение цветов идет вот по такой схеме:

bbbbbbb gggggggg rrrrrrrr
то есть сначала идут 8 бит оттенков BLUE
затем идут 8 бит оттенков Green
затем идут 8 бит оттенков Red

BLUE -GREEN- RED
а не RED - GREEN-BLUE

Например:
берем rgb(0,0,255)
в десятичном формате это 16 711 680

в двоичном формате - это 11111111 00000000 00000000

Отсюда видно ,что первые 8 бит = 11111111 - это и есть BLUE , а не RED

ПЦ...
Зачем они так сделали? RGB в двоичном виде оказывается BGR ... чтобы людей запутать наверное)))

Автор - t330
Дата добавления - 20.05.2019 в 15:43
krosav4ig Дата: Понедельник, 20.05.2019, 15:43 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 2162
Репутация: 902 ±
Замечаний: 0% ±

Excel 2007,2010,2013
пишут , что RGB(0,0,255) - это не RED , а BLUE
ну там же про HTML коды цвета пишут

вот, например, RGB(196,212,72)
в js получение html кода цвета можно написать так
[vba]
Код
((196*256<<8)+212*256+72).toString(16) //результат - c4d448
[/vba]
в excel vba hex представление цвета
[vba]
Код
application.dec2hex(rgb(196,212,72),6) 'результат - 48D4C4
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 20.05.2019, 15:53
 
Ответить
Сообщение
пишут , что RGB(0,0,255) - это не RED , а BLUE
ну там же про HTML коды цвета пишут

вот, например, RGB(196,212,72)
в js получение html кода цвета можно написать так
[vba]
Код
((196*256<<8)+212*256+72).toString(16) //результат - c4d448
[/vba]
в excel vba hex представление цвета
[vba]
Код
application.dec2hex(rgb(196,212,72),6) 'результат - 48D4C4
[/vba]

Автор - krosav4ig
Дата добавления - 20.05.2019 в 15:43
krosav4ig Дата: Понедельник, 20.05.2019, 15:50 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 2162
Репутация: 902 ±
Замечаний: 0% ±

Excel 2007,2010,2013
То есть, RGB(0,0,255) - это RED?
это мой глюк, думаю про младший байт, пишу 255 справа...
Исправил в посте


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение
То есть, RGB(0,0,255) - это RED?
это мой глюк, думаю про младший байт, пишу 255 справа...
Исправил в посте

Автор - krosav4ig
Дата добавления - 20.05.2019 в 15:50
t330 Дата: Понедельник, 20.05.2019, 16:19 | Сообщение № 15
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Всем спасибо, вроде допетрил:)
 
Ответить
СообщениеВсем спасибо, вроде допетрил:)

Автор - t330
Дата добавления - 20.05.2019 в 16:19
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Преобразование цветов в RGB и обратно (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2019 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!