PictureBox в .NET

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

PictureBox в .NET

Сообщение d3drm » 02.11.2004 (Вт) 23:06

Если кто знает в VB6 есть такой способ прорисовки изображения: получаем матрицу точек (байтов) размерностью с Picbox, затем при заполнении матрицы заполняется и сама картинка. В итоге получается довольно быстрая прорисовка графики. Как такое организовать в НЕТе?
ХЎ

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 05.11.2004 (Пт) 7:41

Никто не знает? (((
ХЎ

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Прорисовка

Сообщение kyzma » 05.11.2004 (Пт) 19:40

А какой способ работы с растовыми изображениями наиболее быстр, и что лутше сначала сформировать изображение в памяти, а потом прорисовать или наоборот?
kyzma

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.11.2004 (Сб) 10:51

А какой способ работы с растовыми изображениями наиболее быстр


Есть из чего выбрать? :?

что лутше сначала сформировать изображение в памяти, а потом прорисовать или наоборот?


а как ты собираешься прорисовывать изображение не загрузив его в память?


Вопрос остается открытым...
ХЎ

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Работа с графикой

Сообщение kyzma » 07.11.2004 (Вс) 18:58

Как я понимаю в GDI+ можно вывести изображение в графическое усторойство, а потом изменять...
а можно произвести действия над изображением в памяти, а потом вывести...
Может я что-то и не так понял...
И на конец можно менять свойства PictureBox (ширину и высоту) и его свойства AutoSize и Strech - я делал так раньше...
В общем как правильно работать с изображениями... просто я только начинаю в это втыкаться и не хочется что-то делать через одно место :cry:
Но при выводе через GDI+ у меня прилично грузиться проц... порядка 40% (P4-2.8 МгЦ) хотя может так и должно быть учитывая размер изображения 2,5 мб.
В общем кто и что думает...
kyzma

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 11.11.2004 (Чт) 23:28

хм... самый быстрый способ вывода изображений (кроме блитинга, я про "честный попиксельный вывод) - вывод через указатели. Можно ли в нете использовать указатели, как в VB6?
ХЎ

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

А как его сделать?

Сообщение kyzma » 12.11.2004 (Пт) 14:42

Как сделать "честный" попиксильный вывод изображения?
Если можно с примером (кодом), а то я только начинаю :oops:
kyzma

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 19.11.2004 (Пт) 22:22

Ответ на последний вопрос

Код: Выделить всё
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As Integer

        Dim mBitMap = New Bitmap(PictureBox1.Width, PictureBox1.Height, Imaging.PixelFormat.Format32bppArgb)

        PictureBox1.Image = mBitMap
        For x = 0 To mBitMap.Width - 1
            SetPixel(mBitMap, x, mBitMap.Height \ 2, System.Drawing.Color.RoyalBlue)
        Next

    End Sub

    Public Sub SetPixel(ByVal BM As Bitmap, ByVal X As Integer, ByVal Y As Integer, ByVal RGB As System.Drawing.Color)
        Dim BytePerPixel As Byte
        Dim Offset As Integer
        Dim Rect As Rectangle
        Dim BMD As System.Drawing.Imaging.BitmapData
        Dim MEM As IntPtr
        Dim Marsh As System.Runtime.InteropServices.Marshal

        Select Case BM.PixelFormat
            Case Imaging.PixelFormat.Format24bppRgb
                BytePerPixel = 3
            Case Imaging.PixelFormat.Format32bppRgb, Imaging.PixelFormat.Format32bppArgb
                BytePerPixel = 4
        End Select

        Rect = New System.Drawing.Rectangle(0, 0, BM.Width, BM.Height)
        'заблокируем битмэп (это нужно для получения доступа к памяти)
        BMD = BM.LockBits(Rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, BM.PixelFormat)
        'получим указатель на первый пиксел в памяти
        MEM = BMD.Scan0

        ' BMD.Stride указывает сколько байт занимает в памяти одна строка битмэпа
        'вычислим смещение от начала первого байта
        Offset = (BMD.Stride * Y) + (X * BytePerPixel)

        'запишем наш пиксел
        Marsh.WriteByte(MEM, Offset, RGB.B)
        Marsh.WriteByte(MEM, Offset + 1, RGB.G)
        Marsh.WriteByte(MEM, Offset + 2, RGB.R)
        If BytePerPixel = 4 Then Marsh.WriteByte(MEM, Offset + 3, RGB.A)

        'разблокируем битмэп
        BM.UnlockBits(BMD)

    End Sub


Это просто пример. Соответственно тут нет ни малейшего намека на оптимизацию по скорости.

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Сдесь выводим линию?

Сообщение kyzma » 19.11.2004 (Пт) 23:00

Как я понял должна получиться линия, а что надо сделать, чтобы вывести рисунок из файла (фотку какую-нибудь)?
kyzma

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.11.2004 (Сб) 16:35

Сделать то это не сложно, но зачем для вывода фотки прибегать к таким извращениям? Basic понимает все основные графические форматы. Или ты просто не знаешь как это сделать стандартными методами? (будет лучше если ты будешь писать немного поподробней)

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Скорость работы

Сообщение kyzma » 20.11.2004 (Сб) 17:47

Мне надо выводить изображения размеро около 2 mb и поэтому хотелось бы использовать наиболее быстрай способа вывода изображения... Сейчас я вывожу изображения методом OnPaint
используя e.Graphics.DrawImage

Код: Выделить всё
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics
g = e.Graphics()
Dim img As Image = Image.FromFile("c:\test.bmp")
Dim w = img.Width
Dim h = img.Height

e.Graphics.DrawImage(img, 0, 0, w, h)
img.Dispose()
g.Dispose()
End Sub



Но ведь это не так уж и быстро если файл не один и такого размера???
kyzma

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.11.2004 (Сб) 19:25

Никакой OnPaint тебе не нужен. Все гораздо проще:

Код: Выделить всё
PictureBox1.Image = Image.FromFile("D:\Untitled-1_1.tif")


Картинка будет прорисовываться автоматически.
И быстродействие хорошее.

А если ты все таки захочешь использовать "честный" попиксельный вывод то тебе придется использовать "честный" разбор форматов графических файлов, что наверное не входит в твои планы.

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Сообщение kyzma » 20.11.2004 (Сб) 19:56

Код: Выделить всё
PictureBox1.Image = Image.FromFile("D:\Untitled-1_1.tif")

Этим я уже пользовался... если често не особо устраивает и по быстродействию в том числе :( OnPaint вроде быстрее...

А если ты все таки захочешь использовать "честный" попиксельный вывод то тебе придется использовать "честный" разбор форматов графических файлов, что наверное не входит в твои планы.


Я не знаю что такое "честный" разбор форматов графических файлов ,
но видимо с этим надо будет разобраться... не подскажешь как с этим быть буду весьма признателен :D [/quote]
kyzma

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.11.2004 (Сб) 22:26

Давай твой проект с комментариями, на досуге покумекаю, может что и подскажу.

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Вот архив...

Сообщение kyzma » 21.11.2004 (Вс) 10:03

В проге выбирается папка и она загружается в TreeView, где выбираешь файлы для просмотра. Изображение корректируется по размерам окна программы.
Вложения
TreeView.rar
Прога
(28.65 Кб) Скачиваний: 117
kyzma

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 21.11.2004 (Вс) 18:32

Вот мой вариант (Прорисовка идет быстрее, причем стандартными методами):
Вложения
Просмотр Графических Файлов.rar
(18.37 Кб) Скачиваний: 149

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Спасибо!

Сообщение kyzma » 21.11.2004 (Вс) 20:09

Спасибо огромное, я посмотрю. :)
kyzma

kyzma
Новичок
Новичок
Аватара пользователя
 
Сообщения: 33
Зарегистрирован: 29.10.2004 (Пт) 12:42
Откуда: Москва

Гистограмма.

Сообщение kyzma » 23.11.2004 (Вт) 16:17

Кто-нибудь знает как получить гистограмму изображения в VB.NET, если ее конечно вообще можно получить.
kyzma

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 28.11.2004 (Вс) 0:57

я не о том вообщето тему начал... Хочу чтобы быстро именно попиксельно все это выводилось...
ХЎ


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82

    TopList