Programmatisch erzeugte Grafik kopieren/speichern

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    @VaporiZed
    OK, deinen Vorschlag konnte ich umsetzen, wobei es kein Problem war, "Using" über die gesamten Zwischenschritte drüber zu "stülpen". Werde mich mit Using mal auseinandersetzen, hatte ich noch nie eingesetzt. Finde ich sehr interessant. Wieder mal was gelernt (Halbwissen/Inselwissen zumindest :D )
    Was mir aber an dem Weg nicht so gut gefällt ist, dass die Schleife über die gesamte Dauer mitgeschleppt wird. Ich zeichne nun mal viel in die Picturebox und manipuliere vieles. Da ist das mit dem direkten Einschließen der Zeichnenaufrufe nur begrenzt möglich. Ich werde das in meinem Fall immer über etliche Subs verteilen müssen. Frequenzberechnungen, Steigungen berechnen und das Signal ausführlich beschriften usw kommt noch dazu, das kann ich nicht einfach weglassen. In dem Beispiel ging es ja nur um ein paar Linien, die gezeichnet werden mussten, da ist das ja noch übersichtlich.
    Ein anderer Punkt ist, dass beispielsweise der Hintergrund des Ursprungsimage nicht übernommen wird. Auch die Schriften erscheinen irgendwie anders als in der Vorlage, da muss dann wohl noch etwas zusätzlich definiert werden.
    Was ich aber suchte, war ein Weg um am Ende einer Messung den letzten sichtbaren Bildschirminhalt zu "retten" um ihn dann später weiterzuverarbeiten. Dabei bin ich im Netz auf folgenden Weg gestoßen:

    Quellcode

    1. Dim img = New Bitmap(PictureBox1.Width, PictureBox1.Height)
    2. Dim g = Graphics.FromImage(img)
    3. g.CopyFromScreen(Picturebox1.Location, New Point(0, 0), New Size(PictureBox1.Width, PictureBox1.Height))
    4. Clipboard.SetImage(img) ' Abbild ins Clipboard oder wie eine Zeile drunter, Image direkt in ein neues Picturebox kopieren, oder beides
    5. PictureBox2.Image = img ' Die Picturebox mit der "Kopie" der ersten
    6. g.Dispose()


    Hinweis: Wenn die Größen der Pictureboxen1 und 2 voneinander abweichen, Sizemode auf "Zoom" setzen.

    Hier wird ein (von den Abmessungen her festgelegter Ausschnitt) des Screenshot eines Bildschirmausschnitts erstellt und dieser in eine neue Picturebox kopiert. Mit dem Image dieser Picturebox kann kam dann alles anstellen (speichern,drucken usw) was man mit jedem anderen Image auch tun könnte.

    Das erscheint mit kurz und knackig ( oder "Quick and Dirty", wie der Franzose zu sagen pflegt), aber es geht und belastet nicht die Resourcen während der Signalverabeitung. Ich muss auch keine Rücksicht auf andere Schleifen, wann wo was deklariert wurde etc. nehmen. Es ist vollständig gekapselt und geht immer. Da das Programm im Entstehen ist und ich noch nicht absehen kann wie oft von wo nach wo gesprungen werden muss usw. finde ich das praktikabler. Ich mache das dann einfach am Ende der Messung. Oder spricht was dagegen?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „MarcelBB“ ()

    @MarcelBB Dein Code von Post #19 ist ein bisschen wenig, er ist nicht lauffähig.
    Dein Graphics-Objekt benutzt Du nicht, um zusätzliche Sachen da rein zu malen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es spricht dagegen, dass Dein Programm dann durch absolut nix verdeckt werden darf. Aufploppender Hinweis? Wird Teil des Screenshots. Firefox läuft? Wird Teil des Screenshots. Akkustand beim Notebook niedrig? Wird Teil des Screenshots. Usw.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.