vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Re: Packed DIB auf devicecontext blitten 
Autor: TTSAddict
Datum: 13.08.05 07:57

Hallo. Die folgende Prozedur verwende ich nur zum Testen der Methode.
Es wird eine AVI Datei geöffnet, der erste Frame gelesen/entpackt und dann auf eine Form geblittet ( zumindest ist das so vorgesehen *g* ).

Option Explicit
 
Public Sub Blitfirstframe(ByVal AVIFile As String, ByRef Ziel As Form)
    Dim Ergebnis As Long                'Funktionsrückgaben
    Dim DateiZeiger As Long             'AVIFile Interface-Handle
    Dim StreamZeiger As Long            'AVIStream Interface-Handle
    Dim FrameCount As Long              'Gesamtmenge an Frames im Stream
    Dim ErsterFrame As Long             'Position des ersten Frames
    Dim DateiInfo As AVI_FILE_INFO      'Datei-Info-Struktur
    Dim StreamInfo As AVI_STREAM_INFO   'Stream-Info-Struktur
    Dim GFZeiger As Long                'GetFrame Interface-Handle
    Dim PDIBZeiger As Long              'Zeiger auf packed device independent 
    ' bitmap im Speicher
    Dim BIHeader As BitmapInfoHeader    'Infoheader benötigt für GetFrame
 
    'Dim i As Long
    Dim MEMhdc As Long                  'Speicher-Devicecontext
 
'----------------------------------------
'Avifile Library öffnen
    Call AVIFileInit
'File-Interface Zeiger holen
    Ergebnis = AVIFileOpen(DateiZeiger, AVIFile, OF_SHARE_DENY_WRITE, 0&)
    If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Den ersten verfügbaren Stream öffnen
    Ergebnis = AVIFileGetStream(DateiZeiger, StreamZeiger, streamtypeVIDEO, 0)
    If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Position des ersten Frames checken
    ErsterFrame = AVIStreamStart(StreamZeiger)
    If ErsterFrame = -1 Then GoTo Aufräumen
'Gesamtlänge des Streams auslesen(in Frames)
    FrameCount = AVIStreamLength(StreamZeiger)
    If FrameCount = -1 Then GoTo Aufräumen
'Dateiinfo Struktur lesen
    Ergebnis = AVIFileInfo(DateiZeiger, DateiInfo, Len(DateiInfo))
    If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Streaminfo Struktur lesen
    Ergebnis = AVIStreamInfo(StreamZeiger, StreamInfo, Len(StreamInfo))
    If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Bitmapinfoheader-Struktur vorbereiten (dieses Format soll die 
' GetFrame-Funktion liefern)
    With BIHeader
        .biBitCount = 24
        .biClrImportant = 0
        .biClrUsed = 0
        .biCompression = BI_RGB
        .biHeight = StreamInfo.rcFrame.bottom - StreamInfo.rcFrame.top
        .biPlanes = 1
        .biSize = 40
        .biWidth = StreamInfo.rcFrame.right - StreamInfo.rcFrame.left
        .biXPelsPerMeter = 0
        .biYPelsPerMeter = 0
        .biSizeImage = (((.biWidth * 3) + 3) And &HFFFC) * .biHeight
    End With
'GetFrame-Objekt erstellen
    GFZeiger = AVIStreamGetFrameOpen(StreamZeiger, BIHeader)
    If GFZeiger = 0 Then
        MsgBox "Es konnte kein geeigneter Codec zur Dekompression des" & _
          "Videostreams gefunden werden!", vbCritical, "Sowas aber auch"
        GoTo Aufräumen
    End If
 
 
    'For i = ErsterFrame To (FrameCount - 1) + ErsterFrame
    '    PDIBZeiger = AVIStreamGetFrame(GFZeiger, i)
    '
    'Next
 
 
'Ersten Frame entpacken
    PDIBZeiger = AVIStreamGetFrame(GFZeiger, ErsterFrame)
    'Bei jedem Aufruf von AVIStreamGetFrame wird das alte pDIB gelöscht
 
'SpeicherDC erstellen und DIB selektieren
    MEMhdc = CreateCompatibleDC(Ziel.hdc)
    If MEMhdc = 0 Then GoTo Aufräumen
 
    Ergebnis = SelectObject(MEMhdc, PDIBZeiger)
        'An dieser Stelle scheitert der gesamte Code - SelectObject liefert 
        ' NULL zurück
    If Ergebnis = 0 Then GoTo Aufräumen
 
'Von SpeicherDC auf Zielkontext blitten
    Ergebnis = BitBlt(Ziel.hdc, 0, 0, 320, 240, MEMhdc, 0, 0, vbSrcCopy)
    Debug.Print Ergebnis
 
    Ziel.Refresh
 
Aufräumen:
    If MEMhdc <> 0 Then DeleteDC MEMhdc
    'Released das Interface und löscht das verbliebene pDIB
    If GFZeiger <> 0 Then Call AVIStreamGetFrameClose(GFZeiger)
    If StreamZeiger <> 0 Then Call AVIStreamRelease(StreamZeiger)
    If DateiZeiger <> 0 Then Call AVIFileRelease(DateiZeiger)
    Call AVIFileExit
End Sub
An der Stelle wo das DIB in den Speicherdevicekontext selektiert werden soll, springt der Code 'Aufräumen' an, da die Funktion fehlschlägt.

Das Modul mit den Deklarationen poste ich extra - das Forum meckert sonst, die Nachricht wäre zu lang
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Packed DIB auf devicecontext blitten670TTSAddict12.08.05 02:01
Re: Packed DIB auf devicecontext blitten458Kenjiro13.08.05 06:17
Re: Packed DIB auf devicecontext blitten496TTSAddict13.08.05 07:57
Forts.: Deklarationen485TTSAddict13.08.05 07:59
Lösung gefunden619TTSAddict13.08.05 13:09

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel