Bitmap mithilfe einer System.Drawing.Drawing2D.Matrix skalieren, rotieren, ..

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bitmap mithilfe einer System.Drawing.Drawing2D.Matrix skalieren, rotieren, ..

    Moin,
    ich habe den ganzen Nachmittag gegoogelt, wie ich ein Bild mithilfe einer Matrix skalieren kann.

    Dies ist mein bisheriger Code:
    Spoiler anzeigen

    C#-Quellcode

    1. private void x_scale()
    2. {
    3. PictureBox2.Image = null;
    4. using (CommonOpenFileDialog OFD = new CommonOpenFileDialog())
    5. {
    6. OFD.Title = "Datei zum Öffnen auswählen";
    7. OFD.Filters.Add(new CommonFileDialogFilter("Bilder", ".jpg;.jpeg;.bmp;.png"));
    8. if (System.IO.Directory.Exists(@"C:\Users\...\Pictures"))
    9. {
    10. OFD.InitialDirectory = @"C:\Users\...\Pictures";
    11. }
    12. else
    13. {
    14. OFD.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    15. }
    16. CommonFileDialogResult result;
    17. this.Invoke((Action)(() =>
    18. {
    19. result = OFD.ShowDialog();
    20. if (result == CommonFileDialogResult.Ok)
    21. {
    22. Pfad_Bild = OFD.FileName;
    23. PictureBox2.Image = System.Drawing.Image.FromFile(OFD.FileName);
    24. zu_transformierendes_Bild = new Bitmap(Pfad_Bild);
    25. }
    26. else
    27. {
    28. return;
    29. }
    30. }));
    31. } // using Dialog
    32. int height = zu_transformierendes_Bild.Height;
    33. int width = zu_transformierendes_Bild.Width;
    34. double[,,] doubleArray = zu_transformierendes_Bild.ToMatrix(); //ToByteArray(zu_transformierendes_Bild, System.Drawing.Imaging.ImageFormat.Bmp);
    35. using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(zu_transformierendes_Bild))
    36. {
    37. using (System.Drawing.Drawing2D.Matrix matrix1 = new System.Drawing.Drawing2D.Matrix())
    38. {
    39. matrix1.Translate(zu_transformierendes_Bild.Width / 2, zu_transformierendes_Bild.Height / 2);
    40. graphics.Transform = matrix1;
    41. matrix1.Scale((float)Math.Cos(eingegebener_Winkel_in_Grad * Math.PI / 180.0), 1f);
    42. zu_transformierendes_Bild.Save(@"C:\Users\...\Desktop\Test.png", System.Drawing.Imaging.ImageFormat.Png);
    43. }
    44. }
    45. }
    46. public static byte[] ToByteArray(System.Drawing.Bitmap myBitmap, ImageFormat format)
    47. {
    48. using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    49. {
    50. if (myBitmap != null)
    51. {
    52. myBitmap.Save(ms, format);
    53. return ms.ToArray();
    54. }
    55. return Array.Empty<byte>();
    56. }
    57. }



    Die Funktion ToByteArray() hatte ich im Internet gefunden. Ich dachte, ich kann damit was machen... Danach habe ich gedacht, dass ich mittels Accord.Imaging eine Matrix erstellen kann, denn der Befehl heißt so schön "Image.ToMatrix()" . Also installiert, und was ist passiert? Das gibt mir nur ein Array zurück .
    Und der Code, den ich gerade nicht auskommentiert habe, funktioniert nicht. Das gespeicherte Bild sieht genauso aus wie das Original.

    Bartosz schrieb:

    Das gespeicherte Bild sieht genauso aus wie das Original.
    Was genau soll passieren?
    Wie soll das Bild rotiert werden?
    Für 90°, 180°, 270°-Rotation gibt es Image.RotateFlip(...).
    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!