RGB Code Auslesen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    RGB Code Auslesen

    Hallo,
    Ich hab ein Problem und zwar versuche ich grade ein Programm zu bauen, mit dem ich den höchsten und den tiefsten Punkt einer Karte(je dunkler desto tiefer je rötlicher desto höher)
    herausfinden.
    Derzeit probiere ich den tiefsten punkt herauszufinden.

    Quellcode

    1. Private Function Deep() As Point Using b As New Bitmap(PictureBox1.Image) Dim small As Integer = 765 Dim pDarkestPixel As Point Dim cPixel As Color Dim x As Integer = 0 Dim y As Integer = 0 Do While cPixel.G + cPixel.R + cPixel.B + cPixel.A - cPixel.A < small cPixel = b.GetPixel(x, y) x += 1 y += 1
    2. Loop
    3. End Using End Function

    Aber jetzt gibt mir Vb 2010 eine Overflow Exception aus bei Blau.
    Das bild ist sehr Blau-lastig.
    Bilder
    • gui_Kerbin_ISA_Topo.png

      149,67 kB, 400×256, 198 mal angesehen
    Ich zweifel mal die Schleife an, da x und y ins Unendliche laufen. Formatier mal deinen Code besser. Bei mir muss ich weit zur Seite scrollen. Der Integer kann nicht overflowen, da die Farbkanäle nicht größer sind als 255. Ich bezweifle mal, dass es um den roten Farbkanal geht.
    Da liegt das Problem cPixel.G + cPixel.R + cPixel.B + cPixel.A - cPixel.A

    Also das hier läuft

    VB.NET-Quellcode

    1. Using b As New Bitmap(PictureBox1.Image)
    2. Dim temp As Integer
    3. Dim cPixel As Color
    4. cPixel = b.GetPixel(0, 0)
    5. temp = cPixel.G + cPixel.R
    6. temp += cPixel.B
    7. End Using


    Aber hier schmeist er ne Exception

    VB.NET-Quellcode

    1. Using b As New Bitmap(PictureBox1.Image)
    2. Dim temp As Integer
    3. Dim cPixel As Color
    4. cPixel = b.GetPixel(0, 0)
    5. temp = cPixel.G + cPixel.R + cPixel.B
    6. End Using


    :|
    Nee das hab ich schon längst rausgeworfen sry.
    Aber meine kürzliche Euphorie wurde leider nach meinem Versuch von der Klippe gestoßen -.-.

    Quellcode

    1. Private Function Deep() As Point
    2. Using b As New Bitmap(PictureBox1.Image)
    3. Dim small As Long = 765
    4. Dim pDarkestPixel As Point
    5. Dim cPixel As Color
    6. Dim x As Long = 0
    7. Dim y As Long = 0
    8. Do While cPixel.G + cPixel.R + cPixel.B < small
    9. cPixel = b.GetPixel(x, y)
    10. x += 1
    11. y += 1
    12. If x = PictureBox1.Width Then
    13. small -= 1
    14. Else
    15. End If
    16. If y = PictureBox1.Height Then
    17. small -= 1
    18. Else
    19. End If
    20. Loop
    21. End Using
    22. End Function

    Das hat auch nichts gebracht ;(
    Suchst du etwas in der Art ?

    VB.NET-Quellcode

    1. Private Function Deep() As Point
    2. Using b As New Bitmap(PictureBox1.Image)
    3. Dim small As Integer = 765
    4. Dim cPixel As Color
    5. Dim x As Integer = 0
    6. Dim y As Integer = 0
    7. Dim temp As Integer = 0
    8. For i = 0 To PictureBox1.Image.Width - 1
    9. For j = 0 To PictureBox1.Image.Height - 1
    10. cPixel = b.GetPixel(i, j)
    11. temp = cPixel.G
    12. temp += cPixel.R
    13. temp += cPixel.B
    14. If temp >= small Then Return New Point(i, j)
    15. Next
    16. Next
    17. End Using
    18. End Function


    Allerdings findest du so nur den den erstmöglichen Pixel dessen RGB- Werte zusammen größer als 'small' sind.

    Samus Aran schrieb:

    wofür ne Library nutzen?

    Vielleicht weil die Library selbst mit LockBits arbeitet und dem Benutzer ein übersichtliches und leicht verwendbares Interface bieten soll?
    Warum immer das Rad neu erfinden? (Außer natürlich, man will es einfach ausprobieren, um nachher zu wissen, wie's geht.)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils