Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Карта битов Добавлено: 27.01.08 15:17  

Автор вопроса:  Bonapart | Web-сайт: team16.tut.su | ICQ: 175256 

Ответить

  Ответы Всего ответов: 20  

Номер ответа: 16
Автор ответа:
 xuser



Вопросов: 1
Ответов: 20
 Профиль | | #16 Добавлено: 30.01.08 08:06
' 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

   ' Важлива семе така послідовність запису!!!
   ' Бо прийдеться користуватись атрибутами

   ;Dim B As Byte ' Синій канал
   ;Dim G As Byte ' Зелений канал
   ;Dim 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
   ;Dim _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
   ' Блокування графічної інформації зображення та передача до об'єкту читання
   ;Dim 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)
   ' Проведення попередньої обробки

   ;Dim 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

   ;Dim 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

Ответить

Номер ответа: 17
Автор ответа:
 Bonapart



ICQ: 175256 

Вопросов: 32
Ответов: 108
 Web-сайт: team16.tut.su
 Профиль | | #17
Добавлено: 31.01.08 07:27
у кого есть желание?

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #18
Добавлено: 31.01.08 08:36
Bonapart, найди описание устройства BMP файла простого без сжатия. И изучи. Просто не понятно, что тебе не понятно.

Ответить

Номер ответа: 19
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #19
Добавлено: 31.01.08 16:12
просто бонапарт категорически не хочет думать и напрягаца. бонапарт, если ты предложишь за готовый код пару десятков вмз - тебе с радостью помогут. ибо за лень и отсутствие ума\усидчивости надо платить...

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #20
Добавлено: 31.01.08 21:52
Пожалуй да.

Ответить

Страница: 1 | 2 |

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



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