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.)