' vb7 (при желании можно перевести на vb6)
' vb7 - потому что ориентировано на Net Framework 1.1 (не 3.5 же) которая есть у всех (как и msvbvm60.dll)
' За комментарии извиняюсь - содрал куски кода со своего проекта (хотя, думаю все поймут).
' ----------------------------------------------------------------
' Важно знать - поля значений RGB, ARGB идут в обратном порядке:
' BGRA (вместо ARGB), BGR (вместо RGB) при записи пикселей 32 и 24 bpp соответственно
Public Module Module1
' -----------------------------------------------------------
' Структура роботи з 24-бітовим кольором (3 байти на структуру)
' -----------------------------------------------------------
Public Structure RGB
' Важлива семе така послідовність запису!!!
' Бо прийдеться користуватись атрибутами
 im B As Byte ' Синій канал
 im G As Byte ' Зелений канал
 im R As Byte ' Червоний канал
' Створення структури на базі вказаного кольору
Public Sub New(ByRef c As Color)
R = c.R : G = c.G : B = c.B
End Sub
' Ініціалізація структури з вказаними значеннями каналів
Public Sub New(ByVal r As Byte, _
ByVal g As Byte, ByVal b As Byte)
Me.R = r : Me.G = g : Me.B = b
End Sub
' Отримання кольору для поточних значень каналів
Private Function GetColor() As Color
Return Color.FromArgb(255, R, G, B)
End Function
' Призначення значень каналів з вказаного кольору
Private Sub SetColor(ByRef c As Color)
R = c.R : G = c.G : B = c.B
End Sub
' Отримання нової структури
Public Shared Function FromColor(ByRef c As Color) As RGB
Return New RGB(c)
End Function
End Structure
' -----------------------------------------------------------------------------
' Копіювання даних з пам'яті до одновимірного масиву структур rgb, де
' dst - елемент масиву, куди починати копіювати а bytes - кількість байт
' копіювання з пам'яті (по 3 байти на один елемент масиву)
Public Declare Auto Sub CopyMemoryToRgb Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef dst As RGB, ByVal src As IntPtr, ByVal bytes As Integer)
' Копіювання даних з масиву до пам'яті
Public Declare Auto Sub CopyMemoryFromRgb Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal dst As IntPtr, ByVal src() As RGB, ByVal bytes As Integer)
' Виходячи з відомої ширини зображення та необхідної позиції на 2D-поверхні
' отримання 1D-позиції елементу структури RGB одновимірного масиву RGB
Private Function Pos(ByVal width As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
Return (y * width) + x
End Function
' Редагування зображення
' - імпорт даних з пам'яті до одновимірного масиву структур RGB
' - обробка, через застосування фільтру "Відбиток"
' - перезапис оригінальних даних зображення
Friend Function Emboss(ByRef src As Bitmap) As Bitmap
On Error Resume Next
 im _width, _height, _length As Integer, origin(), data() As RGB
' Збереження ширини та висоти зображення в пікселах, а також
' довжини графічних даних в пам'яті в байтах (по три байти на кожен піксел)
_width = src.Width : _height = src.Height : _length = _width * _height * 3
ReDim data((_width * _height) - 1) ' Перерозмір масиву структур rgb
' Блокування графічної інформації зображення та передача до об'єкту читання
 im bmpData As Imaging.BitmapData = src.LockBits(New Rectangle(0, 0, _width, _height), _
Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format24bppRgb)
' Копіювання інформації з пам'яті до одновимірного масиву структур rgb
Call CopyMemoryToRgb(data(0), bmpData.Scan0, _length)
origin = data.Clone
' Розблокування зображення та звільнення задіяних ресурсів
src.UnlockBits(bmpData)
' Проведення попередньої обробки
 im v(3), x, y, w, h As Integer, block(2, 2), _
color As RGB, _x_y(2, 2), s, depth, multiplier As Single
h = _height - 1 : w = _width - 1
depth = 0.5 ' Глибина - можна регулювати (наприклад -1.0 ... 1.0 і т.д.)
_x_y(0, 0) = -depth
_x_y(0, 1) = -depth
_x_y(0, 2) = -depth
_x_y(1, 0) = -depth
_x_y(1, 1) = 1
_x_y(1, 2) = depth
_x_y(2, 0) = depth
_x_y(2, 1) = depth
_x_y(2, 2) = depth
multiplier = 1 ' Множник - можна регулювати (наприклад -1.0 ... 1.0 і т.д.)
' Обробка графічної інформації
For x = 1 To w - 1
For y = 1 To h - 1
color = data(Pos(_width, x, y))
' -------------------------------------
' Чинання кольорів блоку 3x3
block(0, 0) = origin(Pos(_width, x - 1, y - 1))
block(0, 1) = origin(Pos(_width, x, y - 1))
block(0, 2) = origin(Pos(_width, x + 1, y - 1))
block(1, 0) = origin(Pos(_width, x - 1, y))
block(1, 1) = origin(Pos(_width, x, y))
block(1, 2) = origin(Pos(_width, x + 1, y))
block(2, 0) = origin(Pos(_width, x - 1, y + 1))
block(2, 1) = origin(Pos(_width, x, y + 1))
block(2, 2) = origin(Pos(_width, x + 1, y + 1))
' R
v(1) = _x_y(0, 0) * block(0, 0).R + _
_x_y(0, 1) * block(0, 1).R + _
_x_y(0, 2) * block(0, 2).R + _
_x_y(1, 0) * block(1, 0).R + _
_x_y(1, 1) * block(1, 1).R + _
_x_y(1, 2) * block(1, 2).R + _
_x_y(2, 0) * block(2, 0).R + _
_x_y(2, 1) * block(2, 1).R + _
_x_y(2, 2) * block(2, 2).R
v(1) *= multiplier
If v(1) < 0 Then v(1) = 0
If v(1) > 255 Then v(1) = 255
color.R = v(1)
' G
v(2) = _x_y(0, 0) * block(0, 0).G + _
_x_y(0, 1) * block(0, 1).G + _
_x_y(0, 2) * block(0, 2).G + _
_x_y(1, 0) * block(1, 0).G + _
_x_y(1, 1) * block(1, 1).G + _
_x_y(1, 2) * block(1, 2).G + _
_x_y(2, 0) * block(2, 0).G + _
_x_y(2, 1) * block(2, 1).G + _
_x_y(2, 2) * block(2, 2).G
v(2) *= multiplier
If v(2) < 0 Then v(2) = 0
If v(2) > 255 Then v(2) = 255
color.G = v(2)
' B
v(3) = _x_y(0, 0) * block(0, 0).B + _
_x_y(0, 1) * block(0, 1).B + _
_x_y(0, 2) * block(0, 2).B + _
_x_y(1, 0) * block(1, 0).B + _
_x_y(1, 1) * block(1, 1).B + _
_x_y(1, 2) * block(1, 2).B + _
_x_y(2, 0) * block(2, 0).B + _
_x_y(2, 1) * block(2, 1).B + _
_x_y(2, 2) * block(2, 2).B
v(3) *= multiplier
If v(3) < 0 Then v(3) = 0
If v(3) > 255 Then v(3) = 255
color.B = v(3)
' ----------------------------------
data(Pos(_width, x, y)) = color
Next y
Next x
 im bData As IntPtr = Marshal.AllocHGlobal(_length) ' Виділення пам'яті
' Копіювання графічних даних з одновимірного масиву структур RGB до пам'яті
Call CopyMemoryFromRgb(bData, data, _length)
' Створення нового (обробленого) зображення з даних в пам'яті
Return New Bitmap(_width, _height, _width * 3, Drawing.Imaging.PixelFormat.Format24bppRgb, bData)
End Function
End Module
Ответить
|