none
Bitmap zu byte array RRS feed

  • Frage

  • Hallo!

    ich will in einer WPF-Anwendung eine Bilddatei untersuchen.

    Mit SharpDevelop und WindowsForms habe ich das mit Bitmap.GetPixel(int x, int y) gelöst,

    ich denke aber, dass es effizienter wäre, erst aus dem Bild ein byte-Array zu erstellen und dieses dann zu analysieren.

    Ich habe in den Weiten des Internets folgenden Code gefunden:

    byte[] imageToByteArray(System.Drawing.Image imageIn)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                return ms.ToArray();
            }

    Der Code scheint aber nicht zu funktionieren.

    Meine Anwendung erwartet ein Array der Form {Rot von Pixel 1, Grün von Pixel 1, Blau von Pixel 1, Alpha von Pixel 1, Rot von Pixel 2, Grün von Pixel 2, Blau von Pixel 2, Alpha von Pixel 2, Rot von Pixel 3, Grün von Pixel 3, Blau von Pixel 3, Alpha von Pixel 3...}

    Falls der Code das byte-Array mit einem anderem System erstellt, macht das nichts, ich kann ja meine Anwendung darauf anpassen. Streng genommen bräuchte ich die Alpha-Werte zur Analyse erstmal nicht.

    Vielleicht kennt ihr ja, falls der Code generell nicht funktioniert ein geeigneteres Beispiel oder wisst, mit welchem System das Byte-Array geschrieben wird.

    Dienstag, 24. März 2015 11:57

Antworten

  • Hallo,

    was passt Dir nicht an: Byte Array als .bmp, .jpg und .png speichern, wo so ziemlich alles drinsteht.

    Dein obiger Versuch ist wirkbefreit, denn damit erhältst Du eine GIF Datei und müsstest Deinem Programm das Auswerten von Gif89a (oder 87a) beibringen und für jedes weitere Format (JPG, PNG) gilt entsprechendes.

    Weswegen man üblicherweise die Datei als eine Windows Bitmap in den Speiecher einliest (Image eben), womit man nur ein (relativ einfaches) Speicherformat  bearbeiten muss - eine BMP Datei ist wieder komplexer. Das Wie stand bereits in Links in oben genannter Diskussion.

    Gruß Elmar

    Dienstag, 24. März 2015 12:52
    Beantworter
  • Hallo,

    der dort genannte Artikel von Bob Powell zeigt beides für System.Drawing, der von Charles Petzold das Äquivalent für WPF.

    Also bitte lesen und zu verstehen versuchen, anstatt sinnlosen Code zu produzieren!

    Gruß Elmar

    Dienstag, 24. März 2015 14:32
    Beantworter

Alle Antworten

  • Hallo,

    was passt Dir nicht an: Byte Array als .bmp, .jpg und .png speichern, wo so ziemlich alles drinsteht.

    Dein obiger Versuch ist wirkbefreit, denn damit erhältst Du eine GIF Datei und müsstest Deinem Programm das Auswerten von Gif89a (oder 87a) beibringen und für jedes weitere Format (JPG, PNG) gilt entsprechendes.

    Weswegen man üblicherweise die Datei als eine Windows Bitmap in den Speiecher einliest (Image eben), womit man nur ein (relativ einfaches) Speicherformat  bearbeiten muss - eine BMP Datei ist wieder komplexer. Das Wie stand bereits in Links in oben genannter Diskussion.

    Gruß Elmar

    Dienstag, 24. März 2015 12:52
    Beantworter
  • Ich möchte nicht, wie in einem älteren Thread von mir, eine Bilddatei aus einem byte array erstellen, sondern das genaue Gegenteil.

    Die Anwendung muss auf die Farbwerte einer Bilddatei zugreifen.

    Und zwar in der Form {R1,B1,G1,A1,R2,B2,G2,A2,...}

    Dienstag, 24. März 2015 13:36
  • Hallo DasKänguru,

    um an die Pixel-Zeilen zu kommen, kannst du Bitmap.LockBits(), BitmapData und dessen Scan0 verwenden. Scan0 ist der Zeiger auf das erste Byte: Link

    Gruß
    Heiko

    Dienstag, 24. März 2015 14:13
  • Hallo,

    der dort genannte Artikel von Bob Powell zeigt beides für System.Drawing, der von Charles Petzold das Äquivalent für WPF.

    Also bitte lesen und zu verstehen versuchen, anstatt sinnlosen Code zu produzieren!

    Gruß Elmar

    Dienstag, 24. März 2015 14:32
    Beantworter