Du bist nicht angemeldet.

Duke

Registrierter Benutzer

  • »Duke« ist männlich
  • »Duke« ist der Autor dieses Themas

Beiträge: 114

Dabei seit: 24. April 2009

  • Private Nachricht senden

1

Donnerstag, 2. September 2010, 10:56

wie aus einem Byte-Array ein Image erzeugen

Hi,

ich habe einen Framegrabber zur Bilderkennung und der liefert mir unter anderem
das Kamerabild in Form eines Byte-Arrays. Darin enthalten sind die Pixelfarben als 1Byte-Graustufenwert.
Das Bild ist 768 mal 576 Bildpunkte groß, also ist das Array 768*576=442368 Byte groß.

Das Bild soll in einer Picturebox angezeigt werden. Leider schaffe ich es nicht (trotz einiger Denkanstöße im Internet)
aus den Daten im Array ein Bild zu machen.

Bei dem unten stehenden Fall (einer von diversen Versuchen) meckert er bei "Image.FromStream(..)" über die übergeben Daten (ungültiger Parameter)

Visual Basic Quellcode

1
2
3
4
        Dim myArray() As Byte = SingleCheck.GetImageData(0)

        Dim MS As New IO.MemoryStream(myArray)
        Dim Img As Image =  Image.FromStream(MS)


Wie funktioniert es ?

Danke und Gruß, Duke

PS: Das Bild soll in einer Picturebox angezeigt werden.

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

2

Donnerstag, 2. September 2010, 11:03

das liegt daran, dass du nur die Bilddaten hast, jedoch keine Informationen über Format oder sonstiges, also müsstest du dir ein leeres Bitmap erstellen mit den Bemaßungen des Bildes, über LockBits gibst du dann dessen Bytes zum schreiben/lesen frei(als Graustufenbild), dann schreibst du deinen ByteArray dort rein und schließt das ganze mit UnlockBits ab, anschließend sollte das Bild in dem Bitmap enthalten sein und du solltest dieses direkt an deine PictureBox übergeben können...
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

Duke

Registrierter Benutzer

  • »Duke« ist männlich
  • »Duke« ist der Autor dieses Themas

Beiträge: 114

Dabei seit: 24. April 2009

  • Private Nachricht senden

3

Donnerstag, 2. September 2010, 14:07

Danke hat geklappt. :)

Ist unten noch was zu verbessern oder ist das ok so ?

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
   Public Function getRawPicture() As Bitmap
      Dim PictureRect            As New Rectangle                 ' Dimension/Position der Bilddaten
      Dim DataArray()            As Byte                          ' Array mit Bild-Rohdaten
      Dim NPartsInt32            As epNumberParts.Int32Parts      ' Konverter für "Byte()->Integer"-Wandlung
      Dim newPicture             As Bitmap                        ' Bild im Bitmapformat
      Dim currentBitmapData      As BitmapData                    ' Datenobjekt für Bilddaten

      Try
         newPicture = Nothing

         If SingleCheck.NumOfImages > 0 Then
            DataArray = SingleCheck.GetImageProp(1)

            ' Ausdehnung x
            For I = 0 To 3
               NPartsInt32.ByteValue(I) = DataArray(I)
            Next I
            PictureRect.Width = NPartsInt32.Int32Value
            
            ' Ausdehnung y
            For I = 4 To 7
               NPartsInt32.ByteValue(I - 4) = DataArray(I)
            Next I
            PictureRect.Height = NPartsInt32.Int32Value

            If (PictureRect.Width > 0) AndAlso (PictureRect.Height > 0) Then

               ' Pixeldaten holen
               DataArray = SingleCheck.GetImageData(0)
               ' Bitmap-Zielobjekt erzeugen
               newPicture = New Bitmap(PictureRect.Width, PictureRect.Height, PixelFormat.Format8bppIndexed)
               ' Daten das Bitmaps locken und zugreifbar machen
               currentBitmapData = newPicture.LockBits(PictureRect,ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed)
               ' Arraydaten in den Bitmapbereich kopieren
               Marshal.Copy(DataArray, 0, currentBitmapData.Scan0, PictureRect.Width * PictureRect.Height)
               ' Locking zurücknehmen
               newPicture.UnlockBits(currentBitmapData)
               ' Farbpalette zuordnen
               newPicture.Palette = m_Palette_8bppGreyScale

            End If

         End If

         Return newPicture

      Catch ex As Exception
         Throw New Exception("Fehler beim Aufbereiten der Bilddaten", ex)
      End Try
   End Function

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

4

Donnerstag, 2. September 2010, 14:11

nö, sieht mir nicht danach aus ;)
dieser Codeteil scheint aufjedenfall richtig zu sein(wenn er funktioniert :P) und viel an Performance könnte man auch nicht mehr raushohlen...
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

Social Bookmarks