CamGadget - Module (windows only)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CamGadget - Module (windows only)

Beitrag von ts-soft »

Ist natürlich ärgerlich, wenn das ganze nicht so zuverlässig funktioniert. Aber über ähnliche Problem wurde ja auch im engl.
Forum geschrieben.

Hier mal ein Screenshot, wie es aussehen könnte:
Bild
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: CamGadget - Module (windows only)

Beitrag von sharkpeter »

Hallo Thomas, hallo zusammen
nach langer Zeit hole ich den hier mal wieder aus der Versenkung. Vielleicht kannst du mir weiterhelfen.

Und zwar die erste Frage: gibt es eine Möglichkeit, den Requester für die Kameraauswahl zu überspringen
und eine Kamera direkt zuzuweisen? Wäre toll wenn du da eine Idee hättest.

Die zweite Frage, gibt es eine dll, mit der man W(Lan) Kameras auslesen/streamen kann.
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: CamGadget - Module (windows only)

Beitrag von PureLust »

sharkpeter hat geschrieben:Die zweite Frage, gibt es eine dll, mit der man W(Lan) Kameras auslesen/streamen kann.
Ich hatte mal so etwas in der Art für eine Applikation benötigt, in der bei den Usern ein kleines Window mit dem Kamerabild der Türkamera aufpoppen sollte, sobald jemand an der Türe geklingelt hat.

Die meisten WebCam bieten eine Webseite mit dem LiveStream an, so auch die von uns eingesetzte.
Diesen LiveStream hab ich dann über ein gecliptes Webgadget in dem PopUp-Window ausgegeben.

Einige WebCams bieten auch direkt Links zu Live-Einzelbildern an - kommt aber ein bisserl auf das Model an.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: CamGadget - Module (windows only)

Beitrag von Falko »

Code: Alles auswählen

DeclareModule CamGadget
  Interface ICamGadget
    Free()
    Resize(x, y, width, height)
    GetcaphWnd()
    DlgSettings()
    SnapImage()
    DriverConnect(DriveIndex)
  EndInterface
 
  Declare New(x, y, width, height, rate.l = 30, Text.s = "My Capture Window")
EndDeclareModule

