Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Работа с цветами Добавлено: 08.12.07 02:53  

Автор вопроса:  Winand | Web-сайт: winandfx.narod.ru
имеется картинка цветная. Нужно сделать зеленую (цвет пофиг, главное принцип).

Я переделываю её в 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-сайт: Progr.Do.am
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #6
Добавлено: 08.12.07 16:13
Может приготится кому
Переведенный в оттенки серого (NTSCPAL) цвет смешиваем с другим цветом:
Public Function ColorPix(ByVal cColorFrom As Long, ByVal cColorTo As Long, Optional ByVal alpha As Long = 128) As Long
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

Цвет смешиваем с другим цветом:
Public Function CombinePixs(ByVal cColorFrom As Long, ByVal cColorTo As Long, Optional ByVal alpha As Long = 128) As Long
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-сайт: winandfx.narod.ru
 Профиль | | #7
Добавлено: 08.12.07 16:14
Всем спасибо)

Ответить

Номер ответа: 8
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #8 Добавлено: 08.12.07 18:01
мо-ди-фи-ци-ровать каждый пиксель

именно в BLENDFUNCTION и приводится, как модифицировать.

Ответить

Номер ответа: 9
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #9
Добавлено: 08.12.07 20:52
EUGY, так там ведь массив байтов, описывающий каждый канал каждого пикселя. Не думаю, что можно справиться с ним с помощью API. Хотя... надо попробовать, ведь это все-таки DIB

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам