Страница: 1 |
Страница: 1 |
Вопрос: Как разбить каринку на массив в VB 2005?
Добавлено: 05.06.07 17:07
Автор вопроса: - MaAs† -™ | ICQ: 233628153
Давно уже столкнулся с такой проблемой что в VB2005 совсем другие средства работы с графикой нежели в VB6. Собственно мне нужно разбить изображение из PictureBox (или любого другого контрола с картинкой) на отдельные пиксели и записать все это дело в массив (собствено только цвет). Так вот проблема - не могу понять как в VB2005 можно получить цвет пикселя с изображения, а вообще хочется узнать как такое реализовывается в VB2005.
Заранее спасибо.
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #1
Добавлено: 06.06.07 00:26
Разбиваем.
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.
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
Номер ответа: 5
Автор ответа:
Dark
Вопросов: 4
Ответов: 41
Профиль | | #5
Добавлено: 07.06.07 09:24
Imports System.Runtime.InteropServices