Bitmap in einen Byte Array konvertieren

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

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Bitmap in einen Byte Array konvertieren

    Hi,

    Ich habe eine Bitmap, die ich etwa mit "rotate" oder "flip" verändert habe und dich ich nun in einen File speichern will.

    So habe ich das gelöst:

    VB.NET-Quellcode

    1. myImageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg)
    2. myEncoder = Encoder.Quality
    3. myEncoderParameters = New EncoderParameters(1)
    4. Dim QualityLevel As Integer = 95
    5. myEncoderParameter = New EncoderParameter(myEncoder, QualityLevel)
    6. myEncoderParameters.Param(0) = myEncoderParameter
    7. Try
    8. Dim myArray As New Byte()
    9. Dim st As Stream
    10. st = File.Open(myTargetFile, FileMode.OpenOrCreate, FileAccess.Write) 'Saves BITMAP into FILE (myTargetFile)
    11. bitmap1.Save(st, myImageCodecInfo, myEncoderParameters)
    12. st.Close()
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message)
    15. lblMessage.Text = "*** Could not convert bitmap1"
    16. Exit Sub
    17. End Try


    Das funktioniert auch soweit ganz prima.

    Allerdings möchte ich den File vor dem Speichern verschlüsseln. Die Routine die ich dazu verwende, benötigt die Eingabe as ByteArray.

    Zur Zeit lese ich den File wieder als ByteArray ein, verschlüssele das Dingens und schreibe den File dann zurück.

    Das ist natürlich NICHT OPTIMAL !

    Wie kann ich denn die BITMAP als ByteArray erhalten ... also die Ausgabe statt in myTargetFile den Stream in myByteArray lenken ?

    Die Anweisung

    VB.NET-Quellcode

    1. bitmap1.Save(st, myImageCodecInfo, myEncoderParameters)


    nimmt as Parameter nur einen STREAM entgegen !

    Kann mir jemamd nachsichtig helfen ?

    LG
    Peter
    @Peter329 Mit bmp.LockBits() kommst Du an die Bits der Bitmap. Kannst sie manipulieren und mit bmp.UnlockBits() den Vorgang abschließen.
    docs.microsoft.com/de-de/dotne…its?view=netframework-4.8
    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!

    VB.NET-Quellcode

    1. Private Function BitmapToByteArray(ByVal image As Bitmap) As Byte()
    2. Dim converter As New ImageConverter()
    3. Return DirectCast(converter.ConvertTo(image, GetType(Byte())), Byte())
    4. End Function
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Vor langer Zeit habich mal iwo gelesen, man solle für solch die TypeDescriptor-Klasse verwenden (wohl damit nicht beliebig viele Converter erstellt werden?):

    VB.NET-Quellcode

    1. Private Function BitmapToByteArray(ByVal image As Bitmap) As Byte()
    2. Dim converter = TypeDescriptor.GetConverter(Gettype(Image))
    3. Return DirectCast(converter.ConvertTo(image, GetType(Byte())), Byte())
    4. End Function
    jo, scheint so, laut docs.microsoft greift man via TypeDescriptor-Object drauf zu, gerade eben flott nachgeschaut, steht aber net warum.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    Vielen Dank erst mal für eure Antworten !

    Das mit dem Converter schreibt die Bitmap 1:1 in einen ByteArray ...

    Das ist aber leider nicht die GANZE Funktionalität von bitmap.Save ... da gibt es den Parameter QualityLevel ... der steht in meinem Beispiel jetzt auf 95 wird aber in der Anwendung per NumControl auf beliebige Werte eingestellt. Der Anwender kann damit den erzeugten File auf eine geringere Größe reduzieren.

    Ich benötige also eine Möglichkeit, wie ich den Stream st so modifizieren kann, dass er nicht in einen File, sondern in einen ByteArray schreibt. Also irgendwie so etwas mit myArray statt myTargetFile :

    VB.NET-Quellcode

    1. Try
    2. Dim myArray As New Byte()
    3. Dim st As Stream
    4. st = Array.Open(myArray, FileMode.OpenOrCreate, FileAccess.Write) 'Saves BITMAP into ARRAY (myArray)
    5. bitmap1.Save(st , myImageCodecInfo, myEncoderParameters)
    6. st.Close()


    Natürlich klappt dieses Coding NICHT ! Das ist ja gerade mein Problem ...

    Ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Peter329“ ()

    Meinst du so etwas?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Drawing.Imaging
    3. Public Class Form1
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
    5. Using bmp As New Bitmap("E:\Images\abc.jpg")
    6. bmp.RotateFlip(RotateFlipType.RotateNoneFlipXY)
    7. Using ms As New MemoryStream()
    8. Dim myImageCodecInfo As ImageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg)
    9. Dim myEncoder As Encoder = Encoder.Quality
    10. Dim QualityLevel As Integer = 95
    11. Using myEncoderParameters As New EncoderParameters(1)
    12. Using myEncoderParameter As New EncoderParameter(myEncoder, QualityLevel)
    13. myEncoderParameters.Param(0) = myEncoderParameter
    14. bmp.Save(ms, myImageCodecInfo, myEncoderParameters)
    15. End Using
    16. End Using
    17. Dim bytes() As Byte = ms.ToArray()
    18. IO.File.WriteAllBytes("D:\test.jpg", bytes)
    19. End Using
    20. End Using
    21. End Sub
    22. Private Function GetEncoderInfo(ByVal format As ImageFormat) As ImageCodecInfo
    23. Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageDecoders()
    24. For Each codec As ImageCodecInfo In codecs
    25. If codec.FormatID = format.Guid Then
    26. Return codec
    27. End If
    28. Next
    29. Return Nothing
    30. End Function
    31. End Class

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @Peter329 Wenn Du die Information im Byte-Array hast, was soll denn nun auf Platte geschrieben werden?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim bmp = New Bitmap("C:\Temp\temp.png")
    6. Dim rect = New Rectangle(0, 0, bmp.Width, bmp.Height)
    7. Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat)
    8. ' Start des Bildes
    9. Dim ptr As IntPtr = bmpData.Scan0
    10. ' Anzahl der Bytes bestimmen
    11. Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
    12. Dim rgbValues = New Byte(bytes - 1) {}
    13. ' RGB-Werte in das Byte-Array kopieren
    14. Marshal.Copy(ptr, rgbValues, 0, bytes)
    15. For i = 2 To rgbValues.Length - 1 Step 3
    16. ' jedes 3. Byte auf 255 setzen, eine 24-BPP-Bitmap wird rot
    17. rgbValues(i) = 255
    18. Next
    19. ' RGB-Werte zurück kopieren
    20. Marshal.Copy(rgbValues, 0, ptr, bytes)
    21. bmp.UnlockBits(bmpData)
    22. PictureBox1.Image = bmp
    23. End Sub
    24. End Class
    In welcher Reihenfolge sollen denn die Operationen ausgeführt werden?
    Wer entschlüsselt denn das Bild?
    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!
    Also erst einmal ganz herzlichen Dank an euch beide.

    Ich habe jetzt die Lösung von @Nolde versucht nachzuvollziehen. Die Sache mit dem MemoryStream ist goldrichtig ! Damit erhalte ich den ByteArray den ich zum Verschlüsseln benötige.

    Allerding knabbere ich noch an dieser Anweisung:

    VB.NET-Quellcode

    1. bitmap1.RotateFlip(RotateFlipType.RotateNoneFlipXY)


    Wozu wird denn diese Anweisung benötigt ? Weglassen kann man sie nicht, sonst erhält man eine "GDI+" Exception.

    Mit der Anweisung wird das Bildchen aber auf den Kopf gestellt. Das liegt wohl am FlipY bzw. am FlipXY.

    Mit RotateNoneFlipNone gehts aber auch nicht, da erhalte ich wieder eine "GDI+" Exeption.

    Ich habe das Problem dann wie folgt umgangen:

    VB.NET-Quellcode

    1. bitmap1.RotateFlip(RotateFlipType.Rotate270FlipNone)
    2. bitmap1.RotateFlip(RotateFlipType.Rotate90FlipNone)


    Ich drehe das Bildchen also einmal im Kreis. Dann steht das Ding nicht mehr auf dem Kopf.

    Damit könnte ich zur Not leben. Aber so richtig happy bin ich mit der Lösung natürlich nicht.

    Kann mir jemand erklären, was da passiert und wie ich das nach der "reinen Lehre" richtig abhandle ?

    LG
    Peter

    Mit
    Woah, langsam! Stichwort Root cause analyse.
    OK, einen GDI+-Fehler grundsätzlich zu beheben, ist etwas schwierig, da man die Ursache nicht so leicht finden kann, aber die RotateFlip-Zeile ist nicht für das Funktionieren des Codes verantwortlich. Sie ist optional. Aber hey: Wenn ich sie weglasse, bekomme ich mit NoIdes (mit I wie Integer, nicht L wie Long) Code keinen Fehler.
    Kannst Du ein anderes Bild testen? Vielleicht liegt es daran.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Peter329 Es gibt Drehen und Spiegeln. Einiges davon ist doppelt belegt:
    Um 180° drehen ist äquivalent zu Spiegeln um xy (spiegeln um x und spiegeln um y).
    Bei mir funktioniert das tadellos.
    Wie sind denn die Pixelgrößen Deines Bildes?
    Wann in Deinem Ablauf wendest Du das an?
    Wenn Du das Bild verschlüsselst, musst Du aufpassen, ob Du nur die Pixel oder aber auch die Header-Info verschlüsselst.
    Mit meinem Code greifst Du nur auf die Pixel, nicht aber auf die Header-Info zu.
    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!
    Erstmal Danke für eure Antworten.

    Wenn ich das richtig verstehe, dürfte kein GDI+ Fehler auftreten. Tut er bei mir aber leider doch.Ich hab das jetzt in einem kleinen Test Project nachgestellt:

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.IO
    3. Public Class Form1
    4. Dim BaseDirectory As String = "C:\xxxx\yyyy" ''Define input
    5. Dim BaseFilename As String = "myfile.jpg"
    6. Dim myObject As String = Path.Combine(BaseDirectory, BaseFilename)
    7. Dim bitmap1 As Bitmap = Nothing
    8. Dim bytes(-1) As Byte
    9. Private Sub frmRotateFlipImage_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. LoadFile()
    11. End Sub
    12. Private Sub cmdRotateLeft_Click(sender As Object, e As EventArgs) Handles cmdRotateLeft.Click
    13. RotateFlipBitmap(RotateFlipType.Rotate270FlipNone)
    14. End Sub
    15. Private Sub cmdRotateRight_Click(sender As Object, e As EventArgs) Handles cmdRotateRight.Click
    16. RotateFlipBitmap(RotateFlipType.Rotate90FlipNone)
    17. End Sub
    18. Private Sub cmdFlip_Click(sender As Object, e As EventArgs) Handles cmdFlip.Click
    19. RotateFlipBitmap(RotateFlipType.Rotate180FlipY)
    20. End Sub
    21. Private Sub RotateFlipBitmap(myRotateFlipType As RotateFlipType)
    22. bitmap1.RotateFlip(myRotateFlipType)
    23. PictureBox1.Image = bitmap1
    24. End Sub
    25. Private Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click
    26. SaveFile()
    27. End Sub
    28. Private Sub LoadFile()
    29. Using fs As New FileStream(myObject, FileMode.Open) 'Using is required to release lock on file
    30. bitmap1 = New Bitmap(fs)
    31. End Using
    32. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    33. PictureBox1.Image = bitmap1
    34. End Sub
    35. Private Sub SaveFile()
    36. 'bitmap1.RotateFlip(RotateFlipType.Rotate270FlipNone) 'Bypass GDI+ problem (rotate full circle)
    37. 'bitmap1.RotateFlip(RotateFlipType.Rotate90FlipNone)
    38. 'Convert bitmap to byte array
    39. Using ms As New MemoryStream()
    40. Dim myImageCodecInfo As ImageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg)
    41. Dim myEncoder As Encoder = Encoder.Quality
    42. Dim QualityLevel As Integer = 95
    43. Dim myEncoderParameters As New EncoderParameters(1)
    44. Dim myEncoderParameter As New EncoderParameter(myEncoder, QualityLevel)
    45. myEncoderParameters.Param(0) = myEncoderParameter
    46. bitmap1.Save(ms, myImageCodecInfo, myEncoderParameters) 'Crashes with GDI+ error, unless RotateFlip was executed
    47. bytes = ms.ToArray()
    48. End Using
    49. 'Save byte array to file
    50. IO.File.WriteAllBytes(myObject, bytes)
    51. MessageBox.Show("OK,file was saved.")
    52. End Sub
    53. <DebuggerStepThrough>
    54. Private Shared Function GetEncoderInfo(ByVal format As ImageFormat) As ImageCodecInfo
    55. Dim j As Integer = 0
    56. Dim encoders() As ImageCodecInfo
    57. encoders = ImageCodecInfo.GetImageEncoders()
    58. While j < encoders.Length
    59. If encoders(j).FormatID = format.Guid Then Return encoders(j)
    60. j += 1
    61. End While
    62. Return Nothing
    63. End Function
    64. End Class


    Wenn ich das Project starte und sofort "cmdSave" klicke, erhalte ich den GDI+ Fehler im bitmap1.Save(....) .

    Wenn ich aber erst irgend einen der "cmdRotate..." Befehle ausführe und danach "cmdSave" klicke, dann funzt der Save Befehl ohne Probleme.

    Das Problem kann ich umgehen, in dem ich die beiden Zeilen zum "Vollkreis Rotate" aktiviere. Aber wie schon gesagt, damit bin ich halt nicht so richtig happy.

    Ich habe das mit ganz verschiedenen .jpg Dateien ausprobiert. Das Problem sollte also reproduzierbar sein.

    Ich hoffe, ihr habt Ideen, wie ich das Problem lösen kann.

    LG
    Peter

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

    Nope, ich nicht. Habe Deinen Code per copy&paste verwendet. Funktioniert. Programm starten, Bild wird geladen, auf [save] -> "OK,file was saved.". Nochmal: Liegt es ggf. am Bild? Oder am Pfad? Kannst Du ein Testbild, bei dem es nicht klappt, mal bitte per [+ Erweiterte Antwort] hochladen?

    ##########

    Ui, das ist interessant. Ich habe ein PNG-Bild kopiert, es umbenannt und dann mit dem Programm geladen. Das klappt. Sobald ich jenes Bild aber einmal mit Paint.Net geöffnet habe und Paint.Net wieder schließe, bekomm ich die von Dir genannte Fehlermeldung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @Peter329 Auch ich habe keine Probleme mit dem Code, hab ihn als AnyCPU, x64 und x86 compiliert und laufen lassen.
    Welche Umgebung verwendest Du, welches Framework?
    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!
    Ich muss korrigieren, da habe ich nicht genügend getestet. Paint.Net ist wohl doch unschuldig. Ich komme eher zu dem Schluss, dass der Code nur mit PNG-Bildern (bei mir) klappt. BMP und JPEG lassen sich mit dem Code nicht abspeichern - Deine Fehlermeldung kommt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hier die gewünschten Informationen:

    Windows 7
    .NET framework 4.6.1
    Plattform "Any CPU"

    Ein Bildchen zum Testen habe ich angehängt (eigenes Bild, kein Copyright! :) ).

    LG
    Peter
    Bilder
    • IMG_2862.JPG

      1,45 MB, 2.048×1.536, 61 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    @VaporiZed Der war gut. :thumbup:
    @Peter329 Dann konvertieren wir das Bild implizit nach PNG und schon redet die Nachbarin wieder mit Dir:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub SaveFile()
    2. 'bitmap1.RotateFlip(RotateFlipType.Rotate270FlipNone) 'Bypass GDI+ problem (rotate full circle)
    3. 'bitmap1.RotateFlip(RotateFlipType.Rotate90FlipNone)
    4. Using bmp As New Bitmap(bitmap1.Width, bitmap1.Height)
    5. Using g = Graphics.FromImage(bmp)
    6. g.DrawImage(bitmap1, Point.Empty)
    7. End Using
    8. 'bmp.Save("c:\temp\tteemmp.png")
    9. 'Convert bitmap to byte array
    10. Using ms As New MemoryStream()
    11. Dim myImageCodecInfo As ImageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg)
    12. Dim myEncoder As Encoder = Encoder.Quality
    13. Dim QualityLevel As Integer = 95
    14. Dim myEncoderParameters As New EncoderParameters(1)
    15. Dim myEncoderParameter As New EncoderParameter(myEncoder, QualityLevel)
    16. myEncoderParameters.Param(0) = myEncoderParameter
    17. bmp.Save(ms, myImageCodecInfo, myEncoderParameters) 'Crashes with GDI+ error, unless RotateFlip was executed
    18. bytes = ms.ToArray()
    19. End Using
    20. End Using
    21. 'Save byte array to file
    22. IO.File.WriteAllBytes(myObject & ".jpg", bytes)
    23. MessageBox.Show("OK,file was saved.")
    24. End Sub
    bmp.Save("c:\temp\tteemmp.png") ohne Formatangabe abspeichern und mit dwem IrfanView öffnen - der meckert, wenn das Format nicht stimmt. ;)
    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!
    Wow ... das mit dem Umwandeln in einen .png file funktioniert. Der GDI+ Fehler ist weg !

    Aber ... trotzdem bin ich nicht happy ....

    Die Größe des neuen Datei ist signifikant kleiner ! (statt 1.4 MB nur noch 300 MB). (s. Anhang)

    Und außerdem enthält das neue Bildchen wohl einen dicken schwarzen Rand. (s. Anhang)

    .jpg ist die originäre Datei .... .jpg.jpg ist die neue Datei ...

    LG
    Peter
    Bilder
    • s 2019-04-28 12-37-526.jpg

      6,53 kB, 371×47, 61 mal angesehen
    • s 2019-04-28 12-38-556.jpg

      107,05 kB, 959×980, 55 mal angesehen
    • s 2019-04-28 12-39-127.jpg

      58,73 kB, 959×980, 61 mal angesehen
    @Peter329

    Jetzt bekomm ich ein Problem. Ich krieg nämlich Hunger.

    Es stimmt, dass PNG-Format kann als neutrales Format angesehen werden. Vielfach ist es aber besser über ein GIF-Format zu gehen, da die daraus entstehende ByteArray sehr schlank ist.

    Es gibt mehrere Möglichkeiten das Umzusetzen. Wichtig hierbei ist, dass die PropertyItems in der Bitmap bestehen bleiben.
    Es spielt keine Rolle ob ImageConverter, TypeConverter oder MemoryStream verwendet wird. Schlussendlich sofern die
    PropertyItems vorhanden sind, wird immer das gleiche ByteArray erzeugt.

    Im Anhang ein Beispiel


    Freundliche Grüsse

    exc-jdbi
    Dateien
    • Module2.vb

      (10,59 kB, 57 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Ich hab irgendwo den Faden verloren. Wo sind wir denn nun codiertechnisch bei PNG? In Zeile#11 ist ja kein ImageFormat als 2. Parameter angegeben. Ich seh immer nur JPEG. Oder ist das mit PNG implizit?
    Wenn man in RfGs Code Zeile#11 reaktiviert, sieht man schon an dieser Stelle, dass da ein Skalierungs-/Größenproblem vorliegt.
    Es ginge durch Stretching, aber ob das der Bildqualität auf Dauer so gut tut?
    Dafür in Zeile#8:

    VB.NET-Quellcode

    1. g.DrawImage(bitmap1, New Rectangle With {.X = 0, .Y = 0, .Height = bitmap1.Height, .Width = bitmap1.Width})


    btw:

    Peter329 schrieb:

    (statt 1.4 MB nur noch 300 MB)
    300 KB, nicht 300 MB ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.