Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Kamerafahrt über ein Bild realisieren (https://www.delphipraxis.net/183294-kamerafahrt-ueber-ein-bild-realisieren.html)

flipdascript 29. Dez 2014 13:34

Kamerafahrt über ein Bild realisieren
 
Hallo zusammen!

Ich weiß nicht ob ich den richtigen Titel gewählt habe.
Ich möchte ein Programm schreiben, das in einem Fenster Bilder anzeigt die viel größer als das Fenster selbst sind.
Das ganze soll animiert werden, so dass der tatsächlich angezeigte Bereich sich ändert, quasi als würde man durch eine Kamera auf das Bild schauen und die Kamera würde sich bewegen. Es sollte auch möglich sein, den aktuellen Zoom anzupassen, so dass ein größerer Bereich des Bildes im Fenster dargestellt wird.

Mein Problem ist nun, dass ich mich mit dem Thema Animationen quasi gar nicht auskenne. Ich habe sehr gute Kenntnisse von Delphi allgemein und kenne mich einigermassen mit GDI+ aus. Meine GDI+-Erfahrung beschränkt sich aber auf statische Bilder.
Ich habe es schon ganz billig mit Timer und selbstzeichnen auf ein Control ausprobiert, das ist aber leider zu langsam. Meine Frage ist nun ob mir jemand sagen kann wie ich das am Besten realisiere oder ob es alternative Suchbegriffe nach denen ich suchen könnte. Ich finde nämlich keine brauchbare Übersetzung von Kamerafahrt und bekomme Myriaden an Tutorials wie man eine Kamera im 3D-Raum bewegt.
Vermutlich ist das der Wink mit dem Zaun und ich komme an DirectX nicht vorbei?

Die Bilder können übrigens bis zu 70 MP groß sein...

Perlsau 29. Dez 2014 14:07

AW: Kamerafahrt über ein Bild realisieren
 
Was du realisieren möchtest, benötigt keine speziellen Animationskenntnisse, sondern eine Scrollbox, in die du dein TImage legst, selbiges auf AutoSize stellst, Left und Top des TImage auf 0 stellst und ein Bild hineinlädst. Durch das Property AusoSize paßt sich das TImage der Bildgröße automatisch an. Ist das TImage nun größer als der Clientbereich der Scrollbox, erscheinen in selbiger Scrollbalken, mit denen du Ausschnitte des Bildes anzeigen kannst – wie in jedem Mal- und Grafikprogramm üblich.

himitsu 29. Dez 2014 14:12

AW: Kamerafahrt über ein Bild realisieren
 
Zitat:

70 MP
Was du hier erstmal optimieren kannst, ist das Bild aufzuteilen ... dann sind keine Operationen auf "große Datenmengen" nötig und es kann schneller ablaufen.

Warum jedesmal all 70 MP verarbeiten, wenn man doch nur maximal 2 MP davon braucht? Je menr Daten man verarbeiten muß, um so langsamer wird es. :zwinker:
Auch hängt es von den Zoommechianissmen an, denn es gibt Langsamere und Schnellere, aber dank vorberechnerer Zwischenbilder kann man auch da schneller arbeiten.

Sieh dir mal Google-Maps und Dergleichen an.
Dort gibt es das Bild in kleineren Stücken und vorallem schon fertig in verschiedenen Größen/Zoomstufen.
So brauch man nicht mehr all zu stark zoomen, da man bei großen Zoomstufen bereits auf ein kleineres Bild zugreifen kann.
und man braucht auch nur die Bildausschnitte zu behandeln, welche überhaupt sichtbar sind.

Namenloser 29. Dez 2014 14:19

AW: Kamerafahrt über ein Bild realisieren
 
Zitat:

Zitat von flipdascript (Beitrag 1284914)
Die Bilder können übrigens bis zu 70 MP groß sein...

Das ist wohl der Knackpunkt. Vorschlag: Zerhacke das Bild in viele kleine Kacheln in einer handlicheren Größe wie 512×512 Pixel und zeichne nur die Kacheln, die gerade im sichtbaren Bereich liegen. Um unterschiedliche Zoomstufen zu unterstützen, halte Kacheln in verschiedenen Detailstufen vor (vgl. https://de.wikipedia.org/wiki/Mip_Mapping)

Die Technik kennst du von Google Maps.

Mavarik 29. Dez 2014 14:32

AW: Kamerafahrt über ein Bild realisieren
 
Die eigentliche Frage ist doch:

Woher kommen die Bewegungs- und Zoomdaten?
Willst Du das "OnTheFly" berechnen oder einen Film davon erzeugen?

Mavarik

Bjoerk 29. Dez 2014 15:20

AW: Kamerafahrt über ein Bild realisieren
 
Die 70 MP machen einen ja fertig? Wenn du nur Delphi Werkzeuge verwenden willst: z.B. das Bild in eine Metafile erträglicher Größe umwandeln und dann ganz klassisch zoomen. Scrollbox, Paintbox rein, Paintboxabmessungen aus dem Zoom setzen und ein Strechdraw der Metafile in Paintboxpaint. Die Scrollbox ggf. doublebuffered setzen. Um einen Punkt zommen ist etwas tricky, geht aber. Ich hab hier zum Teil DIN A0 Pläne (ca. 15 MP), da geht's so sehr gut.

flipdascript 30. Dez 2014 12:13

AW: Kamerafahrt über ein Bild realisieren
 
Zitat:

Zitat von Perlsau (Beitrag 1284916)
Was du realisieren möchtest, benötigt keine speziellen Animationskenntnisse, sondern eine Scrollbox, in die du dein TImage legst, selbiges auf AutoSize stellst, Left und Top des TImage auf 0 stellst und ein Bild hineinlädst. Durch das Property AusoSize paßt sich das TImage der Bildgröße automatisch an. Ist das TImage nun größer als der Clientbereich der Scrollbox, erscheinen in selbiger Scrollbalken, mit denen du Ausschnitte des Bildes anzeigen kannst – wie in jedem Mal- und Grafikprogramm üblich.

Das wäre natürlich eine Option. Ich befürchte nur, dass das noch langsamer wäre als das was ich bisher habe.

Zitat:

Zitat von himitsu (Beitrag 1284917)
Was du hier erstmal optimieren kannst, ist das Bild aufzuteilen ... dann sind keine Operationen auf "große Datenmengen" nötig und es kann schneller ablaufen.
Warum jedesmal all 70 MP verarbeiten, wenn man doch nur maximal 2 MP davon braucht? Je menr Daten man verarbeiten muß, um so langsamer wird es. :zwinker:

Das ist richtig. In meinen bisherigen Tests habe ich auch nur 6MP Bilder verwendet, und auch das ist alles andere als flüssig.

Zitat:

Zitat von himitsu (Beitrag 1284917)
Auch hängt es von den Zoommechianissmen an, denn es gibt Langsamere und Schnellere, aber dank vorberechnerer Zwischenbilder kann man auch da schneller arbeiten.
Sieh dir mal Google-Maps und Dergleichen an.
Dort gibt es das Bild in kleineren Stücken und vorallem schon fertig in verschiedenen Größen/Zoomstufen.
So brauch man nicht mehr all zu stark zoomen, da man bei großen Zoomstufen bereits auf ein kleineres Bild zugreifen kann.
und man braucht auch nur die Bildausschnitte zu behandeln, welche überhaupt sichtbar sind.

Die verschiedenen Interpolations-Modi kenne ich. Das mit dem Aufteilen in Kacheln ist eine gute Idee. Bevor ich mir darüber Gedanken machen kann, muß ich es aber erstmal halbwegs performant für kleinere Bilder hinbekommen.

Zitat:

Zitat von Namenloser (Beitrag 1284918)
Zitat:

Zitat von flipdascript (Beitrag 1284914)
Die Bilder können übrigens bis zu 70 MP groß sein...

Das ist wohl der Knackpunkt. Vorschlag: Zerhacke das Bild in viele kleine Kacheln in einer handlicheren Größe wie 512×512 Pixel und zeichne nur die Kacheln, die gerade im sichtbaren Bereich liegen. Um unterschiedliche Zoomstufen zu unterstützen, halte Kacheln in verschiedenen Detailstufen vor (vgl. https://de.wikipedia.org/wiki/Mip_Mapping)
Die Technik kennst du von Google Maps.

Jep. Werde ich, wenn ich die Performance für kleinere Bilder hinbekommen, mal ausprobieren.

Zitat:

Zitat von Mavarik (Beitrag 1284919)
Die eigentliche Frage ist doch:
Woher kommen die Bewegungs- und Zoomdaten?
Willst Du das "OnTheFly" berechnen oder einen Film davon erzeugen?
Mavarik

Das ist eigentlich weniger das Problem. Die Bewegungen sind relativ simpel und ich würde die on-the-fly berechnen.

Zitat:

Zitat von Bjoerk (Beitrag 1284925)
Die 70 MP machen einen ja fertig? Wenn du nur Delphi Werkzeuge verwenden willst: z.B. das Bild in eine Metafile erträglicher Größe umwandeln und dann ganz klassisch zoomen. Scrollbox, Paintbox rein, Paintboxabmessungen aus dem Zoom setzen und ein Strechdraw der Metafile in Paintboxpaint. Die Scrollbox ggf. doublebuffered setzen. Um einen Punkt zommen ist etwas tricky, geht aber. Ich hab hier zum Teil DIN A0 Pläne (ca. 15 MP), da geht's so sehr gut.

Das ist vermutlich nicht performant genug. Ich werds aber einfach mal ausprobieren.

Im Grunde soll das sowas ähnliches werden wie die Lockscreen-Slideshow von Windows 8, falls die jemand kennt.

Was ich bisher versucht habe:
- Timergesteuert auf die Zeichenfläche des Formulars zeichnen. Das flackert und ist träge.
- Zeichnen in OnPaint des Formulars und timergesteuert das Formular invalidieren. Das flackert nicht, ist aber sehr träge.
- Zeichnen in OnPaint des Formulars und in OnPaint das Formular invaldiieren. Das flackert nicht, ist aber sehr träge und ist vermutlich generell keine so gute Idee ;P

Mein eigentliches Problem ist also primär, dass ich nicht weiß wie ich es hinbekomme, ein Control so upzudaten, dass die "Animation" flüssig aussieht.

Jens01 30. Dez 2014 13:04

AW: Kamerafahrt über ein Bild realisieren
 
OpenGL

Namenloser 30. Dez 2014 13:52

AW: Kamerafahrt über ein Bild realisieren
 
Was auch noch zu berücksichtigen ist: TTimer hat keine besonders feine Auflösung. Je nach dem, was für dich flüssig bedeutet, kann auch das schon der Knackpunkt sein. 60 FPS und mehr sind mit TTimer eher problematisch. Google mal nach "Game Loop" für Alternativen.

Popov 31. Dez 2014 19:08

AW: Kamerafahrt über ein Bild realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
@flipdascript

Ich hab zwar nicht ganz verstanden was du brauchst, aber da ich in der letzten Zeit wenig geprogt habe und vor Ende des Jahren nochmal Delphi anwerfen wollte, habe ich etwas geschrieben. Vielleicht ist es das was du brauchst (vielleicht auch was anderes).

Das Programm ist selbsterklärend, zuerst aber ein Bild laden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz