Pixel in einem Bild einzeln setzen.

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Pixel in einem Bild einzeln setzen.

    Hallo,

    ich schreibe gerade ein Programm, welches einen Text mit allen visuellen Zeichen (glaube es sind so um die 255 maximal) in ein Bild umwandelt. Dabei wird jedes Zeichen in ein Pixel in einer bestimmten Farbe umgewandelt (z.B. A = Gelb (bzw, 255 Grün, 255 Rot, 0 Blau)).

    Ich erstelle dafür ein Bild in der Größe des Textest (So dass für jeden Buchstaben 1 Pixel zur Verfügung steht) mit dieser Methode.

    Die Function
    Spoiler anzeigen

    Bitte korrigiert mich falls ich hier falsch gerechnet habe.

    VB.NET-Quellcode

    1. Private Function CreatePicture(ByVal TextLength As Integer) As Bitmap
    2. Dim Pic As Bitmap
    3. Dim big As Integer = Math.Round(Math.Pow(TextLength, 0.5), 0) 'Weil a * b (Da a = b => a²) die Fläche des Bildes und somit big * big = TextLength ergeben müsste.
    4. Pic = New Bitmap(Width:=big, Height:=big)
    5. Return Pic
    6. End Function
    7. 'Und speichere es als png ab.



    Ich habe eine 10MB Große MP3 Datei in Text umgewabndelt und aus der TextLength ein bild erstellt. Da es bei einem Bild auf die Auflösung ankommt, wieviel speicher die verbraucht sieht es gut aus, dass diese komprimierung klappt, denn das bild hat ca. 300kb Speiche rverbraucht. Das Bild habe ich als PNG abgespeichert, ich hoffe, dass dadruch keine Pixel verfälscht werden, bitte korrigiert mich, wenn ich falsch liege.

    Meine Frage ist jetzt, wie bzw. mit welcher Klasse in .NET kann ich die Pixel eines Images bzw. Bitmaps inzeln setzen (mit Farbe und Position)
    Jo die Methode gibt es^^ Muss jetzt noch jedem Char eine Farbe zuweisen. Das Auslesen funktioniert auch über .GetPixel(xPos,yPos)

    Eignet sich png als Format dazu gut oder könnt ihr mir bessere formate empfehlen? (Ganz ganz wichtig ist, dass keine Pixel verfälscht werden.)
    Habe gerade 3 verscheidene Dateien zu Text umgewandelt und festgestellt, dass nur die Zeichen A...Z, a...z, 0..9 und /,+,= verwendet werden.

    Habe für alle jetzt eine mühsame billigmethode erstellt^^

    Methode:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function GetColorByChar(ByVal pChar As Char) As Color
    2. 'Reserviert Black, Blue, Yellow, Green, Red, White, Gold, Gray
    3. 'Reserviert DarkBlue ... DarkViolett
    4. Select Case pChar
    5. 'Großbuchstaben
    6. Case "A" : Return Color.AliceBlue
    7. Case "B" : Return Color.AntiqueWhite
    8. Case "C" : Return Color.Aqua
    9. Case "D" : Return Color.Aquamarine
    10. Case "E" : Return Color.Azure
    11. Case "F" : Return Color.Beige
    12. Case "G" : Return Color.Bisque
    13. Case "H" : Return Color.BlanchedAlmond
    14. Case "I" : Return Color.BlueViolet
    15. Case "J" : Return Color.Brown
    16. Case "K" : Return Color.BurlyWood
    17. Case "L" : Return Color.CadetBlue
    18. Case "M" : Return Color.Chartreuse
    19. Case "N" : Return Color.Chocolate
    20. Case "O" : Return Color.Coral
    21. Case "P" : Return Color.CornflowerBlue
    22. Case "Q" : Return Color.Cornsilk
    23. Case "R" : Return Color.Crimson
    24. Case "S" : Return Color.Cyan
    25. Case "T" : Return Color.DeepPink
    26. Case "U" : Return Color.DeepSkyBlue
    27. Case "V" : Return Color.DimGray
    28. Case "W" : Return Color.DodgerBlue
    29. Case "X" : Return Color.Empty
    30. Case "Y" : Return Color.Firebrick
    31. Case "Z" : Return Color.FloralWhite
    32. 'Kleinbuchstaben
    33. Case "a" : Return Color.ForestGreen
    34. Case "b" : Return Color.Fuchsia
    35. Case "c" : Return Color.Gainsboro
    36. Case "d" : Return Color.GhostWhite
    37. Case "e" : Return Color.Goldenrod
    38. Case "f" : Return Color.GreenYellow
    39. Case "g" : Return Color.Honeydew
    40. Case "h" : Return Color.HotPink
    41. Case "i" : Return Color.IndianRed
    42. Case "j" : Return Color.Indigo
    43. Case "k" : Return Color.Ivory
    44. Case "l" : Return Color.Khaki
    45. Case "m" : Return Color.Lavender
    46. Case "n" : Return Color.LavenderBlush
    47. Case "o" : Return Color.LawnGreen
    48. Case "p" : Return Color.LemonChiffon
    49. Case "q" : Return Color.LightBlue
    50. Case "r" : Return Color.LightCoral
    51. Case "s" : Return Color.LightCyan
    52. Case "t" : Return Color.LightGoldenrodYellow
    53. Case "u" : Return Color.LightGray
    54. Case "v" : Return Color.LightGreen
    55. Case "w" : Return Color.LightPink
    56. Case "x" : Return Color.LightSalmon
    57. Case "y" : Return Color.LightSeaGreen
    58. Case "z" : Return Color.LightSkyBlue
    59. 'Zahlen
    60. Case "0" : Return Color.DarkBlue
    61. Case "1" : Return Color.DarkCyan
    62. Case "2" : Return Color.DarkGoldenrod
    63. Case "3" : Return Color.DarkGray
    64. Case "4" : Return Color.DarkGreen
    65. Case "5" : Return Color.DarkKhaki
    66. Case "6" : Return Color.DarkMagenta
    67. Case "7" : Return Color.DarkOliveGreen
    68. Case "8" : Return Color.DarkOrange
    69. Case "9" : Return Color.DarkOrchid
    70. 'Sonderzeichen
    71. Case "/" : Return Color.DarkRed
    72. Case "+" : Return Color.DarkSalmon
    73. Case "=" : Return Color.DarkSeaGreen
    74. Case Else
    75. MsgBox("Unbekanntes Zeichen!" & ControlChars.CrLf & _
    76. "Zeichen: " & pChar, MsgBoxStyle.Critical)
    77. Exit Function
    78. End Select
    79. End Function


    Es wäre echt besser alle Zeichen im ASCII auszugeben, da dadurch aus Sonderzeichen, die eher selten vorkommen gedeckt sind.
    Habe mir abe rüberlegt, noch einfacher were es den Text in Hexadecimal Text umzuwandeln dann hat man ja nur 1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F ^^
    Weis nur nicht wie :(
    omg...xD

    VB.NET-Quellcode

    1. Function GetColorByChar(Char As Char)As Color
    2. Return Color.FromArgb(Asc(Char),Asc(Char),Asc(Char))
    3. End Function

    ist doch viel schöner, jetzt hast du nur Graustufen...und somit auch ein allgemein kleines bild
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das klappt nicht, weil bei Asc(Of Char) das Asc diese große Anzahl von Typargumenten nicht akzeptiert.

    Ne diese komprimiermethode funktioniert nicht, die Datei (Bilddatei) wird nach dem abspeichern doppelt so groß, wie das original^^
    Das das Bild ohne die Pixel um ein vielfaches weniger speiche rverbraucht hat, lag daran, dass da eben noch keine pixel gesetzt waren und somit autom. reingeschrieben wurde, ganzes bild farbe transparent. Wenn man aber pixel setzt funktioniert dies nicht mehr und das Bild verbraucht erheblich mehr speicher.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ViktorS“ ()

    Hab ich das richtich verstanden?
    Du willst einen Text in Pixel umwandeln und den Text damit komprimieren? :D

    Rechne ma nach:
    1 Asci-Zeichen = 1 Byte
    1 Color = 1 Byte Alpha, 1 Byte Rot, 1 Byte Gelb, 1 Byte Blau = 3 Byte...

    Wo sparst du da ;(

    Edit:
    Noch schlimmer.... 1 Color = 4 Byte (zählen müsste man können)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vatter“ ()

    @Vatter: ja vom Prinzip her richtig = 4 Bytes aber bei bmp jpg und vielen anderen Formaten gibt es keinen AlphaChannel somit 3, außerdem gibt es die möglichkeit ein Bild in Graustufen zu zeichnen, somit wieder nur ein Byte, jedoch benötigt ein Bild alleine 0 Pixel ein paar Bytes, weil ja auch Informationen über das Bild gespeichert werden müssen...

    aber trotzallem wird mit komprimieren hier nix gemacht...

    @ViktorS: dann probier halt statt Asc(Char) einfach mal System.Text.Encoding.Utf8.GetBytes(Char)(0)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Habe es versucht und schnell erkannt eine Datei in einem Bild zu komprimieren wird garantiert nichts^^, wenn schon dan were es sinnvoller eine Art Trichterprinzip zu erstellen. Eine Datei läuft einen "Trichter" durch und am ende kommt eine ARt Schlüßel heraus. Diesen Schlüssel kann man wieder an das andere Ende des "Trichtesr" werfen udn es kommt die Datei heraus^^. Also die Datei wird gelöscht aber man hat einen Schlüßel mit dem man diese rekonstruieren kann. Nur diesen Schlüßel zu bilden ist schwer, ich werde mir da noch was überelegen, wenn mir was einfällt melde ich mich vermutlich wieder :)
    komprimierter Schlüssel? jenachdem wird dies sehr schwer, aber fürs Komprimieren hatten wir hier vor nicht allzu langer zeit etwas...
    andernfalls such mal nach .Net Text verschlüsseln
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---