Module CamGadget
  EnableExplicit
 
  Structure Class
    *vTable
    ID.i
    hWndC.i
  EndStructure
   
  Define DLL

  Prototype capCreateCaptureWindow(lpszWindowName.p-Unicode, dwStyle.l, x.l, y.l, nWith.l, nHeigth.l, hWnd.i, nID.l)
 
  Global capCreateCaptureWindow.capCreateCaptureWindow
 
  DLL = OpenLibrary(#PB_Any, "avicap32.dll")
 
  If DLL
    capCreateCaptureWindow =  GetFunction(DLL, "capCreateCaptureWindowW")
  EndIf
 
  Procedure New(x, y, width, height, rate.l = 30, Text.s = "My Capture Window")
    Protected *obj.Class
   
    *obj = AllocateMemory(SizeOf(Class))
    If *obj
      With *obj
        \vTable = ?vTable
        \ID = ContainerGadget(#PB_Any, x, y, width, height)
        CloseGadgetList()
        HideGadget(\ID, #True)
        \hWndC = capCreateCaptureWindow(Text,  #WS_CHILD | #WS_VISIBLE, 0, 0, width, height, GadgetID(\ID), \ID)
        If \hWndC
          SendMessage_(\hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_PREVIEWRATE, rate, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_PREVIEW, #True, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_SCALE, #True, 0)
          HideGadget(\ID, #False)
         
          ProcedureReturn *obj
        Else
          FreeGadget(\ID)
          FreeMemory(*obj)
         
          ProcedureReturn #False
        EndIf
      EndWith
    EndIf
  EndProcedure
   
  Procedure Free(*obj.Class)
      If *obj
        With *obj
          SendMessage_(\hWndC, #WM_CAP_STOP, 0, 0)
          SendMessage_(\hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
          DestroyWindow_(\hWndC)
          FreeGadget(\ID)
        EndWith
        FreeMemory(*obj)
      EndIf
  EndProcedure

  Procedure Resize(*obj.Class, x, y, width, height)
    If *obj
      With *obj
        ResizeGadget(\ID, x, y, width, height)
        MoveWindow_(\hWndC, 0, 0, width, height, #True)
      EndWith
    EndIf
  EndProcedure
   Procedure GetcaphWnd(*obj.Class)
    If *obj
      ProcedureReturn *obj\hWndC
    EndIf
  EndProcedure
  
  Procedure DriverConnect(*obj.Class, hWndC, DriveIndex.l);(Geräteindex 0-9)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_DRIVER_CONNECT, hWndC, DriveIndex) 
    EndIf
  EndProcedure
 
  Procedure DlgSettings(*obj.Class)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_DLG_VIDEOSOURCE, 0, 0)
    EndIf
  EndProcedure
 
  Procedure SnapImage(*obj.Class)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_EDIT_COPY, 0, 0)
      ProcedureReturn GetClipboardImage(#PB_Any, 32)
    EndIf
  EndProcedure
 
  DataSection
    vTable:
    Data.i @Free()
    Data.i @Resize()
    Data.i @GetcaphWnd()
    Data.i @DlgSettings()
    Data.i @SnapImage()
    Data.i @DriverConnect()
  EndDataSection
EndModule

CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
 
  Enumeration
    #btnSettings
    #btnSnap
    #imgSnap
  EndEnumeration
 
  Define myCam.CamGadget::ICamGadget
  Define img
   
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 410, "Webcam Example", #PB_Window_SizeGadget | #PB_Window_SystemMenu)
  myCam = CamGadget::New(10, 10, 640, 360)
 
  ButtonGadget(#btnSettings, 10, 380, 80, 20, "Settings")
  ButtonGadget(#btnSnap, 100, 380, 80, 20, "Snapshot")
  ImageGadget(#imgSnap, WindowWidth(0) - 105, 10, 100, 100, 0, #PB_Image_Border)
  myCam\DriverConnect(0);https://docs.microsoft.com/en-us/windows/win32/api/vfw/nf-vfw-capdriverconnect
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        myCam\Free()
        Break
     
      Case #PB_Event_SizeWindow
        myCam\Resize(#PB_Ignore, #PB_Ignore, WindowWidth(0) - 120, WindowHeight(0) - 50)
        ResizeGadget(#btnSettings, #PB_Ignore, WindowHeight(0) - 30, #PB_Ignore, #PB_Ignore)
        ResizeGadget(#btnSnap, #PB_Ignore, WindowHeight(0) - 30, #PB_Ignore, #PB_Ignore)
        ResizeGadget(#imgSnap, WindowWidth(0) - 105, #PB_Ignore, #PB_Ignore, #PB_Ignore)
       
      Case #PB_Event_Gadget
       
        Select EventGadget()
          Case #btnSettings
           myCam\DlgSettings()
           
          Case #btnSnap
            img = myCam\SnapImage()
            ResizeImage(img, 100, 100)
            SetGadgetState(#imgSnap, ImageID(img))
           
        EndSelect
    EndSelect
  ForEver
CompilerEndIf
Hallo Jens,
ungefähr so müsste es gehen. Ich habe vor der Repeatschleife das Gerät bei mir auf Index 0 voreingestellt (myCam\DriverConnect(0) ).
Du könntest weiter in der Repeatschleife eine Abfrage auf das Dir bekannte Gerät umstellen.
leider kann ich das selbst nicht testen, a ich das nur mit meiner Kamera am Laptop getestet habe.
Der Geräteindex kann also nur von 0 bis 9 eingestellt werden.

LG, Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: CamGadget - Module (windows only)

Beitrag von sharkpeter »

Hallo PureLust,
der Gedanke daran ist, alle Kamera-Screens in einem Programmfenster zu haben. Die Sache mit den Einzelbildern wäre dabei ausreichend,
sprich ich brauche keinen Live-Stream, sondern nur "getaktet" immer wieder ein Bild. Wenn man bei den zur Kamera angebotenen App´s
ohne Ansehen "jede" Kamera ansprechen könnte, wäre das auch praktikabel. Nur leider geht immer nur "die eigene" ...

Moin Falko,
das teste ich mal durch, danke einstweilen. Der Rest steht in der PN von eben :)
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: CamGadget - Module (windows only)

Beitrag von sharkpeter »

Hallo Falko,
das habe ich schon in der Procedure "NEW" probiert, ohne Erfolg. Der Requester wird zwar mit einer ID verlassen, aber der
Inhalt ist leer (schwarz). Übrigens ist ein Tippfehler drin: EndSelectä vierte Zeile von unten :)

Vielleicht ist ja auch eine andere dll erforderlich. Programme die das können gibt es freilich, aber ab mehr als zwei Kameras
wollen die echt Kohle dafür haben und das sehe ich nicht ein :)
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Antworten