Смотрите также :

|CD Interface| Фракталы| Альтернативные решения| Главная (фреймы)

Операции с цветом

Рассмотрим операции с цветом на наиболее простом примере - размытие. Алгоритм размытия представляет собой четыре вложенных цикла. В первых двух переменная "пробегает" по всему полю обрабатываемого изображения, последние вложенные циклы вычисляют среднее значение каждого пиксела, а результат помещается в исходный пиксел. Это достаточно просто. Вопрос заключается в другом: как вычисляется средний цвет? Пусть у нас переменная lgColor хранит значение цвета текущего пиксела (lgColor as Long).  Тогда средним цветом назовем среднее арифметическое каждой их трех состовляющих цвета. Поскольку lgColor= RGB(RED,GREEN,BLUE), где RGB - функция, возвращающая 24-х битовое значение цвета, то для цвета введем новый тип:

Type RGBColor
   Red as Byte
   Green as Byte
   Blue as Byte
End Type

Функция, выделяющая три составляющие цвета наоборот будет иметь вид:

Public Function GetRGBFromLong (ByVal color As Long) As RGBColor ' обратная функции RGB()
With GetRGBFromLong
     .Red = color& Mod 256
     .Green = (color& \ 256) Mod 256
     .Blue = (color& \ 65536) Mod 256
End With
End Function

Теперь уже можно привести код размытия:

Public Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public myPicture() As Long
Public ImagePicture() As Long

Public Sub Blur()
On Error Resume Next
ReDim myPicture(Picture1.ScaleWidth, Picture1.ScaleHeight)
ReDim ImagePicture(Picture1.ScaleWidth, Picture1.ScaleHeight)
Static i&, j&, k &, l&, r&, g &, b&, sr&, sg &, sb&
       'Заполнение массивов
For i& = 1 To Picture1.ScaleWidth
     For j& = 1 To Picture1.ScaleHeight
          myPicture(i&, j&) = GetPixel(Picture1.hdc, i &, j&)
    Next j&
Next i&
     'Размытие
For i& = 0 To Picture1.ScaleWidth
      For j& = 0 To Picture1.ScaleHeight
           sr& = 0
           sg& = 0
           sb& = 0
              For k& = i& - 1 To i& + 1 '  "1"  - шаг просмотра
                    For l& = j & - 1 To j& + 1
                          If l& >= 0 And k& >= 0 Then
                             sr& = sr& + GetRGBFromLong(myPicture(k &, l&)).Red
                             sg& = sg& + GetRGBFromLong(myPicture(k &, l&)).Green
                             sb& = sb& + GetRGBFromLong(myPicture(k &, l&)).Blue
                          End If
                    Next l&
              Next k&
           sr& = sr& / 9 'вычисляем средние значения, "9" -коэффициент
           sg& = sg& / 9
           sb& = sb& / 9
          SetPixelV Picture2.hdc, i &, j&, RGB(sr&, sg&, sb&)
     Next j&
Next i&
Picture2.Picture = Picture2.Image ' для того, чтоб изображение не исчезало
End Sub

Примечание. Степень размытия можно изменять. Для этого вводится переменная BlurFactor , которая заменяет единицы во второй паре вложенных циклов (шаг просмотра). Тогда коэффициент для среднего арифметического будет вычисляться по формуле:

(2*BlurFactor +1)^2

Дополнение. У объектов Picture1 и Picture2 свойство AutoRedraw должно быть = True.


Ниже приведены примеры работы данного кода

До размытия После размытия BlurFactor

2

sample.GIF (5139 bytes)

7

Мещанинов Николай, 31 июля 2001

Смотрите также :

| CD Interface | Фракталы | Альтернативные решения | Главная (фреймы)





Hosted by uCoz