Forum: PC-Programmierung bitmap = null Buffer gesucht


von David (Gast)


Lesenswert?

1
  private void TwoInOnePicture()
2
        {/*
3
            Bitmap bitmap = new Bitmap(image1.Width + image2.Width, Math.Max(image1.Height, image2.Height));
4
    using (Graphics g = Graphics.FromImage(bitmap))
5
    {
6
        g.DrawImage(image1, 0, 0);
7
        g.DrawImage(image2, image1.Width, 0);
8
            */
9
10
            Bitmap bitmap2_neu;
11
            Bitmap bitmap1_neu;
12
            bitmap1_neu = bitmap1;
13
            bitmap2_neu = bitmap2;
14
            if (bitmap1 != null || bitmap2 != null)
15
            {
16
                Int32 s32MemID1;
17
                Int32 s32MemID2;
18
                //System.Threading.Thread.Sleep(5000);
19
                Bitmap bitmap_gesamt = new Bitmap(bitmap1_neu.Width + bitmap2_neu.Width, bitmap1_neu.Height + bitmap2_neu.Height);
20
                Bitmap bitmap_gesamt_neu = bitmap_gesamt;
21
                Graphics g = Graphics.FromImage(bitmap_gesamt_neu);
22
                //System.Threading.Thread.Sleep(200);
23
                Camera1.Memory.GetActive(out s32MemID1);
24
                Camera2.Memory.GetActive(out s32MemID2);
25
                //DoDrawing(ref g, s32MemID);
26
                g.DrawImage(bitmap1_neu, new Rectangle(0, 0, bitmap1_neu.Width, bitmap1_neu.Height));
27
28
                g.DrawImage(bitmap2_neu, new Rectangle(bitmap1_neu.Width, 0, bitmap2_neu.Width, bitmap2_neu.Height));
29
                if (grafik == true)
30
                {
31
                    g.DrawEllipse(new Pen(System.Drawing.Color.Red, 5f), bitmap1_neu.Width + 3, 5, (bitmap2_neu.Width / 20), (bitmap2_neu.Height / 16));
32
                    g.DrawEllipse(new Pen(System.Drawing.Color.Red, 5f), 5, 5, (bitmap1_neu.Width / 20), (bitmap1_neu.Height / 16));
33
                }
34
                i++;
ich würde einen Buffer für Bitmaps benötigen, da ich manchmal ein NULL 
zurückbekomme als Bitmap1 oder Bitmap2

Danke Gruß

dave

von nicht"Gast" (Gast)


Lesenswert?

Hm, mach doch deine zuweisung nach der abfrage und nicht davor

von David (Gast)


Lesenswert?

Wie genau meinst du das?

von David (Gast)


Lesenswert?

Die if Abfrage danach!

von bluppdidupp (Gast)


Lesenswert?

Das || sollte doch bestimmt eher ein && sein?

Man sieht übrigens kein using() oder .Dispose() - Je nachdem wie oft 
deine TwoInOnePicture() aufgerufen wird könnte das problematisch 
werden...

von Manu (Gast)


Lesenswert?

Wie wende ich denn das Using() in der Funktion genau an?

von Karl H. (kbuchegg)


Lesenswert?

Ich versteh eigentlich die ganze Fragestellung nicht.

Was soll
> ich würde einen Buffer für Bitmaps benötigen, da ich manchmal
> ein NULL zurückbekomme als Bitmap1 oder Bitmap2
bedeuten.

bitmap1 bzw. bitmap2 sind doch offenbar irgendwelche globale Bitmaps, 
die zu einem kompletten Bild zusammengesetzt werden sollen. Zumindest 
versteh ich den Code beim schnellen Querlesen so.

Wenn also bitmap1 bzw. bitmap2 NULL sind, dann heißt das doch, das es 
genau diese Bitmaps eben nicht gibt. Wie soll man aber eine einzelne 
Bitmap mit einer anderen nicht existenten Bitmap zu einem 2-Bitmap Bild 
zusammensetzen? Das heißt für mich: was du brauchst ist nicht irgendein 
ominöser Buffer, sondern eine entsprechende Programmlogik, die mit 
diesem Fall klar kommt, das diese Funktion aufgerufen wird, obwohl es 
nur eine Ausgangsbitmap gibt.

von Karl H. (kbuchegg)


Lesenswert?

Manu schrieb:
> Wie wende ich denn das Using() in der Funktion genau an?

Wenn du schon kein C#-Buch hast, dann leg dir wenigstens in deinem 
Browser einen Bookmark auf Google. Dort gibst du ins Suchfeld "C# using" 
ein und hantelst dich durch.
Sorry wenn das jetzt unfreundlich klingt. Aber Informationen suchen und 
finden gehört zum Handwerkszeug eines Programmieres mit dazu, wie in 
Bayern ein Bier zu einer Brotzeit dazu gehört.
Ohne wird das nichts und am Besten ein ausführliches Tutorial 
durcharbeiten, da ich aber keines kenne, bleibt als optimale Alternative 
nur noch ein C#-Buch.
Dieses Buch hat nicht umsonst ein paar hundert Seiten. Die hat es 
sicherlich nicht, weil man C# nach der Methode "Try&Error" auf eigene 
Faust in ein paar Nachmittagen lernen kann.

http://msdn.microsoft.com/de-de/library/yh598w02(v=vs.80).aspx

Microsoft hat die komplette C# Doku online. Du musst sie nur lesen - was 
allerdings nur insofern weiter hilft, wenn du weißt, was du eigentlich 
brauchst. Womit dann wieder die Literatur ins Spiel kommt.

von max (Gast)


Lesenswert?

Mich würde auch mal interessieren, wo man hier using oder dispose 
benutzen sollte. Ich sehe da keine Notwendigkeit.

Gruß, Max

von Karl H. (kbuchegg)


Lesenswert?

Ich schon.

Hier
1
            Bitmap bitmap_gesamt = new Bitmap(bitmap1_  .....

wird eine neue Bitmap angelegt, die kurze Zeit später keiner mehr 
braucht. Also wozu soll das Objekt im Speicher rumlungern, bis es vom 
Garbage Collector entsorgt wird, wenn man selbst sehr genau weißt, dass 
diese Bitmap nach ein paar Schritten weiter im Programm nicht mehr 
benötigt wird?

von max (Gast)


Lesenswert?

Huch, ich hatte gedacht, dass die Objekte automatisch nach dem Ende der 
Funktion gelöscht werden. Wieder was gelernt...

von Karl H. (kbuchegg)


Lesenswert?

max schrieb:
> Huch, ich hatte gedacht, dass die Objekte automatisch nach dem Ende der
> Funktion gelöscht werden. Wieder was gelernt...

C++ schon.
C# nicht. Da räumt der Garbage Collector irgendwann auf. Wann genau, das 
steht in den Sternen. Wann gerade Zeit ist, oder wenn der Speicher zur 
Neige geht, oder wenn Windows fad ist oder ....

Selbiges ja auch hier
1
              g.DrawImage(bitmap1_neu, new Rectangle(0, 0, bitmap1_neu.Width, bitmap1_neu.Height));
2
3
                g.DrawImage(bitmap2_neu, new Rectangle(bitmap1_neu.Width, 0, bitmap2_neu.Width, bitmap2_neu.Height));
4
                if (grafik == true)
5
                {
6
                    g.DrawEllipse(new Pen(System.Drawing.Color.Red, 5f), bitmap1_neu.Width + 3, 5, (bitmap2_neu.Width / 20), (bitmap2_neu.Height / 16));
7
                    g.DrawEllipse(new Pen(System.Drawing.Color.Red, 5f), 5, 5, (bitmap1_neu.Width / 20), (bitmap1_neu.Height / 16));

die ganzen Rectangles und Pens lungern im Speicher rum, bis jemand 
aufräumt.
Gut, das ist jetzt nicht DER Speicherverbrauch, aber ... es läppert 
sich, wenn die Funktion nur oft genug aufgerufen wird.

von __tom (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Gut, das ist jetzt nicht DER Speicherverbrauch, aber

Der Speicherverbrauch ist auch nicht der Grund warum Bitmap (und auch 
Pen) IDisposable implementieren.

Es gibt im System noch mehr Resourcen die Endlich sind, z.B. GDI 
Handles. Der GC räumt nur auf wenn er der Meinung ist er müsste das tun. 
Zu der Überzeugung kann er kommen wenn der Arbeitsspeicher sich füllt, 
"unmanaged resources" wie die GDI Handles (oder auch File Handles) hat 
er dagegen nicht im Blick.

Es kann also passieren dass noch massig Ram frei ist, der GC damit nicht 
aktiv wird, aber trotzdem keine freien GDI Handles mehr da sind - weil 
die eben erst freigegeben werden wenn der GC ein Dispose() erzwingt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.