Seite 1 von 2
OpenWindow mit mit Grafik manipulieren , Byte reinschreiben
Verfasst: 08.05.2013 13:16
von funkheld
Hallo, guten Tag.
Wie breit und hoch ist bitte dieses Window : 0,0,512,512 ?
512 oder 513 Pixel ? Ich brauche eines welches 512 Pixel breit/hoch ist.
Ich möchte bitte Bytes reinschreiben in diesem Window.
Von oben links nach oben rechts und wieder eine Zeile tiefer usw.
Wie kann man die Anfangsadresse ermittel und dann reinschreiben ?
Die Pixel der Bytes sollen nur Schwarz/Weiss.
Dann möchte ich bitte ein Menü erstellen.
Zählt das Menü noch in den 512 Pixel rein ?
Wie funktioniert das ?
Code: Alles auswählen
Enumeration
#Window_0
EndEnumeration
InitSprite()
InitKeyboard()
OpenWindow(#Window_0,0,0,512,512,"test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window_0
CloseWindow(#Window_0)
Break
EndIf
EndSelect
ForEver
Danke.
Gruss
peter
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 14:14
von STARGÅTE
Du kannst die normalen Drawing-Befehle verwenden:
Code: Alles auswählen
Enumeration
#Window_0
EndEnumeration
InitSprite()
InitKeyboard()
OpenWindow(#Window_0,0,0,512,512,"Test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #PB_Event_Repaint
If StartDrawing(WindowOutput(#Window_0))
For N = 1 To 10000
Plot(Random(511), Random(511), Random(1)*$FFFFFF)
Next
StopDrawing()
EndIf
EndSelect
ForEver
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 14:19
von funkheld
Jup, danke.
Ich möchte direkt die Bytes reinschreiben an eine Adresse keine einzelnen Pixel. Es soll möglichs schnell sein, bzw das schnellste. Und nur schwarz/weiß.
Es kommt sonst nichts auf dem Window drauf.
Wie geht das ?
Danke.
Gruss
peter
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 14:25
von STARGÅTE
Die Outputadresse bekommst du mit DrawingBuffer().
Zusätzlich brauchst du DrawingBufferPitch() und DrawingBufferPixelFormat() um (weil du ja nicht ein einfachen Weg gehen willst) selbst ermitteln musst, wie viel Speicher eine Bildzeile einnimmt und in welchem Format die Bildpunkte gespeichert werden (3 oder 4 Byte pro Pixel, RGB oder BGR)
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 14:47
von funkheld
Zusätzlich brauchst du DrawingBufferPitch() und DrawingBufferPixelFormat() um (weil du ja nicht ein einfachen Weg gehen willst) selbst ermitteln musst, wie viel Speicher eine Bildzeile einnimmt und in welchem Format die Bildpunkte gespeichert werden (3 oder 4 Byte pro Pixel, RGB oder BGR)
Au backe, du zählst mir soviel auf.
Kannst du mir mal für ein kleines Muster erstellen.
Ich möchte es als RGB und eigentlich soll das Byte nur schwarz/weiß sein.
Wie zählt man denn eigentlich die 0-512 (512 Pixel) 0-511(512 Pixel) ?
Danke.
Gruss
peter
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 15:12
von STARGÅTE
funkheld hat geschrieben:Ich möchte es als RGB und eigentlich soll das Byte nur schwarz/weiß sein.
Um möchten gehts hier nicht. Du musst herausfinden, welches Format das Window haben will.
Nur dann kannst du entscheiden, welche Bytes gesetzt werden müssen, damit eine bestimmte Farbe (halt weiß/schwarz) rauskommt.
Im übrigen sehe ich gerade, dass die Befehle unter WindowOutput garnicht funktionieren.
Von daher rate ich dir die Drawing-Befehle zu verwenden, ohne Debugger sind die auch sehr schnell.
funkheld hat geschrieben:Wie zählt man denn eigentlich die 0-512 (512 Pixel) 0-511(512 Pixel) ?
512 Pixel gehen von 0 bis 511
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 15:37
von funkheld
Hmmm..., das ist nicht gut.
Geht das irgendwie mit Directx , in die Adresse von WindowOutputein Byte zu schreiben ?
Dank.
Gruss
peter
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 15:47
von funkheld
Hallo, in der For-Schleife geht das Startdrawing nicht, das Windowfenster friert ein.
Warum ?
Nur wenn die For-Schleife in der Startdrawing ist, aber dann sehe ich das Bild erst, wenn es fertig ist.
Das möchte ich nicht.
Danke.
Gruss
Code: Alles auswählen
Enumeration
#Window_0
EndEnumeration
InitSprite()
OpenWindow(#Window_0,0,0,600,600,"test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window_0), 10, 10, 512,512)
StartDrawing(ScreenOutput())
Buffer = DrawingBuffer()
;Pitch = DrawingBufferPitch()
;PixelFormat = DrawingBufferPixelFormat()
buffer1=buffer
StopDrawing()
Repeat
Event = WaitWindowEvent()
For y = 1 To 3
For x = 1 To 512
StartDrawing(ScreenOutput())
buffer=buffer+4
PokeL(buffer,$ff0000)
StopDrawing()
Delay(10)
Next
Next
buffer=buffer1
Select Event
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window_0
CloseWindow(#Window_0)
Break
EndIf
EndSelect
ForEver
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 16:34
von NicTheQuick
Entschuldige bitte, aber stellst du dich extra so dran?
Du siehst doch selbst, warum es so lange dauert. Die beiden verschachtelten For-Schleifen zusammen rufen den Start-/StopDrawing-Block 512 * 3 mal auf und machen genau so oft ein 'Delay(10)', d.h. das komplette Schleifenkonstrukt braucht schon mal mindestens über 15 Sekunden nur für das Delay und dann ist da noch die Sache mit dem StartDrawing, das viel zu oft aufgerufen wird. Normalerweise rufst du das einmalig vor der For-Schleife auf, dann malst du alle Pixel rein, die du sehen willst, und zwar OHNE ein Delay und nach der For-Schleife kommt dann das StopDrawing.
Und das Fenster friert eben genau wegen diesen 15 Sekunden oder mehr ein, weil dann keine Events mehr von 'WaitWindowEvent()' empfangen werden können.
Was ist eigentlich dein genaues Ziel? Woher hast du die Byte-Daten? Welche Werte haben diese Bytes? Sollen vielleicht sogar die einzelnen Bits dieser Bytes jeweils einen Pixel ausmachen?
Die effektivste Herangehensweise um hier eine Antwort zu bekommen, die dich zufrieden stellt, ist zunächst einmal die Voraussetzungen darzulegen und das Ziel, was dahinter steckt. Wahrscheinlich ist die Frage wie man am schnellsten Bytes irgendwie schwarz und weiß auf ein Fenster kriegt und das auch noch ganz schnell die falsche Frage.
Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei
Verfasst: 08.05.2013 16:39
von funkheld
Entschuldigung , das Delay muss raus, hatte es nur mal zu irgendeinen Test drin.
So friert das Windowprogramm ein:
Code: Alles auswählen
For y = 1 To 3
For x = 1 To 512
StartDrawing(ScreenOutput())
buffer=buffer+4
PokeL(buffer,$ff0000)
StopDrawing()
Next
Next
Ich möchte ein Buchstabe schreiben der je 8 Pixel breit ist und 8 Pixel hoch ist.
Das soll eine Art Z1013-Screen sein mit 256x256 Pixel bzw 32x32 Zeichen.
Ich möchte dann auch einen Pixel zeitlich Plotten, dabei muss aber jedesmal die Startdrawing verlassen werden. Irgendwie blockiert aber diese For-Schleife ?
Gruss
peter