CreateImageOutline Function

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: CreateImageOutline Function

BeitragFr, Jan 25, 2008 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal eine Function gebastelt mit der man einen Umriss von einem Image nehmen kann (Es wird direkt in ein anderes Image gespeichert) :

CreateImageOutline%(imgHandle%,maskRed%,maskGreen%,maskBlue%,lineRed%,lineGreen%,lineBlue%[,frame%])

Die Parameter :
Arrow imgHandle% : Sollte klar sein -> das Image Handle des Bildes von dem der Umriss genommen werden soll
Arrow maskRed/Green/Blue% : Die Hintergrundsfarbe, damit die Function weiß was zu dem Bild gehört und was nicht Wink
Arrow lineRed/Green/Blue% : Die Farbe in der der Umriss gezeichnet werden soll ....
Arrow frame% : Dürfte auch klar sein -> so kann man auch den umriss von bestimmten frames im Bild nehemen

Die Function :
(Die Function GetHex() ist für die Haubtfunction wichtig !)
Code: [AUSKLAPPEN]
Function CreateImageOutline(imgHandle,maskRed=255,maskGreen=0,maskBlue=255,lineRed=255,lineGreen=255,lineBlue=255,frame=0)
   
   Local width = ImageWidth( imgHandle)
   Local height= ImageHeight(imgHandle)
   Local imgUmriss = CreateImage(width,height)
   Local maskColor = GetHex(maskRed,maskGreen,maskBlue)
   Local lineColor = GetHex(lineRed,lineGreen,lineBlue)
   
   LockBuffer ImageBuffer(imgHandle,frame)
   LockBuffer ImageBuffer(imgUmriss)
      ;Senkrecht :
      For x = 0 To width
         For y = 0 To height
            pix_o = ReadPixelFast(x,y,ImageBuffer(imgHandle,frame))
            pix_u = ReadPixelFast(x,y+1,ImageBuffer(imgHandle,frame))
            If pix_o = maskColor And pix_u <> maskColor And y < height-1 Then
               WritePixelFast(x,y,lineColor,ImageBuffer(imgUmriss))
            EndIf
            If pix_o <> maskColor And pix_u = maskColor And y < height-1 Then
               WritePixelFast(x,y+1,lineColor,ImageBuffer(imgUmriss))
            EndIf
         Next
      Next
      ;Waagerecht :
      For y = 0 To height
         For x = 0 To width
            pix_l = ReadPixelFast(x,y,ImageBuffer(imgHandle,frame))
            pix_r = ReadPixelFast(x+1,y,ImageBuffer(imgHandle,frame))
            If pix_l = maskColor And pix_r <> maskColor And x < width-1 Then
               WritePixelFast(x,y,lineColor,ImageBuffer(imgUmriss))
            EndIf
            If pix_l <> maskColor And pix_r = maskColor And y < height-1 Then
               WritePixelFast(x+1,y,lineColor,ImageBuffer(imgUmriss))
            EndIf
         Next
      Next
      
   UnlockBuffer ImageBuffer(imgHandle,frame)
   UnlockBuffer ImageBuffer(imgUmriss)
   Return imgUmriss
End Function

Function GetHex(red,green,blue) 
     Local Hexa 
     Hexa = 255*$1000000 + red*$10000 + green*$100 + blue
     Return Hexa 
End Function


Das Beispiel :
(Dazu braucht ihr das bild hier.)
[code;*********************************************************************************************************************
;// Test zur Function "CreateImageOutline()" *************************************************************************
;// BY CRACK93 *******************************************************************************************************
;*********************************************************************************************************************

Graphics 400,400,16,2
AppTitle "Function CreateImageOutline"
Global TestImg = LoadAnimImage("Fig1.png",50,100,0,22):MaskImage TestImg,255,0,255

Global Umriss = CreateImage(50,100,22)
For i = 0 To 21
SetBuffer ImageBuffer(Umriss,i)
b=CreateImageOutline(TestImg,255,0,255,255,255,255,i)
DrawImage b,0,0
Next

SetBuffer BackBuffer()

ClsColor 100,100,100
f = 0
ms = MilliSecs()

Repeat
Text 100,1,"Leertaste => eine FRAME weiter"
If KeyDown(57) Then If MilliSecs() > ms + 200 Then f = (f+1) Mod 22 ms = MilliSecs()
DrawImage TestImg,0,0,f
DrawImage Umriss,0,ImageHeight(TestImg)+10,f
;VWait()
Flip
Cls
Until KeyHit(1)
End[/code]

Freue mich über gut Kritik Wink
(Also wäre schön wenn ihr euch dazu äßern könntet...)

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragSa, Jan 26, 2008 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich packs nicht...
Ich hatte vor, die Funktion ein wenig zu überarbeiten... Sie schneller zu machen. und was muss ich bemerken? Mein System ist doch glatt 10 bis 20ms langsamer Sad

Ich hatte es so umgeschrieben:
Code: [AUSKLAPPEN]
Function CreateImageOutline(imgHandle,maskRed=255,maskGreen=0,maskBlue=255,lineRed=255,lineGreen=255,lineBlue=255,frame=0)
   
   Local x,y,pix_o,pix_u,pix_l,pix_r
   Local width = ImageWidth( imgHandle)
   Local height= ImageHeight(imgHandle)
   Local imgUmriss = CreateImage(width,height)
   Local maskColor = 255*$1000000 + maskRed*$10000 + maskGreen*$100 + maskBlue
   Local lineColor = 255*$1000000 + lineRed*$10000 + lineGreen*$100 + lineBlue
   Local handlebuffer=ImageBuffer(imgHandle,frame)
   Local umrissbuffer=ImageBuffer(imgUmriss)
   
   LockBuffer handlebuffer
   LockBuffer umrissbuffer
   
   For x = 0 To width
      For y = 0 To height
            pix_o = ReadPixelFast(x,y,handlebuffer)
            pix_u = ReadPixelFast(x,y+1,handlebuffer)
         pix_l = ReadPixelFast(x,y,handlebuffer)
            pix_r = ReadPixelFast(x+1,y,handlebuffer)
         If y<height-1 Then
            If pix_o = maskColor And pix_u <> maskColor Then
               WritePixelFast(x,y,lineColor,umrissbuffer)
            EndIf
            If pix_o <> maskColor And pix_u = maskColor Then
               WritePixelFast(x,y+1,lineColor,umrissbuffer)
            EndIf
            If pix_l <> maskColor And pix_r = maskColor Then
               WritePixelFast(x+1,y,lineColor,umrissbuffer)
            EndIf
         EndIf
         If pix_l = maskColor And pix_r <> maskColor And x < width-1 Then
            WritePixelFast(x,y,lineColor,umrissbuffer)
            EndIf
           
      Next
   Next
   
   UnlockBuffer handlebuffer
   UnlockBuffer umrissbuffer
   Return imgUmriss
End Function


Dabei würde theoretisch der erneute Durchlauf erspart werden, es würde auf eine Var anstatt auf eine Funktion zurückgegriffen werden bei ImageBuffer und die Abfrage hab ich auch ganz fein umstrukturiert... und das bringt nix...

Naja, gut gemacht Cracky Smile

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group