Разложение цвета на R,G,B

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Разложение цвета на R,G,B

Сообщение Ruslan Demidow » 26.07.2004 (Пн) 15:26

Подскажите плиз (а ещё лучше покажите :) ) алгоритм/процедуру разложения значения цвета (Long) на цвета R,G,B.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 26.07.2004 (Пн) 15:31

Поиском по old.vbstreets.org

Там это обсуждалось.
I don't understand. Sorry.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 27.07.2004 (Вт) 7:27

Оно кажется просто переменная состоящая из трез байтов. Которые соответственно и помнят каждый цвет. Разложить можно смещением байтов, или просто мат. операциями.
Где какой цвет будешь разбираться сам.
Я только обьясню как вычленить все три.

Делим число на 65536 (кажется) нацело естественно. И получаем первый байт с первым цветом.

Теперь множим полученное число на 65536 и вычитаем из данного числа. Полученое число (это два оставшихся байта) делим на 256 (нацело) и получаем второй байт.

Из того числа которое означает два последних байта вычитаем второй бай помноженный на 256. получаем третий байт.

Код: Выделить всё
'rgb as long искомый цвет
r = rgb/65536
g = (rgb-r*65536)/256
b = (rgb-r*65536)-g*256

Я давно не пишу на VB так что могут быть ошибки, в коде "/" это целочисленное деление. Так что как и что пусть поправят профи, а опщая суть такая.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 27.07.2004 (Вт) 9:14

Всем ответившим - спасибо.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.07.2004 (Вт) 9:22

GAGArin, красивее и быстрее использовать маску, cGreen = (cColor And &h00ff00&) / 256&
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 27.07.2004 (Вт) 9:44

alibek писал(а):GAGArin, красивее и быстрее использовать маску, cGreen = (cColor And &h00ff00&) / 256&

Alibek, а покажи, плиз, свой код для ражложения на цвета с использованием маски.
Спасибо.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 27.07.2004 (Вт) 9:46

Я всё это к чему спрашиваю?
Мне хочется в richtextbox'е сделать инверсию выбранного участка текста. Если есть более лёгкий способ сделать цвет инверсным в контроле (без преобразования в RGB и обратно), то буду рад узнать об этом.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.07.2004 (Вт) 9:55

Color = (Not (Color)) And &h00FFFFFF& - инвертирование

Red = (Color And &h0000FF&)
Green = (Color And &h00FF00&) / 256&
Blue = (Color And &hFF0000&) / 65536&
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 27.07.2004 (Вт) 10:14

alibek писал(а):Color = (Not (Color)) And &h00FFFFFF& - инвертирование

Red = (Color And &h0000FF&)
Green = (Color And &h00FF00&) / 256&
Blue = (Color And &hFF0000&) / 65536&

Спасибо большое, самое то! :)
Только вот загвоздка у меня с BackColor выделенного текста. :(
Нашёл только .BackColor, но это свойство всего текста, а мне надо выделенного текста. Как сделать?

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 27.07.2004 (Вт) 11:36

Ruslan Demidow писал(а):
alibek писал(а):GAGArin, красивее и быстрее использовать маску, cGreen = (cColor And &h00ff00&) / 256&

Alibek, а покажи, плиз, свой код для ражложения на цвета с использованием маски.
Спасибо.

Да я знал что можно цвет выделить так, но не знал как :lol:

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 04.08.2004 (Ср) 21:13

Ruslan Demidow писал(а):Я всё это к чему спрашиваю?
Мне хочется в richtextbox'е сделать инверсию выбранного участка текста. Если есть более лёгкий способ сделать цвет инверсным в контроле (без преобразования в RGB и обратно), то буду рад узнать об этом.

Я так понял, в данном случае необходима инверсия "как в блоке" - т.е. цвет текста заменить цветом фона, и наоборот? Тогда если A=ActiveColor, B=BackColor, то определяешь C=A Xor B и рисуешь им соответственно как XOR Pen'ом в нужном месте.[/code]
Листинги не горят!

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.08.2004 (Чт) 1:49

Ты не понял. Мне не рисовать нужно, а чтобы слово, которое я захочу, отображалось инверсным.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.08.2004 (Чт) 11:50

Кстати, самый простой способ инвертировать цвет Color - это Color Xor vbWhite. Безо всяких масок и т.п.
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.08.2004 (Чт) 12:03

tyomitch писал(а):Кстати, самый простой способ инвертировать цвет Color - это Color Xor vbWhite. Безо всяких масок и т.п.

А если пользователь у меня может менять в установках по умолчанию не только цвет шрифта текста, но и фон для richtextedit'а?
Т.е. например если фон белый, цвет шрифта чёрный - то пойдёт.
А если юзеру нравится читать текст белыми буквами на чёрном фоне?
То, мне кажется инвертированного текста он не увидит.

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

И снова я выпендрился.

Сообщение TEH3OP » 05.08.2004 (Чт) 13:02

Ruslan Demidow писал(а):
tyomitch писал(а):Кстати, самый простой способ инвертировать цвет Color - это Color Xor vbWhite. Безо всяких масок и т.п.

А если пользователь у меня может менять в установках по умолчанию не только цвет шрифта текста, но и фон для richtextedit'а?
Т.е. например если фон белый, цвет шрифта чёрный - то пойдёт.

Дык, тады вместе с цветом текста, и цвет фона инвертируй.
А если у тебя отдельно мона цвет фона и цвет текста менять, то уж простите, если твой юзверь додумается чёрный шрифт на белый поменять при белом цвете фона -- это его проблемма, а не твоя!!! ;-)

