Seite 1 von 1

Bilder aus Speicheradresse anzeigen

Verfasst: 21.03.2007 21:41
von PBuser
Hallo

Ich bekommen aus eine DLL (CallBack-Funktion) eine Speicheradresse in der ein LiveBild einer Digitalen Camera liegt. Ebenso wird die Größe des Buffers mitgegeben.


Ich habe mir den Stream mal angeschaut und in den ersten 50 Byte taucht das Wort AVI auf.

Ich möchte diesen Stream in ein Image-Gadget laden.


Geht das überhaupt?

Wenn nicht, welches Gadget soll ich nehmen?

Danke.

Verfasst: 22.03.2007 16:46
von Ja!
Hi,

ich weiß zwar nicht wie der Stream aufgebaut ist, aber falls
Du Speicheradressen von Einzelbildern bekommst, dann
kannst Du die CatchImage bzw. CatchSprite-Befehle nehmen.

Ohne das Wissen über den genauen Aufbau eines Streams
ist es (m.W.n) nicht möglich die Einzelbilder direkt daraus zu lesen.

Gruß
Udo

Verfasst: 27.03.2007 15:20
von PBuser
Hi
Mit CatchImage wird nichts angezeigt.
Vielleicht übersehe ich was?
Hier mein kleines Programm:

Code: Alles auswählen

EnableExplicit

Global *MemoryID.l

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Anzeigen
  #Ende
  #Image_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 267, 114, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Anzeigen, 490, 100, 110, 40, "Anzeigen")    
      ButtonGadget(#Ende,    490, 60,  110, 40, "Ende")
      ImageGadget(#Image_0, 0, 10, 320, 240, #Image_0)
    EndIf
  EndIf
EndProcedure

Procedure MyAnzeigen()
 Define.l id
   
   id = CatchImage(#image_0,*memoryid)
  
EndProcedure



; Fürs testen wird ein Bild in den Speicher geladen
Define.l  Ergebnis, length, bytes, event
;  Bild in Speicher lesen
Ergebnis = ReadFile(0, "c:\tmp\Datei.bmp") 
length = Lof(0)                            ; Länge der geöffneten Datei ermitteln
*MemoryID = AllocateMemory(length)         ; Reservieren des benötigten Speichers
If *MemoryID
  bytes = ReadData(0, *MemoryID, length)   ; Einlesen aller Daten in den Speicherblock
EndIf
CloseFile(0)



open_window_0()     ; Maske anzeigen
Repeat 
    Event = WindowEvent() 

    Select Event    ; ein Ereignis befindet sich in der "Queue" (Warteschlange), also arbeiten wir es ab
    Case #PB_Event_Gadget
      Select EventGadget()
           Case #ende : 
              Event = #PB_Event_CloseWindow
           Case #Anzeigen
              ; Hier soll das Bild in der Maske angezeigt werden
              MyAnzeigen()
         EndSelect

    Default  
      Delay(1)  ; kein Ereignis aufgetreten, lassen wir also anderen Programmen auch etwas CPU-Zeit zukommen! 
    EndSelect
  Until Event = #PB_Event_CloseWindow


Ich lese ein Bitmap in eine Speicheradresse. (Ich möchte nicht mit LoadImage arbeiten, da ich meine Bilddaten aus einem Speicherbereich bekomme)

Mit Catchimage möchte ich diese Speicheradresse in das ImageGadget meiner Maske laden.

Es wird aber nie was angezeigt.

Hat jemand eine Idee?

Danke

Verfasst: 27.03.2007 16:00
von Thalius
Probier mal das ... :

Code: Alles auswählen

EnableExplicit

Global *MemoryID.l

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Image
  #Anzeigen
  #Ende
  #Imagegad
EndEnumeration

  

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 267, 114, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Anzeigen, 490, 100, 110, 40, "Anzeigen")   
      ButtonGadget(#Ende,    490, 60,  110, 40, "Ende")
      ImageGadget(#Imagegad, 0, 10, 320, 240, #Image)
    EndIf
  EndIf
EndProcedure

Procedure MyAnzeigen()
  Define.l id
  
  id = CatchImage(#Image,*MemoryID)
  
  If IsImage(#Image)
    SetGadgetState(#Imagegad,id) ; <-----
  EndIf
  
EndProcedure



; Fürs testen wird ein Bild in den Speicher geladen
Define.l  Ergebnis, length, Bytes, event
;  Bild in Speicher lesen
If ReadFile(0, "d:\mypic.bmp")
  length = Lof(0)
  *MemoryID = AllocateMemory(length)         ; Reservieren des benötigten Speichers
  If *MemoryID
    Bytes = ReadData(0, *MemoryID, length)   ; Einlesen aller Daten in den Speicherblock
  EndIf
CloseFile(0)
EndIf


...
Thalius

Verfasst: 27.03.2007 19:38
von PBuser
Vielen Dank.

Jetzt wird das Bild angezeigt.
(Ich musste noch ein CreateImage(0,320,240) zusätzlich mit rein machen.)