Hallo zusammen,
folgende Situation:
ich grabbe von einer Kamera kontinuierlich Graustufenbilder (bis zu 1280x1024 Pixel bei 25fps) und zeige diese in einer Picturebox an.
Dazu möchte ich je nach Grauwert (0-255), die jeweiligen Pixel entsprechend einfärben - sozusagen eine Farbpalette drüber legen).
Beispiel:
R: 128
G: 128
B: 128
wird z.B. zu:
R: 255
G: 0
B: 0
Folgende Probleme dabei:
- Sobald man die SizeMode-Property der Picturebox auf Zoom oder StretchImage setzt, ruckelt das Ganze merklich
- Anscheinend dauert das Einfärben zu lange, da man vor allem bei maximaler Auflösungen das normale Graubild + zusätzlich von oben nach unten flackernde Farbbilder sieht, die jedoch nicht vollständig sind.
Das Grabben und Darstellen wird in verschiedenen Threads durchgeführt.
Die Farbpalette steckt in 3 Byte-Arrays (0..255) für den jeweilgen Rot-, Grün- bzw. Blau-Wert.
Anbei mein Code aus dem UpdateUI-Thread, in dem ich auch die Einfärbung durchführe:
Gibt es die Möglichkeit, das Bild nur dann zu "malen", wenn es vollständig eingefärbt wurde? Dann ruckelt es zwar, aber es flackert nicht mehr.
Danke schonmal.
Theckwolf
folgende Situation:
ich grabbe von einer Kamera kontinuierlich Graustufenbilder (bis zu 1280x1024 Pixel bei 25fps) und zeige diese in einer Picturebox an.
Dazu möchte ich je nach Grauwert (0-255), die jeweiligen Pixel entsprechend einfärben - sozusagen eine Farbpalette drüber legen).
Beispiel:
R: 128
G: 128
B: 128
wird z.B. zu:
R: 255
G: 0
B: 0
Folgende Probleme dabei:
- Sobald man die SizeMode-Property der Picturebox auf Zoom oder StretchImage setzt, ruckelt das Ganze merklich
- Anscheinend dauert das Einfärben zu lange, da man vor allem bei maximaler Auflösungen das normale Graubild + zusätzlich von oben nach unten flackernde Farbbilder sieht, die jedoch nicht vollständig sind.
Das Grabben und Darstellen wird in verschiedenen Threads durchgeführt.
Die Farbpalette steckt in 3 Byte-Arrays (0..255) für den jeweilgen Rot-, Grün- bzw. Blau-Wert.
Anbei mein Code aus dem UpdateUI-Thread, in dem ich auch die Einfärbung durchführe:
Quellcode
- Private Sub UpdateUI(sender As Object, e As ProgressChangedEventArgs)
- Dim Bitmap As Bitmap = cameraimage.bitmap
- Dim rect As Rectangle
- rect.X = 0
- rect.Y = 0
- rect.Width = Bitmap.Width
- rect.Height = Bitmap.Height
- Dim bmpData As System.Drawing.Imaging.BitmapData = Bitmap.LockBits(rect, Drawing.Imaging.ImageLockMode.WriteOnly, Bitmap.PixelFormat)
- Dim ptr As IntPtr = bmpData.Scan0
- Dim bytes As Integer = Math.Abs(bmpData.Stride) * Bitmap.Height
- Dim rgbValues(bytes - 1) As Byte
- System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
- For counter As Integer = 2 To rgbValues.Length - 1 Step 3
- Dim x As Byte = rgbValues(counter)
- rgbValues(counter) = PaletteEntriesR(x)
- rgbValues(counter - 1) = PaletteEntriesG(x)
- rgbValues(counter - 2) = PaletteEntriesB(x)
- Next
- 'Unlock
- System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, rgbValues.Length)
- Bitmap.UnlockBits(bmpData)
- pictureBox1.Image = Bitmap
- End Sub
Gibt es die Möglichkeit, das Bild nur dann zu "malen", wenn es vollständig eingefärbt wurde? Dann ruckelt es zwar, aber es flackert nicht mehr.
Danke schonmal.
Theckwolf