Entwickler-Ecke

Multimedia / Grafik - Video Analyse - Seltsames Problem


Slush - Mi 22.06.11 16:01
Titel: Video Analyse - Seltsames Problem
Ich habe ein seltsames Problem:

Ich wollte die einzelnen Frames eines Videos als BitMap extrahieren und dann miteinander vergleichen (um eine Bewegunsanalyse durchzuführen, aber darum gehts jetzt erstmal nicht =D).

Um die Frames zu extrahieren hab ich diesen Ansatz hier genommen:
http://www.swissdelphicenter.ch/torry/showcode.php?id=1180

Darin wird eine temporäres TBitMap verwendet um den Frame zu speichern:

Delphi-Quelltext
1:
TmpBmp.SaveToFile(ToFileName);                    

ich wollte das eigendlich weiter verwenden, also hab ich die Funktion ein TBitMap zurückgeben lassen und eben mit

Delphi-Quelltext
1:
result:=TmpBmp                    

das BitMap zurückgeben lassen.

Jetzt kommt das komische:
Wenn ich in der Funktion selbst unter das result:= TmpBmp result in einem TImage malen lassen will, geht dass. Wenn ich jezt aber die einem TBitMap diese Funktion zuordne und das eben dieses TBitMap zeichnen lassen will geht das aus irgend einem Grund nicht.
Also:

Delphi-Quelltext
1:
2:
result:=TmpBmp;
Image1.canvas.draw(1,1,result);

geht, aber außerhalb der Funktion:

Delphi-Quelltext
1:
2:
f1:=GrabAviFrame(Quelle,Position);
Image1.canvas.draw(1,1,f1);

geht nicht!
Da steht dann "class EAccessViolation with message 'Access violation at address 0041D677 in module 'Project1.exe'. Read of address 0000001C'."

Hat jemand ne Idee?

Moderiert von user profile iconNarses: Highlight- durch Delphi-Tags ersetzt


Gausi - Mi 22.06.11 16:10

Halo und :welcome: in der Entwickler-Ecke,

in dem verlinkten Code wird das temporäre Bitmap wieder freigegeben, ich schätze mal, dass das daran liegt. Innerhalb der Funktion selbst könnte der Zugriff darauf dann noch klappen, aber eigentlich ist es auch da schon weg. ;-)


ALF - Mi 22.06.11 16:12

Ist f1 auch vom typ TmpBmp? und wo erstellst du es, damit Du die infos auch dort übergeben kannst.
Gruss Alf


Slush - Mi 22.06.11 16:16

Danke für die schnellen Antworten

@ALF: Ich glaube ich hab mich falsch ausgedrückt. Die Variable heißt TmpBmp, sie ist vom Typ TBitMap, wie f1 auch. f1 ist für die ganze Unit und wird im Form.create erstellt.

@Gausi: Ich werde mal versuchen eine "Zwischenvariable" zu benutzen, damit das Bitmap nicht zersört wird. Danke für den Tipp, da wäre ich nie drauf gekommen!
[Edit: Ich habs probiert, es funktioniert noch immer nicht. (Ich hab erst TmpBmp in einer globalen Variablen gespeichert und die dann result zugewiesen)]
[Edit2: Jetzt hab ich die lokale Variable ganz durch eine globe ersetzt und siehe da, es funktioniert. Danke Gausi =D)]