Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329

Определение цвета: белый или черный?

31.01.2012, 11:06. Показов 5336. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня фон, оперделяемый юзером. Как прикинуть его яркость по RGB, например, чтобы принять решение печатать мне на нем белым или черным.
Т.е фон темный или светлый?
Ясен перец, что просто просуммировать составляющие RGB нельзя, ибо "G" в яркость вносит гораздо больший вклад, чем "B".

Кстати, может есть пример, как сами винды определяют цвет подписи (Ч или Б) к иконкам на рабочем столе, в зависимости от выбранной юзером заливки?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.01.2012, 11:06
Ответы с готовыми решениями:

Закрасить экран в черный и белый цвета
1.Составить программу, которая при нажатии клавиши "пробел" одну половину экрана красит в белый цвет, а вторую в черный. 2.Программа,...

При игре пропадает изображение на мониторе и появляется белый или другого цвета экран
проблема такая, при игре пропадает изображение на мониторе и появляется белый или другого цвета экран. помогает только перезагрузка, хотя...

Найти вероятность вытащить белый и черный шары
4 шара белых и 5 черных, какова вероятность что вытащат 1 белый и 1 черный

39
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
31.01.2012, 11:44
Vot etot kod pozvolit raschepit' zvet na komponenti. On v text box ustanavlivaet zvet, protivopolozhniy zvetu formi.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
 
Private Sub Form_Click()
    Dim C As Long, R As Byte, G As Byte, B As Byte
    C = Me.BackColor
    SplitRGB C, R, G, B
    TextBox1.BackColor = RGB(255 - R, 255 - G, 255 - B)
End Sub
 
Sub SplitRGB(ByVal Color As Long, R As Byte, G As Byte, B As Byte)
    If Color And &H80000000 Then
        Color = GetSysColor(Color And &HFF)
    End If
    R = Color And 255
    Color = Color  256
    G = Color And 255
    B = Color  256
End Sub
0
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
31.01.2012, 15:40  [ТС]
"Противоположный"- это надо понимать "дополнительный"?
Так это в светотехнике называется.
)
Но не нужен мне дополнительный цвет.
Я буду рисовать черным или белым, но вот как с ним определиться???

А может, кто знает, нельзя ли RGB перегнать в GrayScale, типа...
По идее он (GrayScale) должен быть с той же яркостью, что и исходный, а с уш с GrayScale определиться (темный, светлый) - элементарно. Уш как-нибудь.
)
0
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
31.01.2012, 15:42  [ТС]
Вдогонку:
RGB перегнать в GrayScale без дополнительных контролов! Чиста функция или формула...
0
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
31.01.2012, 18:20
Vi moj kod probovali xot'? Ya-to znayu, chto zvet dopolnitel'nyj. A vi znaete, chto moj kod kak raz i vipolnyaet vashu zadachu?
0
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
01.02.2012, 10:57  [ТС]
Пробовал.
Получил дополнительный цвет.
И что?
Задача остается той же: он "темный" или "светлый"?
)

Мне надо печатать не дополнительным (противоположным) цветом, а черным или белым! Каким?
0
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
01.02.2012, 16:30
О, дошло. Пока не знаю. Если узнаю, сообщу. Очень хорошая задача.
0
Сумрак
01.02.2012, 18:25
Забавно... Я наоборт не совсем понял вопроса, но понял где нужно посмотреть...
Книга - Джон Кларк Крейг, Джефф Уэбб "Visual Basic 5.0"
Тут есть примеры извращения над цветами...
Тут есть тема... Вычеслить "Цветовую константу по RGB или HSV значениям"
Код класса великоват, вилы набирать... но если в тему наберу..
Сумрак
01.02.2012, 18:29
Добавлю.. в конце прочитал..
Цветовая модель HSL аналогична HSV но использует целочисленные значения от 0 до 240 и несколько другой алгоритм их преобразования. В тоже время концептуально и функционально обе системы близки.
Сумрак
01.02.2012, 18:34
Судя из текста. Эта HSL использовалась в Win 95 и NT4 для определения допустимых цветов для системы....
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
01.02.2012, 18:46
Letter D,

Вот этот пример делает, что Вам надо. Магическое число 381 открывает дверь в черно-белый мир.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Option Explicit
 
Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
 
Private Sub Command1_Click()
    Dim C As Long, R As Integer, G As Integer, B As Integer
    
    C = Me.BackColor
    SplitRGB C, R, G, B
           '381= (3 x 127)
    If R + G + B > 381 Then
        Text1.BackColor = vbBlack
    Else
        Text1.BackColor = vbWhite
    End If
 
End Sub
 
 
 
