Problem mit Ascii Art Generator

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem mit Ascii Art Generator

    Hallöchen ihr lieben,
    ich habe gerade ein Problem:
    Ich will einen einfachen, simplen Ascii Art Generator in meine Anwendung integrieren, ähnlich diesem.

    Allerdings bekomme ich aus irgend einem Grund immer einen Overflow wenn ich eine Konvertierung durchführen möchte.

    Der Fehler tritt bei Dim red As Integer = CInt((pixelColor.R + pixelColor.G + pixelColor.B) / 3) auf
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function ConvertToAscii(image As Bitmap) As String
    2. Dim toggle As Boolean = False
    3. Dim sb As New StringBuilder()
    4. For h As Integer = 0 To image.Height - 1
    5. For w As Integer = 0 To image.Width - 1
    6. Dim pixelColor As Color = image.GetPixel(w, h)
    7. Dim red As Integer = CInt((pixelColor.R + pixelColor.G + pixelColor.B) / 3)
    8. Dim green As Integer = CInt((pixelColor.R + pixelColor.G + pixelColor.B) / 3)
    9. Dim blue As Integer = CInt((pixelColor.R + pixelColor.G + pixelColor.B) / 3)
    10. Dim grayColor As Color = Color.FromArgb(red, green, blue)
    11. If Not toggle Then
    12. Dim index As Integer = CInt((grayColor.R * 10) / 255)
    13. sb.Append(_AsciiChars(index))
    14. End If
    15. Next
    16. If Not toggle Then
    17. sb.Append("<BR>")
    18. toggle = True
    19. Else
    20. toggle = False
    21. End If
    22. Next
    23. Return sb.ToString()
    24. End Function
    25. Private _AsciiChars As String() = {"#", "#", "@", "%", "=", "+", "*", ":", "-", ".", "", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
    26. Sub StartDisplay(URL As String)
    27. Dim image As New Bitmap(URL, True)
    28. Dim _Content = ConvertToAscii(image)
    29. Debug.Write(_Content)



    Weiß jemand, woran das liegt und wie man das beheben kann?
    Liebe Grüße
    sothere
    Hi
    ein paar kleine Kritikpunkte deines Quellcodes:
    - Ich würde _AsciiChars als Char() und nicht als String() deklarieren
    - Den Grauwert würde ich über GetBrightness ermitteln, d.h. 255 * pixelColor.GetBrightness(). Du kannst auch direkt über LockBits arbeiten, dann wäre Brightness aber anhand einer anderen Funktion zu ermitteln. (War das nicht irgendwie (Max{r, g, b}+Min{r, g, b}) / 2 oder sowas?)
    - Du berechnest den Grauwert übrigens drei mal, obwohl gilt red = green = blue = grayColor.R = grayColor.G = grayColor.B, das solltest du weglassen

    Viele Grüße
    ~blaze~
    Hier wird nicht Die Summe von 3 Integern berechnet, sondern die Summe von 3 Bytes. Und Byte + Byte = Byte, deshalb kommt es auch sehr schnell zu einem Overflow.
    Korrekt ist hier, vorher schon zu Integer zu konvertieren:

    VB.NET-Quellcode

    1. Dim Average = (CInt(Pixel.R) + CInt(Pixel.G) + CInt(Pixel.B)) / 3
    2. 'Oder so, weil Integer + Byte = Integer, aber das sieht komisch aus:
    3. Dim Average = (CInt(Pixel.R) + Pixel.G + Pixel.B) / 3
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    VB.NET-Quellcode

    1. Dim Average = (CInt(Pixel.R) + Pixel.G + Pixel.B) / 3
    Damit Aveerage nicht vom Typ Double ist, machen wir noch Integer-Division:

    VB.NET-Quellcode

    1. Dim Average = (CInt(Pixel.R) + Pixel.G + Pixel.B) \ 3
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!