Страница: 1 |
Страница: 1 |
Вопрос: GDI+ ), часть 2. Работа с битмапом
Добавлено: 14.01.07 23:10
Автор вопроса: -АлександР- | Web-сайт:
Здравствуйте!
Нашел на msdn пример с bitmap
Public Class Form1
Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As IntPtr) As Boolean
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bm As New Bitmap("Picture.jpg")
Dim hBitmap As IntPtr
hBitmap = bm.GetHbitmap(Color.Blue)
' Do something with hBitmap.
DeleteObject(hBitmap)
End Sub
End Class
1) Данный пример выдает ошибку: недопустимый параметр здесь: Dim bm As New Bitmap("Picture.jpg")
никак не могу избавиться от этой ошибки
2) как использовать класс битмап... для работы с изображением в программе, например нарисованное на PictureBox
Заранее спасибо!
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #1
Добавлено: 15.01.07 00:24
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Картинка As New Bitmap(“Мой Рисунок.JPG”)’ это адрес файла можно (“C:\папка
с рисункама\ Мой Рисунок.JPG” )
PictureBox1.Image = Картинка
End Sub
Вот ещё
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Картинка As New Bitmap(“Мой Рисунок.JPG”)
 im Графика As Graphics
Графика.DrawImage(Картинка, 0, 0)
End Sub
Номер ответа: 2
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #2
Добавлено: 15.01.07 01:04
никак не могу избавиться от этой ошибки
Ошибка банальная.. Надо указать полный путь к картинке, иначе студия его не находит..
Что значит КАК??? Брать и использовать! Что конкретно ты хочешь сделать, и что у тебя не получается!? Конкретней, уважаемый, конкретней...
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 15.01.07 01:57
И еще.. этот пример вряд ли чем тебе поможет при работе с Bitmap.. Это скорее пригодится для извращения с API! опять ты за свое??? Знакомые буквы встретил?.. Hbitmap Забудь ты про них.. )) Они тут не нужны...
Номер ответа: 4
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #4
Добавлено: 15.01.07 14:41
Георгич, спасибо за рабочий пример. Длля начала сойдет)))
EROS
Ищу в вб.нет аналоги АПИ GetBitmapBits, SetBitmapBits, GetDiBits, SetDiBitsToDevice.....
угу ))))
без битмапа меленно получается.....
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 15.01.07 15:01
а ты в цикле что ли пикселы перебираешь?? )) Разумеется, это будет медленно.. тут надо через Маршаллинг получать весь массив байт картинки из памяти, менять что надо и пихать обратно..
Номер ответа: 6
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #6
Добавлено: 15.01.07 16:01
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 15.01.07 16:52
Inherits System.Object
Member of: System.Runtime.InteropServices
Summary:
Provides a collection of methods for allocating unmanaged memory, copying unmanaged memory blocks, and converting managed to unmanaged types, as well as other miscellaneous methods used when interacting with unmanaged code.
Номер ответа: 8
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #8
Добавлено: 15.01.07 17:12
А есть какой-нибудь пример работы с этим классом?
Без разницы, что он делает. Хоть какой-нибудь, я разберусь )...
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 15.01.07 20:33
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Imports System.Runtime.InteropServices
''' <summary>
''' VS 2005
''' </summary>
''' <remarks>EROS :138089885</remarks>
Public Class Form1
Private _bitmap As Bitmap
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Me.WindowState = FormWindowState.Maximized
Me.DoubleBuffered = True
Dim _rect As Rectangle = Me.ClientRectangle
'// Создаем пустую прозрачную картинку с альфа каналом
_bitmap = New Bitmap(_rect.Width, _
_rect.Height, _
Imaging.PixelFormat.Format32bppArgb)
'// Создаем шрифт
Dim _font As New Font("Arial Black", 40)
'// Формат вывода строки
Dim _strformat As New StringFormat
With _strformat
.Alignment = StringAlignment.Center
.LineAlignment = StringAlignment.Center
End With
'// Создаем кисть для рисования
'// Помимо этой (предопределенной) кисти есть масса других
'// SolidBrush - Заливает одним цветом
'// TextureBrush - кисть на основе картинки
'// PathGradientBrush - градиент на основе Path
'// LinearGradientBrush - обычный градиент
Dim _brush As New HatchBrush(HatchStyle.HorizontalBrick, _
Color.Maroon, _
Color.Gold)
'//
Dim _text As String = "Example working" & vbNewLine
_text &= "with" & vbNewLine
_text &= "Bitmap, Brush" & vbNewLine
_text &= "Graphics, Marshal," & vbNewLine
_text &= "BitmapData & etc..." & vbNewLine
_text &= "for www.vbnet.ru"
Me.Text = _text
'// Создаем объект для рисования
Dim _graph As Graphics = Graphics.FromImage(_bitmap)
'// Задаем качество вывода текста
_graph.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
'// Заливаем картинку градиентом
Dim _gradient As New LinearGradientBrush(_rect, _
Color.Maroon, _
Color.Black, _
LinearGradientMode.ForwardDiagonal)
_graph.FillRectangle(_gradient, _rect)
'// Пишем на ней наш текст
_graph.DrawString(_text, _
_font, _
_brush, _
_rect, _
_strformat)
'// Отображаем на форме
Me.BackgroundImage = _bitmap
'// Убиваем ненужные объекты
_font.Dispose()
_brush.Dispose()
_graph.Dispose()
'// Создаем кнопку
Dim _button As New Button
With _button
.Text = "Invert color"
.Width = 100
.Height = 25
.Left = Me.Width - 125
.Top = Me.Height - 75
End With
'// Добавляем ее на форму
Me.Controls.Add(_button)
'// Вешаем обработчик события Click на нашу процедуру
AddHandler _button.Click, AddressOf ReplaceColor
End Sub
Private Sub ReplaceColor(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim _time As Int32 = Environment.TickCount
'// Массив байт для картинки
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)
'// Инвертируем цвет
For counter As Int32 = 0 To _
bytesCount - bytesStep Step _
bytesStep
bitmapBytes(counter) = bitmapBytes(counter) Xor 255
bitmapBytes(counter + 1) = bitmapBytes(counter + 1) Xor 255
bitmapBytes(counter + 2) = bitmapBytes(counter + 2) Xor 255
Next
'// Копируем измененный массив байт обратно
'// в память на старое место
Marshal.Copy(bitmapBytes, 0, _
bitmapPtr, _
bytesCount)
'// Снимаем блокировку
_bitmap.UnlockBits(bitmapData)
'// Обновляем экран
Me.Refresh()
_time = Environment.TickCount - _time
'// Show result
Console.WriteLine("=== Results of test ========================"
Console.WriteLine(String.Format("Bitmap Size : {0} x {1}", _bitmap.Width, _bitmap.Height))
Console.WriteLine(String.Format("Bytes in pixel : {0} bytes", bytesStep))
Console.WriteLine(String.Format("Bytes Count : {0} bytes", bytesCount))
Console.WriteLine(String.Format("Time : {0} ticks", _time))
Console.WriteLine("========= End =============================="
Console.WriteLine(""
End Sub
End Class
Результат на моей машине:
Bitmap Size : 1280 x 998
Bytes in pixel : 4 bytes
Bytes Count : 5109760 bytes
Time : 112 ticks
========= End ==============================
=== Results of test ========================
Bitmap Size : 1280 x 998
Bytes in pixel : 4 bytes
Bytes Count : 5109760 bytes
Time : 107 ticks
========= End ==============================
С тебя ээээ... 19 WMZ! Отправишь на счет, который укажет Brand, пойдут в фонд развития wiki
Номер ответа: 10
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #10
Добавлено: 15.01.07 21:17
UU
кстати.. чем не готовый пример для библиотеки кодов??? Пора уже мне и главный приз вручать )
Номер ответа: 11
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #11
Добавлено: 15.01.07 23:17
я без мани(((
)))
Я так спасибо скажу, ну как? ))
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 15.01.07 23:25
При чем тут Brand елы палы?
Brand просто настроил (постоянно консультируясь с Sharp'ом, User Unknown, Hacker'ом) сервер, вот и все.
О фонде развития нужно спрашивать у Павла и у UU
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 15.01.07 23:37
Ну еще бы... я даже комменты не поленился расставить.. лишь бы ты за API не хватался! ))
Так это что получаеццо??? Они, типа, тоже в доле?
Мда уж... жалко пацана.. по ходу он на (19*4)WMZ попал....))
Номер ответа: 14
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #14
Добавлено: 15.01.07 23:45
так тсс Brand, поделим )))))!