Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: GDI+ ), часть 2. Работа с битмапом Добавлено: 14.01.07 23:10  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
Здравствуйте!

Нашел на msdn пример с bitmap

Imports System.Runtime.InteropServices

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”)
  ;Dim Графика As Graphics
Графика.DrawImage(Картинка, 0, 0)

    End Sub

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 15.01.07 01:04
Данный пример выдает ошибку: недопустимый параметр здесь: Dim bm As New Bitmap("Picture.jpg";)
никак не могу избавиться от этой ошибки

Ошибка банальная.. Надо указать полный путь к картинке, иначе студия его не находит..

как использовать класс битмап..

Что значит КАК??? Брать и использовать! Что конкретно ты хочешь сделать, и что у тебя не получается!? Конкретней, уважаемый, конкретней...

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 15.01.07 01:57
И еще.. этот пример вряд ли чем тебе поможет при работе с Bitmap.. Это скорее пригодится для извращения с API! опять ты за свое??? Знакомые буквы встретил?.. Hbitmap Забудь ты про них.. :-))) Они тут не нужны...

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 15.01.07 14:41
Георгич, спасибо за рабочий пример. Длля начала сойдет)))

EROS
Что значит КАК??? Брать и использовать! Что конкретно ты хочешь сделать, и что у тебя не получается!? Конкретней, уважаемый, конкретней...
да нету у меня ничего конкретного......
Ищу в вб.нет аналоги АПИ GetBitmapBits, SetBitmapBits, GetDiBits, SetDiBitsToDevice.....


опять ты за свое???

угу ))))


Конкретней, уважаемый, конкретней...
ну например взять изображение с картинки и сдвинуть цвет каждого пикселя на 256.... а потом снова положить....
без битмапа меленно получается.....

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 15.01.07 15:01
без битмапа меленно получается.....

а ты в цикле что ли пикселы перебираешь?? )) Разумеется, это будет медленно.. тут надо через Маршаллинг получать весь массив байт картинки из памяти, менять что надо и пихать обратно..

Ответить

Номер ответа: 6
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #6
Добавлено: 15.01.07 16:01
тут надо через Маршаллинг получать весь массив байт картинки из памяти, менять что надо и пихать обратно..
что такое маршаллинг? этим же битмап вроде занимался...

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 15.01.07 16:52
что такое маршаллинг?

System.Runtime.InteropServices.Marshal

Public NotInheritable Class Marshal
          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-сайт: sham.clan.su
 Профиль | | #8
Добавлено: 15.01.07 17:12
А есть какой-нибудь пример работы с этим классом?

Без разницы, что он делает. Хоть какой-нибудь, я разберусь )...

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 15.01.07 20:33
Imports System.Drawing
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


Результат на моей машине:
=== Results of test ========================
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-сайт: sham.clan.su
 Профиль | | #11
Добавлено: 15.01.07 23:17
С тебя ээээ... 19 WMZ!
ЭЭЭЭЭ, мн.. я... это... а

я без мани(((
)))

Я так спасибо скажу, ну как? ))

кстати.. чем не готовый пример для библиотеки кодов??? Пора уже мне и главный приз вручать :-))
согласен)) Это единственный листинг по VB.Net, точнее первый, который я понял с первого взгляда (же погресс)))

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 15.01.07 23:25
тебя ээээ... 19 WMZ! Отправишь на счет, который укажет Brand, пойдут в фонд развития wiki

При чем тут Brand елы палы?
Brand просто настроил (постоянно консультируясь с Sharp'ом, User Unknown, Hacker'ом) сервер, вот и все.
О фонде развития нужно спрашивать у Павла и у UU :)

Ответить

Номер ответа: 13
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #13 Добавлено: 15.01.07 23:37
Это единственный листинг по VB.Net, точнее первый, который я понял с первого взгляда

Ну еще бы... я даже комменты не поленился расставить.. лишь бы ты за API не хватался! :-)))

постоянно консультируясь с Sharp'ом, User Unknown, Hacker'ом

Так это что получаеццо??? Они, типа, тоже в доле?
Мда уж... жалко пацана.. по ходу он на (19*4)WMZ попал....))

Ответить

Номер ответа: 14
Автор ответа:
 HACKER


 

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

Вопросов: 236
Ответов: 8362
 Профиль | | #14 Добавлено: 15.01.07 23:45
так тсс Brand, поделим :))))))!

Ответить

Страница: 1 |

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



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