none
Farbbilder in Grautonbilder zelegen. RRS feed

  • Frage

  • Farbbilder konnten in VB 6.0 mit dem Datentyp Public Type RGBQUD // rgbBlue As Byte / rgbGreen As Byte / rgbRed As Byte / rgbReserve As Byte // End Type. in ihre drei Komponenten zerlegt werden.  -  In Visual Studio 2008 (unter dem Betriebssystem: Windows Vista) lese ich ein Farbbild wie folgt ein:

    Dim pict As New Bitmap(Filename); With pict // Me.W-- / Me.H-- / Dim g As Graphics=Me.CreateGraphics / g.DrawImage(pict,0,0,.W--,.H--) / g.Dispose// End With.

    Mit "pict.GetPixel" kann ich die Pixelwerte aus "pict()" z.B. in ein Feld "Matrix(W--,H--) As Color" einlesen, habe aber noch keine lauffähige Lösung dafür gefunden, wie die Pixel-Werte vom Typ "Color" aus "Matrix()" -oder auch aus "pict()" direkt- in drei Felder (vom Typ Byte) eingelesen werden können, die -wie die Felder vom Typ RGBQUAD in VB 6.0- jeweils nur eine der drei Farbkomponenten enthalten. Wer kann helfen?

    • Verschoben Robert BreitenhoferModerator Freitag, 18. Februar 2011 13:08 Visual Basic .NET (aus:Generelle Fragen zu MSDN Online Deutschland oder den MSDN Foren)
    Freitag, 18. Februar 2011 12:21

Antworten

  • Hi,

    kleines Beispiel (einen Button auf die Form ziehen)

    Public Class Form1
      Private _bmp As Bitmap = Nothing
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _bmp = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
    
        Using g As Graphics = Graphics.FromImage(_bmp)
          g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
          g.Clear(Color.MediumOrchid)
          g.FillEllipse(Brushes.Yellow, Me.ClientRectangle)
        End Using
      End Sub
    
      Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        If Not _bmp Is Nothing Then
          e.Graphics.DrawImage(_bmp, 0, 0)
        End If
      End Sub
    
      Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If Not _bmp Is Nothing Then
          _bmp.Dispose()
        End If
      End Sub
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Not _bmp Is Nothing Then
          Dim bmpRed As Bitmap = New Bitmap(_bmp.Width, _bmp.Height)
          For y As Integer = 0 To _bmp.Height - 1
            For x As Integer = 0 To _bmp.Width - 1
              Dim c As Color = _bmp.GetPixel(x, y)
              bmpRed.SetPixel(x, y, Color.FromArgb(255, c.R, 0, 0))
            Next
          Next
          Dim frm As New Form()
          frm.BackgroundImage = bmpRed
          frm.ShowDialog()
    
          frm.Dispose()
          bmpRed.Dispose()
    
          Dim bmpGrayEasy As Bitmap = New Bitmap(_bmp.Width, _bmp.Height)
          For y As Integer = 0 To _bmp.Height - 1
            For x As Integer = 0 To _bmp.Width - 1
              Dim c As Color = _bmp.GetPixel(x, y)
              Dim avrg As Integer = (CType(c.R, Integer) + CType(c.B, Integer) + CType(c.G, Integer)) \ 3
              bmpGrayEasy.SetPixel(x, y, Color.FromArgb(255, avrg, avrg, avrg))
            Next
          Next
          Dim frm2 As New Form()
          frm2.BackgroundImage = bmpGrayEasy
          frm2.ShowDialog()
    
          frm2.Dispose()
          bmpGrayEasy.Dispose()
        End If
      End Sub
    End Class
    
    

     

    Viele Grüße,

      Thorsten

    • Als Antwort markiert KarlTheodor Dienstag, 1. März 2011 16:39
    Mittwoch, 23. Februar 2011 09:05

