Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Как разбить каринку на массив в VB 2005? Добавлено: 05.06.07 17:07  

Автор вопроса:  - MaAs† -™ | ICQ: 233628153 
Давно уже столкнулся с такой проблемой что в VB2005 совсем другие средства работы с графикой нежели в VB6. Собственно мне нужно разбить изображение из PictureBox (или любого другого контрола с картинкой) на отдельные пиксели и записать все это дело в массив (собствено только цвет). Так вот проблема - не могу понять как в VB2005 можно получить цвет пикселя с изображения, а вообще хочется узнать как такое реализовывается в VB2005.

Заранее спасибо.

Ответить

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

Номер ответа: 1
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #1
Добавлено: 06.06.07 00:26
Разбиваем.

' Handles the Click event of the Crop button.
    Private Sub btnCrop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrop.Click
        If IsValidCropValues() Then
            ' Initialize the variable that holds a copy of the bitmap before
            ' cropping, so the crop can be undone.
            imgUndo = picImage.Image
            btnUndo.Enabled = True

            ' Create a rectangle defined by the user's X,Y coordinates relative
            ' to the upper left corner of the PictureBox, and the desired width
            ' and length.
            Dim recSource As New Rectangle(CInt(txtXCoord.Text), CInt(txtYCoord.Text), CInt(txtWidth.Text), CInt(txtHeight.Text))

            ' Create a new, blank Bitmap on which you will draw the cropped
            ' image. Note: It is worth mentioning here a pitfall to avoid. You might
            ' be led to think that the process should involve creating a Graphics
            ' object off the PictureBox (not a new Bitmap) and then drawing the
            ' cropped image onto the PictureBox after clearing it, as such:
            '
            '   Dim grPicImage As Graphics = picImage.CreateGraphics
            '   grPicImage.Clear(picImage.BackColor)
            '   grPicImage.DrawImage(picImage.Image, 0, 0, recSource, _
            '        GraphicsUnit.Pixel)
            '
            ' This will appear to work. However, as soon as you use any of the other
            ' controls it will become apparent that the PictureBox image is still
            ' set to the original image, not the cropped image.

            Dim bmpCropped As New Bitmap(CInt(txtWidth.Text), CInt(txtHeight.Text))
            ' Get a Graphics object from the Bitmap for drawing.
            Dim grBitmap As Graphics = Graphics.FromImage(bmpCropped)
            ' Draw the image on the Bitmap anchored at the upper left corner.
            grBitmap.DrawImage(picImage.Image, 0, 0, recSource, GraphicsUnit.Pixel)
            ' Set the PictureBox image to the new cropped image.
            picImage.Image = bmpCropped
        End If
    End Sub


А в классе Bitmap, есть такой метод.

Gets the color of the specified pixel in this Bitmap.

[Visual Basic]
Public Function GetPixel( _
   ByVal x As Integer, _
   ByVal y As Integer _
) As Color

Ответить

Номер ответа: 2
Автор ответа:
 Dark



Вопросов: 4
Ответов: 41
 Профиль | | #2 Добавлено: 06.06.07 15:59
Ну зачем так жечь? Обращение к свойствам объекта весьма медленная процедура и даже для картинки 100*100 оно будет аццки тормозить.
Для помещения цветов пикселей в массив надо исполбзовать маршалинг:
[Visual Basic]

        '// Массив байт для картинки
        Dim bitmapBytes() As Byte
        '// Шаг или кратное.. Format32bppArgb содержит в пикселе 4 байта = ARGB
        '// При другом формате шаг, соответственно, другой
        Dim bytesStep As Int32 = 4
        '// Размер картинки
        Dim bounds As New Rectangle(0, 0, _bitmap.Width, _bitmap.Height)
        '// Количество байт в картинке
        Dim bytesCount As Int32 = _bitmap.Width * _bitmap.Height * bytesStep
        '// Изменяем размер массива для хранения картики
        ReDim bitmapBytes(bytesCount - 1)
        '// Блокируем участок памяти
        Dim bitmapData As BitmapData = _bitmap.LockBits(bounds, _
                                                        ImageLockMode.ReadWrite, _
                                                        _bitmap.PixelFormat)
        '// Получаем указатель на первый байт структуры Bitmap
        Dim bitmapPtr As IntPtr = bitmapData.Scan0
        '// Копируем участок памяти в наш массив
        Marshal.Copy(bitmapPtr, _
                     bitmapBytes, 0, _
                     bytesCount)
 '// Снимаем блокировку
        _bitmap.UnlockBits(bitmapData)

Ответить

Номер ответа: 3
Автор ответа:
 Dark



Вопросов: 4
Ответов: 41
 Профиль | | #3 Добавлено: 06.06.07 16:09
Естественно в начала надо добавить

Private _bitmap As Bitmap

_bitmap - исходная картинка.

Ответить

Номер ответа: 4
Автор ответа:
 - MaAs† -™



ICQ: 233628153 

Вопросов: 13
Ответов: 29
 Профиль | | #4 Добавлено: 06.06.07 16:42
Marshal.Copy(bitmapPtr, bitmapBytes, 0, bytesCount)
а можно поподробнее откуда взялся этот Marshal.Copy?

Ответить

Номер ответа: 5
Автор ответа:
 Dark



Вопросов: 4
Ответов: 41
 Профиль | | #5 Добавлено: 07.06.07 09:24
Imports System.Runtime.InteropServices

Ответить

Страница: 1 |

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



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