А вот разложить цвет на составляющие, можно и так (кстати это наиболее быстрый способ):
Код: Выделить всё
'Создай проект без форм с одним модулем. И встав в него этот код.

Option Explicit
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Public Type RGBColors
    rgbRed As Byte
    rgbGreen As Byte
    rgbBlue As Byte
    rgbReserved As Byte
End Type

Public Sub Main()
    Dim lngColor As OLE_COLOR
    Dim udtRGB As RGBColors
   
    lngColor = VBA.RGB(188, 81, 204)
   
    CopyMemory udtRGB, lngColor, 8
   
    'В Immediate будет это: "188 | 81 | 204"
    Debug.Print udtRGB.rgbRed; "|"; udtRGB.rgbGreen; "|"; udtRGB.rgbBlue
End Sub


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: И снова я выпендрился.

Сообщение tyomitch » 05.08.2004 (Чт) 14:59

TEH3OP писал(а):
Ruslan Demidow писал(а):
tyomitch писал(а):Кстати, самый простой способ инвертировать цвет Color - это Color Xor vbWhite. Безо всяких масок и т.п.

А если пользователь у меня может менять в установках по умолчанию не только цвет шрифта текста, но и фон для richtextedit'а?
Т.е. например если фон белый, цвет шрифта чёрный - то пойдёт.

Дык, тады вместе с цветом текста, и цвет фона инвертируй.

Собственно, по-моему так изначально задача и ставилась: проинвертировать весь регион текста, т.е. и шрифт, и фон.

TEH3OP писал(а):А вот разложить цвет на составляющие, можно и так (кстати это наиболее быстрый способ):
Код: Выделить всё
'Создай проект без форм с одним модулем. И встав в него этот код.

Option Explicit
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Public Type RGBColors
    rgbRed As Byte
    rgbGreen As Byte
    rgbBlue As Byte
    rgbReserved As Byte
End Type

Public Sub Main()
    Dim lngColor As OLE_COLOR
    Dim udtRGB As RGBColors
   
    lngColor = VBA.RGB(188, 81, 204)
   
    CopyMemory udtRGB, lngColor, 8
   
    'В Immediate будет это: "188 | 81 | 204"
    Debug.Print udtRGB.rgbRed; "|"; udtRGB.rgbGreen; "|"; udtRGB.rgbBlue
End Sub


Не наиболее быстрый. С PutMem4 точно быстрее, а с LSet, скорее всего, ещё быстрее.
И ещё: тут CopyMemory udtRGB, lngColor, 8 - должна быть четвёрка вместо восьмёрки.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.08.2004 (Чт) 15:08

Цвет фона можно задать только общий, не для отдельного слова, а мне нужно отдельного. Но я уже решил эту задачу с помощью tyomitch'а, за что ему ещё раз спасибо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 13

    TopList  
cron