Чтение png в матрицу . . .

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

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

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Чтение png в матрицу . . .

Сообщение программист » 03.12.2007 (Пн) 18:51

Необходимо прочитать png-рисунок 256x256 и занести цвет каждаго пиксела в матрицу 256x256, те пиксел 0,0 в эл матрицы (0,0).

P.S. - такой темы не нашел...

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 04.12.2007 (Вт) 5:26

Код: Выделить всё
Dim b As New System.Drawing.Bitmap("C:\1.png")
        MessageBox.Show(b.GetPixel(0, 0).ToString)
        MessageBox.Show(Convert.ToString(b.Height))
        MessageBox.Show(Convert.ToString(b.Width))
        b.SetPixel(0, 0, Color.Black)


С забиванием значений в матрицу я думаю проблем быть не должно?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.12.2007 (Вт) 8:12

Создатель, все правильно, только вместо GetPixel надо использовать метод LockBits.
Весь мир матрица, а мы в нем потоки байтов!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 04.12.2007 (Вт) 11:04

Создатель
с матрицами проблем нет (по крайней мере за 5 лет не возникало, пока что), а если не влом в 2-х словах раскажи как ентот код работает?
Имя ничего не значит, НО ...
... я работаю над собой!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.12.2007 (Вт) 13:29

программист, код от Создатель будет работать медленно! Суть его кода в том, что он считывает методом GetPixel значение каждого пикселя матрицы рисунка. Правильный способ - использование метда LockBits. Пример вытащен из MSDN:

Код: Выделить всё
Private Sub LockUnlockBitsExample()

    ' Create a new bitmap.
    Dim bmp As New Bitmap("c:\picture.png")

    ' Lock the bitmap's bits. 
    Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, _
        Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)

    ' Get the address of the first line.
    Dim ptr As IntPtr = bmpData.Scan0

    ' Declare an array to hold the bytes of the bitmap.
    ' This code is specific to a bitmap with 24 bits per pixels.
    Dim bytes As Integer = bmp.Width * bmp.Height * 3
    Dim rgbValues(bytes - 1) As Byte

    ' Copy the RGB values into the array.
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)

    ' Set every red value to 255. 
    For counter As Integer = 0 To rgbValues.Length - 1 Step 3
        rgbValues(counter) = 255
    Next

    ' Copy the RGB values back to the bitmap
    System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)

    ' Unlock the bits.
    bmp.UnlockBits(bmpData)
End Sub
Весь мир матрица, а мы в нем потоки байтов!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 04.12.2007 (Вт) 20:08

спасибо всем! теперь буду разбиратья...
Имя ничего не значит, НО ...
... я работаю над собой!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 05.12.2007 (Ср) 11:27

С читалкой пиксела разобрался. А как теперь из матрицы считать эти самые пикселы на форму (left=0, top=0 - для простоты примера)???
Имя ничего не значит, НО ...
... я работаю над собой!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.12.2007 (Ср) 13:01

На форму в каком смысле? Отрисовать штоль?
Весь мир матрица, а мы в нем потоки байтов!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 05.12.2007 (Ср) 15:34

ну да
Имя ничего не значит, НО ...
... я работаю над собой!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.12.2007 (Ср) 16:23

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

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 05.12.2007 (Ср) 16:40

Код: Выделить всё
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim b As Image = Image.FromFile("C:\1.png")
        Me.CreateGraphics.DrawImage(b, 0, 0, 256, 256)
    End Sub


Что-то ничего не грузит

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 05.12.2007 (Ср) 16:55

запихнул изо в ресурс
пишу:
Код: Выделить всё
Me.CreateGraphics.DrawImage(bit_read.My.Resources._1, 0, 0, 256, 256)

тоже ничего на форме не рисуется

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

Сообщение Nord777 » 05.12.2007 (Ср) 18:12

либо так:
Код: Выделить всё
Public Class Form1
  Dim b As Image = Image.FromFile("C:\1.png")

   Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    e.Graphics.DrawImage(b, 0, 0, 256, 256)
  End Sub
End Class


либо так:
Код: Выделить всё
Public Class Form1

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.BackgroundImage = Image.FromFile("C:\1.png")
  End Sub

End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 05.12.2007 (Ср) 22:27

Nord777
не пашет!
Имя ничего не значит, НО ...
... я работаю над собой!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 06.12.2007 (Чт) 7:53

программист, а должно! Который вариант не пашет? Используемый вариант кода приведи.
Весь мир матрица, а мы в нем потоки байтов!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 06.12.2007 (Чт) 22:17

Вариант с BackgroundImage (приведенный Nord777) не подходит.
.....
.....
.....
Ура заработало!!!
короче копировал себе в проект след код (первый приведенный Nord777) :
Код: Выделить всё

Dim b As Image = Image.FromFile("C:\1.png")
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
          e.Graphics.DrawImage(b, 0, 0, 256, 256)
End Sub

... не работал.
А когда скопировал весь класс Form1:
Код: Выделить всё

Public Class Form1
  Dim b As Image = Image.FromFile("C:\1.png")
  Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        e.Graphics.DrawImage(b, 0, 0, 256, 256)
  End Sub
End Class

- все заработало!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 06.12.2007 (Чт) 22:19

Создатель, Viper, Nord777, ОГРОМНОЕ ВАМ СПАСИБО!!!
Имя ничего не значит, НО ...
... я работаю над собой!


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

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

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

    TopList