Sub SplitRGB(ByVal Color As Long, R As Integer, G As Integer, B As Integer)
    If Color And &H80000000 Then
        Color = GetSysColor(Color And &HFF)
    End If
    R = Color And 255
    Color = Color  256
    G = Color And 255
    B = Color  256
End Sub
vladconn
0
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
01.02.2012, 21:58  [ТС]
Нет!
((((
Я в самом первом сообщении уберегал от этой ошибки:
[bold]Ясен перец, что просто просуммировать составляющие RGB нельзя, ибо "G" в яркость вносит гораздо больший вклад, чем "B".[/bold]

Например на чисто зеленом фоне (RGB:0,255,0) белым цветом особо не порисуешь. А ведь 255 < 381. Это неверный подход (
Надо как-то вычислять яркость. Кстати, при преобразовании в GrayScale этого чисто зеленого цвета фотошоп показал, что его яркость 87% !!!
У "R", "G" и "B" разные вклады в яркость, разные коэффициенты. (Кстати, разложить цвет на RGB я уж сумею, не надо постоянно этих формул )) Надо - идею!
Или пойду читать книшку по светотехнике, что-то там должно быть...
Неужели в виндах ничего нет? Сами-то они справляются с этой "проблемой"
0
1 / 1 / 0
Регистрация: 22.04.2011
Сообщений: 47
02.02.2012, 02:23
Y = 0.299*R + 0.587*G + .0114*B
0
1 / 1 / 0
Регистрация: 22.04.2011
Сообщений: 47
02.02.2012, 02:24
Опечатка. Последний коэффициент равен 0,114
0
1 / 1 / 0
Регистрация: 22.04.2011
Сообщений: 47
02.02.2012, 02:26
Ну, на практике, эту всю сумму делим на 3...
0
1 / 1 / 0
Регистрация: 22.04.2011
Сообщений: 47
02.02.2012, 02:27
Нет, с последним постом я чего-то переборщил. Ничего делить не надо.
0
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
02.02.2012, 05:34
Letter D,

Ну раз вы такой нежный и белым по зеленому для вас неэстетично, то ниже я привожу код для цветовых гурманов :0)

Mz@2,

У меня ощущение, что ваш код не всегда выдает черно-белое (не серое) решение.

ОК, в модуль идет этот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
Option Explicit
 
Public Type RGB
    R As Byte
    G As Byte
    B As Byte
End Type
 
Public Type HSL
    H As Double
    S As Double
    L As Double
End Type
 
Public Function HSL2RGB(pHSL As HSL) As RGB
 
  Dim dTmp1   As Double
  Dim dTmp2   As Double
  Dim dTmp(2) As Double
  
  Dim i As Byte
  
  Dim RGB As RGB
  
  'make sure the HSL values are valid
    If 0 > pHSL.H Or pHSL.H > 1 Or _
       0 > pHSL.S Or pHSL.S > 1 Or _
       0 > pHSL.L Or pHSL.L > 1 Then MsgBox "HSL values are not valid!", _
                                     vbOKOnly, "Error": Exit Function
    
    If pHSL.S = 0 Then 'the color is gray (all RGB values are equal)
    
      'and they are extracted from the Luminosity
        RGB.R = CByte(255 * pHSL.L)
        RGB.G = RGB.R
        RGB.B = RGB.R
        
    Else
    
        If pHSL.L < 0.5 Then
            dTmp2 = pHSL.L * (pHSL.S + 1)
        Else
            dTmp2 = (pHSL.L + pHSL.S) - (pHSL.L * pHSL.S)
        End If
        
        dTmp1 = (2 * pHSL.L) - dTmp2
        
      'calculate each color from the Hue value
        
        dTmp(0) = pHSL.H - (2 / 3)
        dTmp(1) = pHSL.H
        dTmp(2) = pHSL.H - (1 / 3)
        
        For i = 0 To 2
        
            If dTmp(i) < 0 Then dTmp(i) = dTmp(i) + 1
            
            If 6 * dTmp(i) < 1 Then
                dTmp(i) = dTmp1 + 6 * dTmp(i) * (dTmp2 - dTmp1)
            ElseIf 2 * dTmp(i) < 1 Then
                dTmp(i) = dTmp2
            ElseIf 3 * dTmp(i) < 2 Then
                dTmp(i) = dTmp1 + 6 * ((2 / 3) - dTmp(i)) * (dTmp2 - dTmp1)
            Else
                dTmp(i) = dTmp1
            End If
            
        Next i
        
        RGB.R = CByte(255 * dTmp(0))
        RGB.G = CByte(255 * dTmp(1))
        RGB.B = CByte(255 * dTmp(2))
        
    End If
    
  'return the results
    HSL2RGB = RGB
    
End Function
 
Public Function RGB2HSL(pRGB As RGB) As HSL
 
  Dim Rd As Double
  Dim Gd As Double
  Dim Bd As Double
  
  Dim Max As Double
  Dim Min As Double
  Dim Dif As Double
  Dim Sum As Double
  
  Dim HSL As HSL
  
  'scale down the RGB color values to a 0-1 range
    Rd = pRGB.R / 255
    Gd = pRGB.G / 255
    Bd = pRGB.B / 255
    
  'get the strongest color
    Max = 0
    
    If Rd > Max Then Max = Rd
    If Gd > Max Then Max = Gd
    If Bd > Max Then Max = Bd
    
  'get the weakest color
    Min = 1
    
    If Rd < Min Then Min = Rd
    If Gd < Min Then Min = Gd
    If Bd < Min Then Min = Bd
    
  'calculate Luminosity
    HSL.L = (Max + Min) / 2
    
    If Max = Min Then 'the color is gray (all RGB values are equal)
    
        HSL.S = 0
        HSL.H = 0 'this is actually undefined
        
    Else
    
        Dif = (Max - Min)
        Sum = (Max + Min)
        
      'calculate Saturation
        If HSL.L > 0.5 Then
            HSL.S = Dif / Sum
        Else
            HSL.S = Dif / (2 - Sum)
        End If
        
      'calculate Hue
        Select Case Max
        Case Rd
            HSL.H = ((Gd - Bd) / Dif)
        Case Gd
            HSL.H = ((Bd - Rd) / Dif) + 2
        Case Bd
            HSL.H = ((Rd - Gd) / Dif) + 4
        End Select
        
        HSL.H = HSL.H / 6
        
        If HSL.H < 0 Then HSL.H = HSL.H + 1
        
    End If
    
  'return the results
    RGB2HSL = HSL
    
End Function
0
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
02.02.2012, 11:11  [ТС]
VladConn,
[bold]"Ну раз вы такой нежный и белым по зеленому для вас неэстетично"[/bold] А Вы сами-то попробовали по [bold]яркозеленому[/bold] (0,255,0) написать белым?
)
Это для всех неэстетично.
Новый пример - это [bold]тоже не то[/bold] .
Он и для (255,0,0) и для (0,255,0) и для (0,0,255) возвращает одинаковую яркость, а это неправильно.
Собственно система HSL ("хью, сатурейшн, лайтнесс") - это "эф, лямбда, пэ" (поток, цвет, насыщенность цвета) в светотехнике, откуда известно, что ни поток, ни лайтнесс субъективной информации (для человеческого глаза!) не несут, если не известен цвет. А для энергетики - да, несут, а именно - энергия (яркость, поток) - одинаковы. Можно и инфракрас с такой же энергией послать... только мы его увидим черным.

Эта... т.е хотел сказать, что от HSL толку тоже никакого.

Буду пытать пример от Mz@2.
Там что-то проглядывает похожее на светотехническую формулу. Тока я думал, что зависимость должна быть нелинейной... а оно, вон как.
)
0
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
02.02.2012, 11:15  [ТС]
Хотя сам пример с функцией [bold]HSL2RGB[/bold] полезен. Это- полезная функция. )
0
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
02.02.2012, 14:04
Letter D
Насчет нежности - то шутка. Возвращаясь к проблеме яркости. Вы знаете, то что RGB2HSL и для (255,0,0) и для (0,255,0) и для (0,0,255) возвращает одинаковую яркость, так это как раз правильно. Я проверил в Paint. Только в нем он не лайтнесс, а luminosity. Что, впрочем, в сущности одно и тоже. Разница в нормировании. Там это от 0 до 240.

Главное скажите: оно для вас работает или нет? Я для некоторых цветов проверил - так у меня реагировало верно.

VladConn
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2012, 14:04
Помогаю со студенческими работами здесь

Изменить в другой программе белый текст на черный
Есть у кого идеи по этому поводу? За ранее благодарен

Окрасить одну половину экрана в белый цвет, а вторую - в черный
Использование модуля Graph. Составить программу, которая при нажатии, клавиши &quot;пробел&quot; одну половину экрана красит в белый цвет, а...

В приложениях белый фон поменялся на черный. и пропала контрастность в шрифтах metro
может я не по теме. но эта проблема меня достала. суть вот в чем: все норм работало, а потом в приложениях, которые от win8, типа почты,...

На шахматную доску случайным образом ставятся два слона – черный и белый
Всем доброго времени суток. Прошу помочь мне с решением задачки, никак не выходит... На шахматную доску случайным образом ставятся два...

Сколькими способами можно выбрать на шахматной доске два квадрата – белый и черный?
Сколькими способами можно выбрать на шахматной доске два квадрата – белый и черный?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru