Autor Beitrag
davaaron
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 15.04.16 19:23 
Hi,

auf meinem Desktop liegt eine Text-Datei, in der die ARGB Pixelwerte vorhanden sind.
Jetzt will ich diese Daten in eine bmp einlesen und in einer PictureBox darstellen,
doch als Fehler kommt "Illegal.ArgumentException" beim Erstellen der bmp.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Height = 500;
Width= 500;
Bitmap bmp = DrawFilledRectangle(Width, Height);

private Bitmap DrawFilledRectangle(int x, int y)
        {
            Bitmap bmp = new Bitmap(x, y);
            using (Graphics graph = Graphics.FromImage(bmp))
            {
                Rectangle ImageSize = new Rectangle(00, x, y);
                graph.FillRectangle(Brushes.White, ImageSize);
            }
            return bmp;
        }


Der Fehler tritt an der Stelle: Bitmap bmp = new Bitmap(x, y); auf.
Auch ein
ausblenden C#-Quelltext
1:
Bitmap bmp = new Bitmap(500,500);					

funktioniert nicht. Der Konstruktor von Bitmap mit new Bitmap(int x, int y) gibt es, aber er wirft eine Exception und ich weiß nicht wieso.
Kann mir jemand auf die Sprünge helfen?
Direkt etwas in die bmp zu zeichnen ist schwierig, weil ich die Pixel in der einer .txt-Datei habe.
Meine Idee war, "Height"-Mal über die Width zu iterieren und jeden einzelnen Pixel mit SetPixel() zu setzen.


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Fr 15.04.2016 um 20:16
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 15.04.16 19:59 
Mag sich doof anhören aber hinter Bitmap steckt GDI+ also etwas das nicht von .Net kontrolliert wird. Der Bitmap Konstruktor fordert vom System Speicher an und nicht vom eigentlichen .Net Subsystem.
Leider ist GDI+ ein riesiger Haufen Dreck, reagiert nicht nachvollziehbar, Doku konvergiert gegen 0 und die Rückmeldung von der GDI+ API sind so schlecht das auch .Net Probleme hat die zu verstehen.

Es läuft daraus hinaus das dir die Fehlermeldung vermutlich sagen will das nicht genug (zusammenhängender) Speicher zur Verfügung steht um ein 500*500 Bitmap (in 32bit Farbtiefe) anzulegen. Warum auf deinem System sowenig Speicher zur Verfügung steht kann ich dir nicht sagen. (Mit deinem Code bei mir komme ich so etwa bis 15000*15000).

Edit: Ich würde dir raten die Daten eh erst aufzubereiten und in ein Byte[] zu schreiben. Danach kannst du das dann über diesen Konstruktor in ein Bitmap Object schieben
davaaron Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 15.04.16 20:28 
Danke für deine Antwort.

Ich bin neu C# und wusste das nicht.

Nun ja, eigentlich liegen die Daten in Color vor, also ich habe die Daten in eine List<Color> gespeichert und in die Text-Datei geschrieben, weil ich damit mehr anfangen konnte als mit einem byte[].
Aber dann werde ich wohl doch so machen.

Vielen Dank!
Ich werde mich nochmal melden, ob es geklappt hat oder nicht.

edit: Also meine erste Hürde ist es, die Pixel in das byte-Array zu packen, da die Typen ja nicht passen. Leider wüsst ich jetzt auch nicht, wie ich das konvertieren könnte. (ohne MemorySteam oder ähnliches)

Ich habe es hinbekommen :)
Ich lese Zeile für Zeile, wobei in der Textdatei nicht nur die Pixel, sondern auch Width und Height stehen.
Alles bis auf Width und Height schiebe ich in mein byte-Array über eine while-Schleife mit einem Counter für den Index des Arrays.
Dann benutze ich einen Stream, um daraus eine Bitmap zu generieren.