[gelöst] Bereich mit Muster füllen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[gelöst] Bereich mit Muster füllen

Beitrag von scholly »

moin, moin...

Ich hab mal versucht, einen weißen Bereich in einem schwarzen Quadrat mit einem vorgegebenen Muster zu füllen.

Natürlich "zu Fuß" :lol: , da ich von GFX und 2D und so noch arg wenig, bzw keine Ahnung habe.

Code: Alles auswählen

; Bereich_mit_Muster_füllen_2.pb
; scholly

musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()

If LoadFont(1, "Arial", 64,#PB_Font_Bold) = 0
  Debug "font nich jefunden"
  End
EndIf

Procedure move_texture_to_box()
For line = 1 To 256
  For column = 1 To 256
    
    StartDrawing(ImageOutput(2))
      mask_color = Point(column,line)
    StopDrawing()
    
    If mask_color = #White ;nur dann brauchen wir das Muster
      StartDrawing(ImageOutput(1))
        thiscolor = Point(column,line)
      StopDrawing()
      
      StartDrawing(ImageOutput(3))
        Plot(column,line, thiscolor)
      StopDrawing()
    EndIf
          
  Next column
Next line 
    
EndProcedure
  
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  
  If LoadImage(1, musterfile.s)
    ImageGadget(1,  10, 10, 256, 256, ImageID(1))
  Else
    Debug "error: LoadImage(0, musterfile.s)"
  EndIf
 
  If CreateImage(2, 256, 256)
    StartDrawing(ImageOutput(2))
      DrawingFont(FontID(1))
      DrawText(20,64,"Hallo",#White,#Black)
    StopDrawing()
    ImageGadget(2,  286, 10, 256, 256, ImageID(2))  
  Else
    Debug "error: CreateImage(1, 256, 256)"
  EndIf
  
  If CreateImage(3, 256, 256)
  
    move_texture_to_box()    
    ImageGadget(3,  586, 10, 256, 256, ImageID(3)) 
  Else
    Debug "error: CreateImage(3, 256, 256)"
  EndIf
   
   
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Zum Üben war das ganz gut.
Ich bin mir aber sicher, es gibt eine einfachere und schneller Möglichkeit, als meine Procedure move_texture_to_box().

Mag (mir) jemand den effizienten Ersatz zeigen ?

mDv... scholly

[Edit 1:] Text statt Box zeichnen
Zuletzt geändert von scholly am 17.05.2008 15:38, insgesamt 2-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Coden kann ich dir momentan leider nichts.
Aber ich verweise auf die Befehle DrawingBuffer(), DrawingBufferPitch() und DrawingBufferLine().
Damit erhälst du direkten zugriff auf ein Bild und kannst es nach belieben manipulieren, (fast) genau so, als bearbeitest du Strings mit Pointer.
Diese Methode ist sehr, sehr schnell und viel besser als deine Point/Plot Methode.
Wie gesagt, momentan kann ich leider nur darauf verweisen, weil ich keine Zeit habe; wenn du aufgrund deines Anfängerstatus noch nichts mit den Befehlen anfangen kannst, warte, bis jemand was anderes postet.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Vielleicht hilft dir das weiter ! Auf White prüfe ich aber nicht, da ich den tieferen Sinn nicht verstehe.

Code: Alles auswählen

musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg" 
UseJPEGImageDecoder() 

Enumeration
#image1
#image2
#image3
#button1
#button2
#button3
EndEnumeration

Procedure move_texture_to_box(br,hh) 

ID = CopyImage_(ImageID(#image1), #IMAGE_BITMAP, br/4, hh/4, 0)
     brush = CreatePatternBrush_(ID)
     DeleteObject_(ID)
     
     id = CreateImage(#image3, br, hh)
     dc = StartDrawing(ImageOutput(#image3)) 
     
          r.rect
          r\left=64
          r\right=64+128
          r\top=64
          r\bottom=64+128
          FillRect_(dc,r,brush)
         
          txt$="Hallo"
          DrawingMode(#PB_2DDrawing_Transparent) 
          txtbr=TextWidth(txt$)
          txthh=TextHeight(txt$)
          txtsp=(br-txtbr)/2
          txtze=(hh-txthh)/2
          DrawText(txtsp,txtze,txt$,#blue)
         
     
     StopDrawing() 
    
EndProcedure 
  
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  
  If LoadImage(#image1, musterfile.s) 
    ImageGadget(#button1,  10, 10, 256, 256, ImageID(#image1)) 
  Else 
    Debug "error: LoadImage(0, musterfile.s)" 
  EndIf 
  
  If CreateImage(#image2, 256, 256) 
    StartDrawing(ImageOutput(#image2)) 
      Box(64,64,128,128, #White)    
    StopDrawing() 
    ImageGadget(#button2,  286, 10, 256, 256, ImageID(#image2))  
  Else 
    Debug "error: CreateImage(1, 256, 256)" 
  EndIf 
  
  move_texture_to_box(256,256)    
    
  ImageGadget(#button3,  586, 10, 256, 256, ImageID(#image3)) 
      
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
End
PS: benutze möglichst Konstanten, erleichtert die Arbeit, fördert die Pflege und Übersichtlichkeit.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

hjbremer hat geschrieben:Vielleicht hilft dir das weiter ! Auf White prüfe ich aber nicht, da ich den tieferen Sinn nicht verstehe.
PS: benutze möglichst Konstanten, erleichtert die Arbeit, fördert die Pflege und Übersichtlichkeit.
Normalerweise bnenutze ich an passender Stelle Variablen bzw Konstanten, aber ich wollt das Beispiel so einfach wie möglich halten.

Ziel is es letztendlich, einen (weißen) Text in einem Image, das auf einem WindowedScreen bewegt werden soll, mit einem Muster (Texture?) aus einem anderen Image zu füllen.

sich den Code zu gemüte führend... scholly

[edit 1:] meinen Code oben ersetzt: Text statt Box
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

hallo scholly,

ich hab mal etwas mit MaskBlt_() rumgespielt und das ist dabei rausgekommen, aber ganz verstanden hab ich es auch noch nicht ;)

Code: Alles auswählen

EnableExplicit

Enumeration
  #TEXTUR
  #TEXT
  #MIXED
EndEnumeration

Procedure MaskBlt(BmpID.l, TexturDC.l, MaskID.l)
  Protected hdc.l
  hdc = CreateCompatibleDC_(TexturDC)
  SelectObject_(hdc, BmpID)
  MaskBlt_(hdc, 0, 0, 256, 256, TexturDC, 0, 0, MaskID, 0, 0, #SRCCOPY)
  DeleteDC_(hdc)
EndProcedure

Define musterfile.s, MaskID.l, BmpID.l, TexturDC.l

musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()

If Not LoadFont(0, "Arial", 64,#PB_Font_Bold)
  Debug "font nich jefunden"
  End
EndIf

If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  
  If LoadImage(#TEXTUR, musterfile.s)
    ImageGadget(0, 10, 10, 256, 256, ImageID(0))
  Else
    Debug "error: LoadImage(#TEXTUR, musterfile.s)"
  EndIf
  
  MaskID = CreateImage(#TEXT, 256, 256, 1)
  If MaskID
    StartDrawing(ImageOutput(#TEXT))
      DrawingFont(FontID(0))
      DrawText(20,64,"Hallo",#White,#Black)
    StopDrawing()
    ImageGadget(#TEXT, 286, 10, 256, 256, ImageID(#TEXT))
  Else
    Debug "error: CreateImage(#TEXT, 256, 256)"
  EndIf
  
  BmpID = CreateImage(#MIXED, 256, 256)
  If BmpID
    TexturDC = StartDrawing(ImageOutput(#TEXTUR))
    MaskBlt(BmpID, TexturDC, MaskID)
    StopDrawing()
    ImageGadget(#MIXED, 586, 10, 256, 256, ImageID(#MIXED))
  Else
    Debug "error: CreateImage(#MIXED, 256, 256)"
  EndIf
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
mfG
tobe
PureBasic 4.40 (Windows - x86)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Boah ay, ist das schnell... :allright:
tobe hat geschrieben:ich hab mal etwas mit MaskBlt_() rumgespielt und das ist dabei rausgekommen, aber ganz verstanden hab ich es auch noch nicht ;)
Vielleicht kann ich ja was draus lernen.

Danke... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Die Idee mit MaskBlt ist ja gut, aber schwer zu verstehen.
und ich glaube auch nicht ganz das was du wolltest.

Allerdings das verstehe ich auch nicht so ganz.

Hier eine neue Idee. nicht die schnellste, aber ...

Code: Alles auswählen

; Bereich_mit_Muster_füllen_2.pb 
; scholly / hjbremer

musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg" 
UseJPEGImageDecoder() 

If LoadFont(1, "Arial", 64,#PB_Font_Bold) = 0 
  Debug "font nich jefunden" 
  End 
EndIf 

Procedure move_texture_to_box() 

dc=StartDrawing(ImageOutput(2)) 
    
ID = CopyImage_(ImageID(1), #IMAGE_BITMAP, 40, 40, 0) 
brush = CreatePatternBrush_(ID) 
DeleteObject_(ID) 

For line = 1 To 256 
  For column = 1 To 256 
    
      mask_color = Point(column,line)     
    
      If mask_color = #White ;nur dann brauchen wir das Muster 
         
        SelectObject_(dc,brush)
        
        ExtFloodFill_(dc,column,line,#White,#FLOODFILLSURFACE) 
        Break
    
      EndIf
          
  Next column 
Next line 
    StopDrawing() 
      
EndProcedure 
  
If OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  
  If LoadImage(1, musterfile.s) 
    ImageGadget(1,  10, 10, 256, 256, ImageID(1)) 
  Else 
    Debug "error: LoadImage(0, musterfile.s)" 
  EndIf 
  
  If CreateImage(2, 256, 256) 
    dc=StartDrawing(ImageOutput(2)) 
      DrawingFont(FontID(1)) 
      DrawText(20,64,"Hallo",#White,#Black) 

    StopDrawing() 
    ImageGadget(2,  286, 10, 256, 256, ImageID(2))  
  Else 
    Debug "error: CreateImage(1, 256, 256)" 
  EndIf 
  
  move_texture_to_box()    
  
  SetGadgetState(2,ImageID(2))
    
    
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
End
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

hjbremer hat geschrieben:Die Idee mit MaskBlt ist ja gut, aber schwer zu verstehen.
und ich glaube auch nicht ganz das was du wolltest.

Allerdings das verstehe ich auch nicht so ganz.
Hatte ich doch oben erklärt: Buchstaben mit Muster hinterlegen und dann übern Screen bewegen.
Und z.Zt. sammle ich noch Wissen, wie ich die Buchstaben am schnellsten fülle.
hjbremer hat geschrieben:Hier eine neue Idee. nicht die schnellste, aber ...
... auch interessant für mich zum lernen ;)

danke...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Und z.Zt. sammle ich noch Wissen, wie ich die Buchstaben am schnellsten fülle.

mit masked sprites müßtest du am effektivsten sein...

ich hatte irgendwo mal nen democode gepostet, wo buchstaben rumsausen,
die nen auf- und ab- wandernden farbverlauf drauf hatten.

ich hab zuerst die buchstaben als transparenzfarbe auf maskensprites gelegt.
dann hab ich den farbigen hintergrund auf ein zielsprite gelegt und die maske drüber.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Kaeru Gaman hat geschrieben:ich hatte irgendwo mal nen democode gepostet, wo buchstaben rumsausen,
Ich melde mich dann 2009 wieder, wenn ich alle Deine 13000 Postings durch habe :lol: :lol: :lol:
Zuletzt geändert von scholly am 22.02.2008 22:08, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten