Drawingarea abspeichern

Spezielle Fragen zu 2D- und 3D-Grafik, Sound und Video
Antworten
Praktikant
Foriker
Beiträge: 11
Registriert: Mo 17. Jun 2013, 09:53
Kontaktdaten:

Drawingarea abspeichern

Beitrag von Praktikant » Mo 26. Aug 2013, 10:28

Hallo Forum,

versuche gerade den Innhalt einer "drawingarea" als Datei abzuspeichern. Ich habe folgendes versucht:

Code: Alles auswählen

Public Sub Form_Open()

   Draw.Begin(DrawingArea1)
   Draw.Line(10, 10, 100, 100)
   Draw.End

End

Public Sub Button1_Click()
   Dim img As Image

   img = DrawingArea1.Grab().Image   ' hier bleibt das Programm hängen  :( 
   img.Save(Dialog.Path)

End
... das Ding geht aber nicht und meldet sich mit "Kein Objekt in FMain 15".

Kann mir jemand weiterhelfen?

Schon mal Danke und Gruss
Praktikant :)

Honsek
Foriker
Beiträge: 387
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: Drawingarea abspeichern

Beitrag von Honsek » Mo 26. Aug 2013, 10:57

Hallo Praktikant,

ja, die Fehlermeldung ist korrekt. Grab hat in GB3 eine völlig neue Bedeutung. Der folgende Quelltext hilft garantiert weiter:

Code: Alles auswählen

FMain.Hide
    Wait 0.05
    hImg = Desktop.Screenshot().Image
  FMain.Show
Im Anhang ein Projekt, das den o.a. Quelltext-Schnipsel praktisch umsetzt.

Auf einen Kommentar zum Projekt freut sich

Honsek
Dateianhänge
s2p.tar.gz
Projekt: ScreenShot2Printer
(10.88 KiB) 201-mal heruntergeladen
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

tux_
Moderator
Beiträge: 950
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Drawingarea abspeichern

Beitrag von tux_ » Mo 26. Aug 2013, 12:01

An den Inhalt einer DrawingArea kommt man nicht heran. Der Trick ist, eine Routine zu schreiben, die das zeichnet, was gezeichent werden soll. Diese Routine setzt allerdings nicht das Drawing-Device ueber Draw.Begin() und beendet das Zeichnen nicht ueber Draw.End(). Dafuer soll die aufrufende Funktion zustaendig sein. Dann kann man mit dieser Routine in die DrawingArea zeichnen und man kann sie benutzen, um auf ein Picture-Objekt zu zeichnen, welches man als Datei speichern kann.

Als Beispiel:

Code: Alles auswählen

Public Sub Form_Open()
  Draw.Begin(DrawingArea1)
  DrawIt()
  Draw.End()
End

Public Sub Button1_Click()
  Dim hPicture As New Picture(DrawingArea1.Width, DrawingArea1.Height)

  Draw.Begin(hPicture)
  DrawIt()
  Draw.End()
  hPicture.Save(Dialog.Path)
End

Private Sub DrawIt()
  Draw.Line(10, 10, 100, 100)
End
* Der Quelltext wurde aus dem Kopf aufgeschrieben und nicht getestet.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Praktikant
Foriker
Beiträge: 11
Registriert: Mo 17. Jun 2013, 09:53
Kontaktdaten:

Re: Drawingarea abspeichern

Beitrag von Praktikant » Mo 26. Aug 2013, 13:07

Hallo Honsek,
hallo tux,

besten Dank für Eure prompten Antworten :D !

@Honsek:
Gefällt mir! Ich arbeite mit zwei Monitoren und der Screenshot schnappt sich gleich beide. Doch für mein Projekte will ich nur den Innhalt der Drawingarea, in die ich was gekrizelt habe. Das sind grafisch dargestellte Messdaten von meinem AD-Wandler. Aber Danke auf jeden Fall :D

@tux:
Danke für den Code. Ich glaube das Vorgehen verstanden zu haben. Du definierst eine Funktion DrawIt() und lässt diese einmal in die Drawingarea zeichnen und einmal in eine "Phantom"-Drawingarea namens hPicture. Das Phantom speicherst Du dann.
Leider meldet Gambas3: hPicture.Save(Dialog.Path) --> Fehler: Unbekanntes Format

Weisst Du weiter?

Grüsse Euch
Praktikant

tux_
Moderator
Beiträge: 950
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Drawingarea abspeichern

Beitrag von tux_ » Mo 26. Aug 2013, 15:23

Ich nehme an, dass der Pfad, der in Dialog.Path steckt keine Dateiendung hat (oder eine, die Gambas nicht versteht). Daher weisz die Save()-Methode nicht, in welches Format sie das Bild exportieren soll. Mit PNG solltest du keine Probleme haben.

Ich hoffe, du hast vorher Dialog.SaveFile() aufgerufen? Damit bekommt der Benutzer einen Dialog zum Datei speichern, welcher die Eigenschaft Dialog.Path erst auf einen sinnvollen Wert setzt. Wenn du das versaeumt hast, ist das Problem klar.

PS: Die Klasse Draw ist seit Gambas 3.4 veraltet. Man sollte immer zu Paint (einer Obermenge von Draw) greifen.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast