RGB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VBfrv
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 04.03.2008 (Вт) 23:45

RGB

Сообщение VBfrv » 04.03.2008 (Вт) 23:52

Приветствую всех. По поводу графики вопрос. Мне нужно разложить цвет в точке изображения на три переменные R,G, и B. Я знаю только один оператор получения цвета точки -
x = picture1.Point (i,j). Этот оператор возвращает одно число, можно ли получить информацию о точке с разбиением на R G B каналы? Заранее спасибо.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 05.03.2008 (Ср) 0:20

В VC++ есть замечательные макросы -- GetR[G, B]Value... а в VB ручками, CopyMemory или побитовые операции.

Ну, или так:

Код: Выделить всё
        B = Color \ 65536: Color = Color Mod 65536
        G = Color \ 256: Color = Color Mod 256
        R = Color
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 05.03.2008 (Ср) 5:19

BV это что? оно работает?

R = (color And &HFF)
G = ((color \ 256) And &HFF)
B = ((color \ 65536) And &HFF)

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

Сообщение alibek » 05.03.2008 (Ср) 9:28

Можно еще и так.
Код: Выделить всё
Private Type RGBType
  Red As Byte
  Green As Byte
  Blue As Byte
  Alpha As Byte
End Type

Private Type CType
  Color As Long
End Type

...

Dim C1 As CType
Dim C2 As RGBType
...
LSet C2 = C1
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 05.03.2008 (Ср) 14:25

И еще способ с HEX'ами:

Если преобразовать цвет в хексы, получим строку вида FFFFFFFF
Где разряды соответствуют:
Код: Выделить всё
1   2     3    4
FF  FF    FF   FF
Red Green Blue Alpha


Примечание: и этот же метод и метод с конструкциями сработает также для преобразования четырех октетов IP в одно число формата Long для перебора IP-адресов, например..
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

VBfrv
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 04.03.2008 (Вт) 23:45

Сообщение VBfrv » 06.03.2008 (Чт) 15:39

Всем огромное спасибо. Первый вариант работает. Непонятно как, но работает ) Все гениальное просто.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 06.03.2008 (Чт) 16:42

Что непонятного? Цвет = 65536 * синий + 256 * зелёный + красный

Отсюда и формулы.

VBfrv
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 04.03.2008 (Вт) 23:45

Сообщение VBfrv » 06.03.2008 (Чт) 21:08

Вот теперь все предельно ясно. Но первый вариант не работает с отрицительными значениями цвета. А оператор Point частенько такие выдает. Вариант с HFF эту проблему устраняет.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 07.03.2008 (Пт) 8:41

Ещё вариант:
Код: Выделить всё
Private Type RGBQUAD
        rgbBlue As Byte
        rgbGreen As Byte
        rgbRed As Byte
        rgbReserved As Byte
End Type

Private Declare Sub PutMem4 Lib "msvbvm60" (ddDest As Any, ByVal ddValue As Long)

Private Sub Command1_Click()
Dim col As Long
Dim rgb As RGBQUAD

col = &H102030
PutMem4 rgb, col

Me.Caption = rgb.rgbRed & " - " & rgb.rgbGreen & " - " & rgb.rgbBlue
End Sub

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 07.03.2008 (Пт) 8:50

HiSER, уже было по сути тоже самое
Весь мир матрица, а мы в нем потоки байтов!


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

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

Сейчас этот форум просматривают: Google-бот и гости: 35

    TopList