Laden...

[Anfänger] Graphics in Bitmap konvertieren

Erstellt von digi333 vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.496 Views
D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren
[Anfänger] Graphics in Bitmap konvertieren

Ich bin blutiger Anfänger und ich möchte eine Graphics in ein Bitmap umwandeln. Ich hab schon gelesen, dass es nicht geht, aber vielleicht wenn man es Pixelweise ausließt...

Kann man irgendwie die Farbe von einem GraphicsPixel auslesen??? Meine Idee...


 Bitmap pic = new Bitmap(bmp.Width,bmp.Height);
 for (int x = 0; x < pic.Width; x++)
 {
       for (int y = 0; y < pic.Height; y++)
        {
               pic.SetPixel(x,y, mygraphics.??? [x,y] );  // <==
               // Umwandeln von Graphics in Bitmap (Pixelweise)
         }
 }

Bitte Hilfe!

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo digi333,

du hast richtig gelesen, es geht nicht!

Graphics ist quasi der Pinsel (allgemeiner das Zeichenwerkzeug) und Bitmap ist die Leinwand. Nach dem Zeichnen/Malen enthält die Leinwand das Bild. Der Pinsel enthält dagegen das Bild natürlich nicht. Wenn man sich nach dem Zeichnen nur den (benutzen) Pinsel anguckt, dann kann man daraus beim besten Willen nicht auf das Bild schließen.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren

Das ist ja blöd...

In Bitmap kann ich keine Linie zeichnen und ein Graphics kann ich nicht als Bitmap speichern. Ich benutze ja momentan nur das Graphics zum zeichnen und das Bitmap damit ich BitmapData (Rückgabewert des Programms) verwenden kann.

1.) Kann man in Bitmap ne Linie zeichnen?
2.) Kann man ein Graphics speichern und in Bitmap laden?
3.) Gibt es sowas wie GraphicsData?
4.) Kann ich irgendwie mit BitmapData arbeiten obwohl ich ein Graphics besitze.
5.) Stichwort: Vererbung von Methoden von Graphics und Bitmap??
6.) Vielleicht Casten?

Ich kann und will nicht glauben, dass man ein Bild zeichnen kann (mit Graphics), aber es nicht speichern (nur ein Beispiel) mit Bitmap. 🤔

Das scheint mir sowas von elementar... Ich verstehe dein Beispiel, aber als Programmiersprache macht es keinen wirklichen Sinn.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo digi333,

Ich verstehe dein Beispiel, aber als Programmiersprache macht es keinen wirklichen Sinn.

klar macht es Sinn! Mein Beispiel legt ja auch nahe, dass man mit einem Graphics in eine Bitmap zeichnen kann und das geht natürlich auch. Graphics als Pinsel muss natürlich auf eine Leinwand (z.B. Bitmap) angewendet werden, damit gezeichnet werden kann.


Graphics g = Graphics.FromImage (bmp);
g.DrawLine (...) // <= Zeichnet die Line in die Bitmap

herbivore

270 Beiträge seit 2005
vor 17 Jahren

Hi,natürlich kann man

ein Bild zeichnen(mit Graphics), und es dann als Bitmap speichern...
wenn es das ist was du meinest.(Glaube du hast dich am anfang etwas unverständlich ausgedrückt)

also:


Bitmap Bmp = null;
Graphics g = null;
Image Img;

Bmp = new Bitmap(100,100);//Bitmap erstellen
Img = Image.FromHbitmap(Bmp.GetHbitmap(Color.Green));//"Leinwand" erstellen
g = Graphics.FromImage(Img);//Grafic Objekt erzeugen
g.DrawString("Test",new System.Drawing.Font("Arial",40),new SolidBrush(Color.Red),new RectangleF(0,0,100,100));//was drauf pinseln
g.Save();//Grafic speichern(nitch zwingend nötig) 
Img.Save("Test.bmp");//Leinwand speichern(als bmp) fertig

//Noch aufräumen (das wichtig!!) 

Img.Dispose();
g.Dispose();
Bmp.Dispose();


mfg DerHulk

ps

kannst dir natürlich auch ein vorhandenses Bitmap als Leinwand nehmen und
dann darauf zeichnen!

I
1.739 Beiträge seit 2005
vor 17 Jahren

Ich vermute es geht. Der Graphicsnamespace himself, hat das wohl vergessen. Die GDI+-FlatApi hat aber eine solche Funktion, hab nie probiert, könnte aber gehen. Scheint auch die einzige vergessene Function zu sein.
Da ich eh gerade mit ner anderen Programmiersprache arbeite und GDI-FlatAPI Importe vornehme, kann ich sagen, dass es ein Bitmap/Image fromGraphics gibt.
Hält die Funktion was sie Verspricht gehts mit API-Calls (Die Objektbereinigung erfolgt allerdings dann manuell, und sollte nicht vergessen werden(Ein zwingendes Dispose sozusagen))

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren

Hui! Das ging ja schnell.

