Страница: 1 |
Страница: 1 |
Вопрос: Работа с цветами
Добавлено: 08.12.07 02:53
Автор вопроса: Winand | Web-сайт:
имеется картинка цветная. Нужно сделать зеленую (цвет пофиг, главное принцип).
Я переделываю её в grayscale сначала:
Для каждого пикселя домножаю значение R, G и B на коэффициенты 0.299, 0.587 и 0.114 соответственно. Затем складываю. Результат присваиваю обратно R, G и B.
А чтобы озеленить=) картинку просто прибавляю к Green еще 30.
ВОТ ТУТ ТО я и подумал, что, если так сделать с белым пикселем, то будет ошибка. Ведь R, G, B равны 255. А я прибавляю еще 30.
Кароч, что делать-то?
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Yanex
ICQ: 387761649
Вопросов: 32
Ответов: 169
Web-сайт:
Профиль | | #1
Добавлено: 08.12.07 12:35
If OldG + 30 > 255 Then NewG = 255 Else NewG = OldG + 30
Так наверное. Или я что-то не понимаю? Хотя тут есть еще одна штука: можно не только подымать G, но и уменьшать G и B. Например, если R=255, то G и B уменьшить на 30. Они ведь тоже по 255, не так ли?
Номер ответа: 2
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #2
Добавлено: 08.12.07 14:06
Нет, а если изначально цвет был зеленый?
R=0, B=0, G=255
Должен быть наверное универсальный способ, или нет?)
Номер ответа: 3
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #3
Добавлено: 08.12.07 14:13
Есть функция в WIN32 - AlphaBlend,
один из ее параметров: BLENDFUNCTION.
Посмотри в MSDN.
Номер ответа: 4
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #4
Добавлено: 08.12.07 15:48
Это вообще не подойдет. В проекте используется
LaVolpe 32bpp DIB Suite (http://planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=67466&lngWId=1) от LaVolpe.
Там массив сделан. Поэтому нужно мо-ди-фи-ци-ровать каждый пиксель.
Номер ответа: 5
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #5
Добавлено: 08.12.07 15:57
Сначала уменшь все цвета на 30%, потом к зеленому прибавь 30
Номер ответа: 6
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #6
Добавлено: 08.12.07 16:13
Может приготится кому
Переведенный в оттенки серого (NTSCPAL) цвет смешиваем с другим цветом:
Dim lSrcR As Long
Dim lSrcG As Long
Dim lSrcB As Long
Dim lDstR As Long
Dim lDstG As Long
Dim lDstB As Long
Dim lDstGray As Long
lSrcR = cColorFrom And &HFF
lSrcG = (cColorFrom And &HFF00& \ &H100&
lSrcB = (cColorFrom And &HFF0000) \ &H10000
lDstR = cColorTo And &HFF
lDstG = cColorTo \ &H100& And &HFF
lDstB = cColorTo \ &H10000 And &HFF
lDstGray = lDstR * 0.299 + lDstG * 0.587 + lDstB * 0.0114
ColorPix = RGB(((lSrcR * alpha) / 255) + ((lDstGray * (255 - alpha)) / 255), _
 (lSrcG * alpha) / 255) + ((lDstGray * (255 - alpha)) / 255), _
 (lSrcB * alpha) / 255) + ((lDstGray * (255 - alpha)) / 255))
End Function
Цвет смешиваем с другим цветом:
Dim lSrcR As Long
Dim lSrcG As Long
Dim lSrcB As Long
Dim lDstR As Long
Dim lDstG As Long
Dim lDstB As Long
lSrcR = cColorFrom And &HFF
lSrcG = (cColorFrom And &HFF00& \ &H100&
lSrcB = (cColorFrom And &HFF0000) \ &H10000
lDstR = cColorTo And &HFF
lDstG = (cColorTo And &HFF00& \ &H100&
lDstB = (cColorTo And &HFF0000) \ &H10000
CombinePixs = RGB(((lSrcR * alpha) / 255) + ((lDstR * (255 - alpha)) / 255), _
 (lSrcG * alpha) / 255) + ((lDstG * (255 - alpha)) / 255), _
 (lSrcB * alpha) / 255) + ((lDstB * (255 - alpha)) / 255))
End Function
Номер ответа: 7
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #7
Добавлено: 08.12.07 16:14
Всем спасибо)
Номер ответа: 8
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #8
Добавлено: 08.12.07 18:01
именно в BLENDFUNCTION и приводится, как модифицировать.
Номер ответа: 9
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #9
Добавлено: 08.12.07 20:52
EUGY, так там ведь массив байтов, описывающий каждый канал каждого пикселя. Не думаю, что можно справиться с ним с помощью API. Хотя... надо попробовать, ведь это все-таки DIB