Verständnisfrage zum Zeichnen mit GDI+



  • Hallo zusammen,

    ich fange gerade erst mit GDI+ an, und wollte, bevor ich noch in die falsche Richtung laufe, mal etwas zum Verständnis klären.

    Ich habe eine Anwendung, in der Bilder als Dateien auf Festplatte liegen - diese sollen später ein Video ergeben.
    Ich will in meinem Video Texteinblendungen (schön mit Rahmen etc) haben, dazu erstelle ich gerade eine Oberfläche. Die Einblendungen sollen zur Laufzeit des Programms erstellt werden können, und dann auf die vorhandenen Bilder raufgerechnet werden (nur im Speicher, auf der Platte bleiben die Rohbilder unverändert).

    Das kann ich ja mit GDI+ realisieren, und in meine vorhandene PictureBox, in der das Bild angezeigt wird, zeichnen.
    Aber damit habe ich das Bild ja nur auf dem Schirm gezeichnet.
    Wenn ich später das Video erstelle, soll es so laufen:

    - das jeweilige aktuelle Bild wird Frame für Frame von Platte in den Speicher geladen
    - in einer Klasse z.B. CEffects ist gespeichert, ob in das Bild vor der Weitergabe an den Video-Encoder noch Zeichnungen erhalten soll, und wenn ja, werden diese gezeichnet. Das soll auch funktionieren, ohne dass das Bild auf dem Schirm angezeigt werden muss.

    Die Bilder habe ich bis jetzt als GDI+ Image-Objekt vorliegen.

    um letzteren Punkt dreht sich meine Frage. Mit GDI+ wird in meinem Verständnis immer nur auf den Bildschirm gezeichnet, oder? Das hiesse, ich müsste auf den Schirm zeichnen, und das Bild dann wiederum erneut rauslesen, oder?

    Zu meinem Problem:
    Wie mache ich das, dass ich mit GDI+ das Image-Objekt an sich verändere, ohne dass es mit dem DC meiner Form verbunden sein muss? So wie ich das verstanden habe, zeichne ich ja im DC und nicht in dem Image.
    Das Image in einer PictureBox anzuzeigen ist meinem verständnis nach auch nur eine Methode, die die Bilddaten in den DC der PictureBox eben zeichnet, oder?



  • Nein, du mußt nicht immer auf den Screen zeichnen. Der GDI+ ist es "latte" wo das ganze landet, ob Drucker, Fenster oder einem Backbuffer. Dazu mußt du entsprechend den Graphics-Kontext erstellen, der ja mehrere Konstruktoren hat.

    Ich sollte wohl doch noch mal mein GDI+ Tutorial weiter schreiben, scheint ja doch immer wieder Bedarf da zu sein. Auch wenn ich der Meinung bin, das die GDI+ Doku super erklärend ist.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-128603.html



  • super, danke!! hat hingehauen.

    Hast Du zufällig, da Du Dich ja mit GDI+ beschäftigst, auch was zum Zeichnen von halbtransparenten Elementen (Aplhablending)?

    edit: ok, ok das war ja einfach mit dem alphablending... 😉



  • Neue Frage:

    wie kann ich in einem Pfad eine Kurve zeichnen? Ich will ein Rechteck mit abgerundeten Ecken haben.

    Graphics graphics(m_pImage);
    	graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    	SolidBrush brush(Color(210,255,255,255));
    
    	Point points[] = {Point(40,50), Point(60, 30), Point(400, 30), Point(400, 300),
    		Point(40, 300), Point(40,50)};
    
    	byte types[] = {PathPointTypeStart, PathPointTypeLine, PathPointTypeLine, PathPointTypeLine,
    		PathPointTypeLine, PathPointTypeLine};
    
    	GraphicsPath* path = new GraphicsPath(points, types, 6, FillModeAlternate);
    
    	graphics.FillPath(&brush, path);
    

    wenn ich statt PathPointTypeLine PathPointTypeBezier verwende, wird der Pfad gar nicht gezeichnet bzw. gefüllt 😞


Anmelden zum Antworten