Преобразование цвета в Ч/Б

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Преобразование цвета в Ч/Б

Сообщение -=TsA=- » 11.07.2007 (Ср) 7:24

Уважаемые, а есть какая нибудь функция для преобразования цвета (32bpp) в оттенки серого (32bpp)? Или хотя бы формула?
Сам делаю так:
Код: Выделить всё
R = Int(C / 65536 / 3)
G = Int((C Mod 65536) / 256 / 3)
B = Int((C Mod 256) / 3)
C = R Or G Or B
C = RGB(С, С, С)

но не устраивает скорость. :?

ЗЫ. Чуть подправил :wink:

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Сообщение djalex777 » 11.07.2007 (Ср) 9:15

Оттенки серого тоже бывают разные ;) Стандартные получаются усреднением суммы всех компонент цвета. Вот пример кода:

Код: Выделить всё
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Function GetGrayscaleColor(cl As Long) As Long
Dim b(0 To 3) As Byte, tmp_cl As Byte, get_cl As Long
CopyMemory ByVal VarPtr(b(0)), ByVal VarPtr(cl), 4
tmp_cl = CByte((CLng(b(0)) + CLng(b(1)) + CLng(b(2))) / 3)
b(0) = tmp_cl
b(1) = tmp_cl
b(2) = tmp_cl
CopyMemory ByVal VarPtr(get_cl), ByVal VarPtr(b(0)), 4
GetGrayscaleColor = get_cl
End Function

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

Сообщение tyomitch » 11.07.2007 (Ср) 9:29

djalex777 писал(а):Оттенки серого тоже бывают разные ;) Стандартные получаются усреднением суммы всех компонент цвета.

Гон. Чисто-жёлтый светлее чисто-синего.

Правильный код: http://bbs.vbstreets.ru/viewtopic.php?p=79704#79704
Изображение

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 11.07.2007 (Ср) 9:51

Спасибо

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

Сообщение HiSER » 11.07.2007 (Ср) 15:06

Мой вариант конвертации:
Код: Выделить всё
Color = Fix(Color / &H10101) * &H10101


Попробовал на примере tyomitch'a, работает по быстрей.

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

Сообщение tyomitch » 11.07.2007 (Ср) 16:27

HiSER тоже думает, что яркости трёх основных цветов равны?
Пусть тогда читает спецификации NTSC, к примеру.
Изображение

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

Сообщение HiSER » 11.07.2007 (Ср) 18:19

Понял... Осознал свою ошибку... :)


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

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

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

    TopList