DrawingBuffer() - oder wie komme ich an die Speicheradresse?

Anfängerfragen zum Programmieren mit PureBasic.
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

DrawingBuffer() - oder wie komme ich an die Speicheradresse?

Beitrag von fabulouspaul »

Hallo zusammen,

ich habe mal eine(vermutlich einfach zu beantwortende) Newbie-Frage:

für einige Image-Manipulationen müsste ich die Adresse des Speicherbereiches eines Images (also den Anfang des Speicherbereiches, an dem die Pixelinformationen stehen) herausfinden. Aus der Doku habe ich die Funktion DrawingBuffer() gefunden, die das leisten soll. Allerdings möchte ich die Manipulationen nicht im Videospeicher machen sondern wirklich nur im Speicherebereich des Bildes.

Dazu habe ich ungefähr folgende Zeilen gebastelt

Code: Alles auswählen

   original = CreateImage(#PB_Any, 800, 600, 8)
  ...
   org_output = ImageOutput(original)
   org_handle = StartDrawing(org_output)
   org_adr = DrawingBuffer()
  ...
allerdings liefert mir DrawingBuffer() immer nur 0 zurück?

Was mache ich da falsch?

Viele Grüße,
Paul
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Beitrag von gnasen »

leider ist es sehr schwer zu helfen, wenn du keinen lauffähigen Code postest. Aber meine erste Vermutung wäre, dass du

Code: Alles auswählen

StartDrawing(ScreenOutput())
vorher nicht aufgerufen hast.
pb 4.51
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Beitrag von fabulouspaul »

gnasen hat geschrieben:leider ist es sehr schwer zu helfen, wenn du keinen lauffähigen Code postest. Aber meine erste Vermutung wäre, dass du

Code: Alles auswählen

StartDrawing(ScreenOutput())
vorher nicht aufgerufen hast.
Vielleicht habe ich auch nur ein Verständnis-Problem.
StartDrawing wird zur Initialisierung von 2D-Grafik-Aktionen benötigt.
Ich möchte jedoch nicht direkt auf den Bildschirm zeichnen (bzw. Bit-Manipulationen durchführen), sondern in einem im Speicher befindlichen Image. Daher bin ich davon ausgegangen, daß ich nicht ScreenOutput(), sondern ImageOutput() verwenden muß.

Mache ich da einen Denkfehler?
Ich habe mal einen Bastelcode zusammengeschrieben, der aber nicht funktioniert, weil ich von DrawingBuffer() nur eine 0 zurück erhalte:

Code: Alles auswählen

Procedure fill2(Number, color)
  Structure Pixel_byte
    pixel.c
  EndStructure
  
  org_output = ImageOutput(Number)
  org_handle = StartDrawing(org_output)
  *org_adr.Pixel_byte = DrawingBuffer() 
  For i = 0 To ImageWidth(Number) * ImageHeight(Number) -1
    *org_adr\pixel = color
    *org_adr + 1
  Next i
  StopDrawing()
EndProcedure
  

If OpenWindow(0, 216, 0, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
  If CreateGadgetList(WindowID(0))

    original = CreateImage(#PB_Any, 800, 600, 8)
    org_id = ImageID(original)
    
    ImageGadget(1, 0, 0, 800, 600, org_id) 
    
    fill2(original, 189)
    SetGadgetState(1, org_id) 
    
  EndIf
EndIf

MessageRequester("Ende", "Programm-Ende")

End
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Beitrag von gnasen »

Ja, du hast natürlich recht, der ScreenOutput() war nur als Beispiel. Dein Code funktioniert bei mir übrigens einwandfrei, wenn du die 8bit Farbtiefe durch 32bit ersetzt. Zumindest in PB4.51 (bei mir) ist 8bit glaube ich nicht unterstützt.

In deinem Beispiel hast du natürlich nie die Chance, das Ergebnis zu sehen. Während einer Messagebox wird das Fenster nicht neu gezeichnet! Also erstmal eine Eventschleife bauen. Zudem muss evtl das Gadget refreshed werden. Ich würde dir gerne ein Beispiel fertig machen, aber ich muss leider weg, die Arbeit ruft, sry :wink:
pb 4.51
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Beitrag von fabulouspaul »

gnasen hat geschrieben:Ja, du hast natürlich recht, der ScreenOutput() war nur als Beispiel. Dein Code funktioniert bei mir übrigens einwandfrei, wenn du die 8bit Farbtiefe durch 32bit ersetzt. Zumindest in PB4.51 (bei mir) ist 8bit glaube ich nicht unterstützt.

In deinem Beispiel hast du natürlich nie die Chance, das Ergebnis zu sehen. Während einer Messagebox wird das Fenster nicht neu gezeichnet! Also erstmal eine Eventschleife bauen. Zudem muss evtl das Gadget refreshed werden. Ich würde dir gerne ein Beispiel fertig machen, aber ich muss leider weg, die Arbeit ruft, sry :wink:
OK, ich hatte mir mal irgendwann die Demo von PB 4.2 runtergeladen, mit der ich hin und wieder mal was ausprobiere. Kann sein, daß es deshalb bei mir nicht funzt. ...da muss ich wohl mal aktualisieren. ;-)

Übrigens sehe ich das Ergebnis schon (habe mal eine Schleife mit herkömmlichen Zeichenfunktionen statt der Speichermanipulation gebastelt). Durch das SetGadgetState vor dem Messagerequester wird ja das Image aktualisiert.
Antworten