Wenn ich jedoch richtig verstanden hab, bin ich doch dann wieder am Anfang meiner Überlegung. Nach g.Draw(...) möchte ich g als Bitmap haben oder besser noch auf g BitmapData anwenden. Da bin ich ja wieder an dem ursprünglichen Problem... Wie wende ich auf g BitmapData an?

@DerHulk: Kann man vielleicht das "Test.bmp" wieder zurück holen als Bitmap (so dass ich dann BitmapData anwenden kann)?

Was macht den "Graphics.FromImage"?

Wie gesagt blutiger Anfänger (2 Tage) und nur wenig Erfahrung aus Java.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo digi333,

Wenn ich jedoch richtig verstanden hab

nein, hast du noch nicht 🙂

Nach g.Draw(...) möchte ich g als Bitmap

g.Draw zeichnet in die Bitmap!!!

Was macht den "Graphics.FromImage"?

Es erzeugt einen Pinsel (Graphics) für Leinwand (Bitmap).

Wenn dir der Code von Hulk nicht reicht, musst du wohl doch mal in ein Buch gucken. Ich denke wir haben das Thema hier erschöpfend behandelt.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren

@ikaros: 🤔 Häh? Ich bin doch ein Anfänger. Das einzige was ich verstanden habe und was mir irgendwie helfen soll ist wohl FromGraphics?

Meinst du das so???


Graphics mygraphics;
Bitmap pic = Image.FromGraphics(mygraphics)
49.485 Beiträge seit 2005
vor 17 Jahren

Hallo digi333,

vergisst einfach, was ikaros geschrieben hat. 🙂 Der schreibt öfter mal so konfus. 🙂

Hast du meinen letzten Beitrag gelesen? Der hat sich mit deiner Antwort überschnitten. Dann brauchst du die Möglichkeit von ikaros gar nicht, selbst wenn sie funktionieren würde.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren

Ich werde es morgen mal testen und dann den Quellcode auf euer Beispiel umschreibe.

Ich danke euch allen für euer Verständnis und eure Hilfe. THX 👍

Ich hab mir bei Ebay für 1 Euro + 4 Euro Versand das Buch Visual C# (800 Seiten) gekauft. Aber ich hab auch noch ein paar eBooks. Ich muß mich noch etwas einarbeiten.

I
1.739 Beiträge seit 2005
vor 17 Jahren

Was ich meine:
Das .Net - Framework kapselt die GDI(Flat)-API in Klassen, die einfach verwendbar sind und quasi sorgenfrei.
Soviel ich letztens sah beim Import in eine andere PS gabs eine Funktion der FlatAPI die nicht importiert wurde. Nennen wir die ImageFromGraphics(mit Parametern der Bildgrösse) an den genauen Namen der Funktion erinnere ich mich nicht gerade. Die knappe Beschreibung(Null + Quelltext der C++ Header) legt nahe das diese Funktion eine Bitmap(der gewünschten Grösse) der angewandten ZeichenOperationen auf das GraphicsObject zurückgeben kann(Sehr wahrscheinlich).
also A: Vielleicht(Wahrscheinlich) aber mit der Einschränkung das Schlampereien nicht erlaubt sind.
In DotNetKlassen klassen kann man ein Dispose verschlampen. Nach dem Tod der Anwendung sorgt irgendwann der GC für das Überleben des DC. Bei direkten Aufruf von API - Funktionen(Com-Tauglich) hilft nur ein Reboot gegen Schlampereien.
Eine korrekte Anwendung bietet aber den ungestraften Zugriff auf alle grafischen Komponenten die einfach nur angezeigt werden/egal welche Anwendung. Vielleicht daher die Zurückhaltung seitens MS das so einfach allen zu erlauben, oder einfach vergessen.
Was die nicht COM-Taugliche GDI+API(ohne Flat) erlaubt, ist im übrigen noch mehr. RedEyeFilter und Blureffekte frei Haus...

I
1.739 Beiträge seit 2005
vor 17 Jahren

@Herbivore:
Na jedenfalls danke für die Blumen.

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren

Ich hab es jetzt schon ausprobiert... mir hat es in den Fingern gekribbelt. Es funktioniert! Danke!

@all: Ich hoffe ihr versteht was Ikaros meint... es hört ich nicht Gesund an. Frische Luft und mal Kiste ausschalten! 😉 ... ist nicht böse gemeint.

I
1.739 Beiträge seit 2005
vor 17 Jahren

Gesund oder nicht.
Meine Antwort bezog sich auf deine Eingangsfrage. Ich bin der Meinung es geht(Mit Dll-Import).

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 17 Jahren

Wie gesagt nicht böse gemeint. Ich kenne leider einige Leute, die zu selten das Tageslicht sehen und sich zu sehr abkapseln. Die reden auch so in kryptischen Sätzen... (sind aber hoch intelligent). Danke auch dir für deine Hilfe!

I
1.739 Beiträge seit 2005
vor 17 Jahren

Habs nicht als böse verstanden, brauchst also keine Angst zu haben( 😉 )