Alle Antworten

  • Hallo karl,

    ich habe einen code für Deine Frage gefunden:

    http://www.codeproject.com/Articles/66253/Converting-Colors-to-Gray-Shades.aspx

    Vielleicht hilft Dir dieser.

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    • Als Antwort vorgeschlagen Ellen Ramcke Freitag, 4. März 2011 20:45
    • Nicht als Antwort vorgeschlagen Ellen Ramcke Freitag, 4. März 2011 20:46
    Freitag, 18. Februar 2011 20:34
  • Hallo Ellen,

    der Artikel, auf den Du hinweist, bezieht sich auf die Umwandlung von Farb- in Grautonbilder für die Ausgabe auf einem SW-Drucker. Mein Problen ist die Speicherung der drei Farbkomponenten in eigenen Dateien zum Zweck der weiteren Verarbeitung (z.B. Schwellenwertfindung; Formanalyse etc.). Für Deine Antwort danke ich Dir aber in jedem Fall herzlich.

    Mit freundlichen Grüße

    KarlTheodor

    PS Mir steht z.Zt. nur VB 2008 zu Vefügung.

    Samstag, 19. Februar 2011 13:37
  • Hallo Karl,

    dann schau Dir mal die Color-Struktur an. Ein Beispielcode die Farbwerte ARGB zu zerlegen

    http://msdn.microsoft.com/de-de/library/system.drawing.color.aspx

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    • Als Antwort vorgeschlagen Ellen Ramcke Freitag, 4. März 2011 20:46
    Samstag, 19. Februar 2011 15:54
  • Hi,

    kleines Beispiel (einen Button auf die Form ziehen)

    Public Class Form1
      Private _bmp As Bitmap = Nothing
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _bmp = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
    
        Using g As Graphics = Graphics.FromImage(_bmp)
          g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
          g.Clear(Color.MediumOrchid)
          g.FillEllipse(Brushes.Yellow, Me.ClientRectangle)
        End Using
      End Sub
    
      Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        If Not _bmp Is Nothing Then
          e.Graphics.DrawImage(_bmp, 0, 0)
        End If
      End Sub
    
      Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If Not _bmp Is Nothing Then
          _bmp.Dispose()
        End If
      End Sub
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Not _bmp Is Nothing Then
          Dim bmpRed As Bitmap = New Bitmap(_bmp.Width, _bmp.Height)
          For y As Integer = 0 To _bmp.Height - 1
            For x As Integer = 0 To _bmp.Width - 1
              Dim c As Color = _bmp.GetPixel(x, y)
              bmpRed.SetPixel(x, y, Color.FromArgb(255, c.R, 0, 0))
            Next
          Next
          Dim frm As New Form()
          frm.BackgroundImage = bmpRed
          frm.ShowDialog()
    
          frm.Dispose()
          bmpRed.Dispose()
    
          Dim bmpGrayEasy As Bitmap = New Bitmap(_bmp.Width, _bmp.Height)
          For y As Integer = 0 To _bmp.Height - 1
            For x As Integer = 0 To _bmp.Width - 1
              Dim c As Color = _bmp.GetPixel(x, y)
              Dim avrg As Integer = (CType(c.R, Integer) + CType(c.B, Integer) + CType(c.G, Integer)) \ 3
              bmpGrayEasy.SetPixel(x, y, Color.FromArgb(255, avrg, avrg, avrg))
            Next
          Next
          Dim frm2 As New Form()
          frm2.BackgroundImage = bmpGrayEasy
          frm2.ShowDialog()
    
          frm2.Dispose()
          bmpGrayEasy.Dispose()
        End If
      End Sub
    End Class
    
    

     

    Viele Grüße,

      Thorsten

    • Als Antwort markiert KarlTheodor Dienstag, 1. März 2011 16:39
    Mittwoch, 23. Februar 2011 09:05
  • Hallo Thorsten,

    bin nicht sicher, ob meine Antwort im Forum zu lesen war, deshalb hier noch einmal zur Sicherheit.

    Dein Beispiel war sehr hilfreich.

    Danke herzlich und viele Grüße

    Karl


    KarlTheodor
    Mittwoch, 2. März 2011 15:40
  • Hallo Ellen,

    der BeispielCode, auf den Du hingewiesen hast, enthält die Lösung für meine Frage: Danke Dir sehr.

    Viele Grüße

    Karl


    KarlTheodor
    Mittwoch, 2. März 2011 15:43