Grafik-Funktionen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: Grafik-Funktionen

BeitragDi, Feb 17, 2009 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich hatte mal wieder langeweile und hab ein paar sehr simple Grafik-Funktionen zum Bearbeiten oder Überarbeiten von Bildern.

Die Funktionen :
Arrow GR_Weichzeichnen(Img%,Schleife%)
Weichzeichnet ein Bild "Img". Schleife ist hierbei die Häufigkeit der Weichzeichnung (1 = Normal, > 1 Weicher)

Arrow GR_SchwarzWeiss(Img%)
Zeichnet ein Bild "Img" schwarz /weiß.

Arrow GR_BlendImage(Img1%,Img2%,Alpha#)
Blendet das bild "Img2" auf das bild "Img1" mit einem Alpha wert (0-1).

Arrow GR_FarbBild(Img%,Rot%,Grün%,Blau%,Alpha#)
Funktioniert gleich wie BlendImage nur das auf das Bild "Img" eine Farbe geblendet wird (RGBA). Alpah ist auch hier 0-1.

Bitte regt euch nicht über die Functionsnamen auf, könnt ja bessere suchen wenn sie euch nicht gefallen Wink

Der Code mal vorab (wegen Codearchiv)

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Global Image = LoadImage("Beispiel.jpg")
Global Blend = LoadImage("Blend.bmp")

Global Alpha# = 0.256
Global Weich = 3
Global Rot = 255
Global Gruen = 128
Global Blau = 64
Global Stark# = 0.256

DrawImage Image,0,0


Img1 = CopyImage(Image)
MS1 = MilliSecs()
GR_SchwarzWeiss(Img1)
Time1 = MilliSecs() - MS1
DrawImage Img1,ImageWidth(Image)+10,0

DebugLog "Schwarzweiß : "+Time1


Img2 = CopyImage(Image)
MS2 = MilliSecs()
GR_Weichzeichnung(Img2,Weich)
Time2 = MilliSecs() - MS2
DrawImage Img2,0,ImageHeight(Image)+10

DebugLog "Weich : "+Time2

Img3 = CopyImage(Image)
MS3 = MilliSecs()
GR_BlendImage(Img3,Blend,Alpha)
Time3 = MilliSecs() - MS3
DrawImage Img3,ImageWidth(Image)+10,ImageHeight(Image)+10


DebugLog "Blend : "+Time3

Img4 = CopyImage(Image)
MS4 = MilliSecs()
GR_FarbBild(Img4,Rot,Gruen,Blau,Stark)
Time4 = MilliSecs() - Ms4
DrawImage Img4,0,(ImageHeight(Image)+10)*2

DebugLog "Färben : "+Time4

Text 0,0,"Normalbild"
Text ImageWidth(Image)+10,0,"Schwarzweißbild ("+Time1+"ms)"
Text 0,ImageHeight(Image)+10,"Weichzeichnung mit Stärke = "+Weich
Text 0,ImageHeight(Image)+25,"("+Time2+"ms)"
Text ImageWidth(Image)+10,ImageHeight(Image)+10,"Blend von zwei Bildern"
Text ImageWidth(Image)+10,ImageHeight(Image)+25,"mit Alpha="+Alpha+" ("+Time3+"ms)"
Text 0,(ImageHeight(Image)+10)*2,"Färbung mit RGBA "
Text 0,(ImageHeight(Image)+17)*2,Rot+","+Gruen+","+Blau+","+Stark+" ("+Time4+"ms)"


 
Flip
Delay 250
FlushKeys()
WaitKey()
Delay 250
FlushKeys()
Repeat
   If KeyDown(200) ScrollY = ScrollY - 10
   If KeyDown(208) ScrollY = ScrollY + 10
   If KeyDown(203) ScrollX = ScrollX - 10
   If KeyDown(205) ScrollX = ScrollX + 10
   DrawImage Image,-ScrollX,-ScrollY
   DrawImage Img1,ImageWidth(Image)+10-ScrollX,-ScrollY
   DrawImage Img2,0-ScrollX,ImageHeight(Image)+10-ScrollY
   DrawImage Img3,ImageWidth(Image)+10-ScrollX,ImageHeight(Image)+10-ScrollY
   DrawImage Img4,0-ScrollX,(ImageHeight(Image)+10)*2-ScrollY
   Flip
   Cls
Until KeyHit(1)


End

Function GR_Weichzeichnung(img,intensiv=1)
   Local Buffer = ImageBuffer(img)
   Local w = ImageWidth(img)
   Local h = ImageHeight(img)
   Local pix[7]
   LockBuffer Buffer
      For inten = 1 To intensiv
         For x = 0 To w-2
            For y = 0 To h-2
               pix_ = ReadPixelFast(x,y,Buffer)
               pix[0] = ReadPixelFast(x-1,y-1,Buffer)
               pix[1] = ReadPixelFast(x+1,y+1,Buffer)
               pix[2] = ReadPixelFast(x+1,y-1,Buffer)
               pix[3] = ReadPixelFast(x-1,y+1,Buffer)
               pix[4] = ReadPixelFast(x+0,y+1,Buffer)
               pix[5] = ReadPixelFast(x+0,y-1,Buffer)
               pix[6] = ReadPixelFast(x+1,y+0,Buffer)
               pix[7] = ReadPixelFast(x-1,y+0,Buffer)
               R = (pix_ And $FF0000) / $10000
               G = (pix_ And $FF00) / $100
               B = (pix_ And $FF)
               For i = 0 To 7
                  R = R + ((pix[i] And $FF0000) /$10000)
                  G = G + ((pix[i] And $FF00) / $100)
                  B = B + (pix[i] And $FF)
               Next
               R = Float(R) / 9.0
               G = Float(G) / 9.0
               B = Float(B) / 9.0
               pix_ = 1*$1000000+R*$10000+G*$100+B
               WritePixelFast(x,y,pix_,Buffer)
            Next
         Next
      Next
   UnlockBuffer Buffer
End Function


Function GR_SchwarzWeiss(Img)
   Local Buffer = ImageBuffer(img)
   Local w = ImageWidth(img)
   Local h = ImageHeight(img)
   LockBuffer Buffer
      For x = 0 To w-1
         For y = 0 To h-1
            pix = ReadPixelFast(x,y,Buffer)
            R = (pix And $FF0000) / $10000
            G = (pix And $FF00) / $100
            B = pix And $FF
            RGB = Int(Float(R+G+B) / 3.0)
            pix = 1*$1000000+RGB*$10000+RGB*$100+RGB
            WritePixelFast(x,y,pix,Buffer)
         Next
      Next
   UnlockBuffer Buffer
End Function


Function GR_BlendImage(Img1,Img2,st#=0.5,mask=$FF000000)
   st = 3.90625 * st
   If st <= 0.255 Return
   Local st1# = 1.0 / st
   Local st2# = st
   Local Buffer1 = ImageBuffer(Img1)
   Local Buffer2 = ImageBuffer(Img2)
   Local w1 = ImageWidth(Img1)
   Local h1 = ImageHeight(Img1)
   Local w2 = ImageWidth(Img2)
   Local h2 = ImageHeight(Img2)
   Local w,h
   If w1 < w2 w = w1 Else w = w2
   If h1 < h2 h = h1 Else h = h2
   If st => 3.90625
      st = 1      
      LockBuffer Buffer1
         LockBuffer Buffer2
            For x = 0 To w
               For y = 0 To h
                  pix1 = ReadPixelFast(x,y,Buffer1)
                  pix2 = ReadPixelFast(x,y,Buffer2)
                  If pix2 <> mask
                     RGB = pix2
                  Else
                     RGB = pix1
                  EndIf
                  WritePixelFast(x,y,RGB,Buffer1)
               Next
            Next
         UnlockBuffer Buffer2
      UnlockBuffer Buffer1
      Return
   EndIf      
   LockBuffer Buffer1
      LockBuffer Buffer2
         For x = 0 To w
            For y = 0 To h
               pix1 = ReadPixelFast(x,y,Buffer1)
               pix2 = ReadPixelFast(x,y,Buffer2)
               If pix2 <> mask
                  R1 = Float((pix1 And $FF0000) / $10000) * st1#
                  G1 = Float((pix1 And $FF00) / $100) * st1#
                  B1 = Float((pix1 And $FF)) * st1#
                  R2 = Float((pix2 And $FF0000) / $10000) * st2#
                  G2 = Float((pix2 And $FF00) / $100) * st2#
                  B2 = Float((pix2 And $FF)) * st2#
                  R = Int(Float(R1 + R2) / 2.0)
                  G = Int(Float(G1 + G2) / 2.0)
                  B = Int(Float(B1 + B2) / 2.0)
                  If R < 0 R = 0
                  If R > 255 R = 255
                  If G < 0 G = 0
                  If G > 255 G = 255
                  If B < 0 B = 0
                  If B > 255 B = 255
                  RGB = 1*$1000000+R*$10000+G*$100+B
               Else
                  RGB = pix1
               EndIf
               WritePixelFast(x,y,RGB,Buffer1)
            Next
         Next
      UnlockBuffer Buffer2
   UnlockBuffer Buffer1
End Function

Function GR_FarbBild(Img,R=128,G=64,B=0,st#=0.512)
   Local Buffer = ImageBuffer(Img)
   Local w = ImageWidth(Img)
   Local h = ImageHeight(Img)
   st# = 3.90625 * st
   Local st1# = 1.0 / st
   Local st2# = st
   LockBuffer Buffer
      For x = 0 To w-1
         For y = 0 To h-1
            pix = ReadPixelFast(x,y,Buffer)
            R2 = Int((((pix And $FF0000) / $10000)*st1 + R*st2) / 2.0)
            G2 = Int((((pix And $FF00) / $100)*st1 + G*st2) / 2.0)
            B2 = Int((((pix And $FF))*st1 + B*st2) / 2.0)
            ; DebugLog R2+","+G2+","+B2
            If R2 < 0 R2 = 0
            If R2 > 255 R2 = 255
            If G2 < 0 G2 = 0
            If G2 > 255 G2 = 255
            If B2 < 0 B2 = 0
            If B2 > 255 B2 = 255
            RGB = 1*$1000000+R2*$10000+G2*$100+B2
            WritePixelFast(x,y,RGB,Buffer)
         Next
      Next
   UnlockBuffer Buffer
End Function


Hier mal ein Screenshot :

user posted image

Und der Download für die dateien für das Beispiel :
Graphics.rar (~1MB)

So ich hoffe manche können was damit anfangen Wink

mfg ToeB
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!
 

Darren

BeitragDi, Feb 17, 2009 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du die intensität des blurens erhöhen willst, solltest du es nicht einfach mehrmals machen lassen, sondern einfach den radius deines pixelsamplings erhöhen...
MFG Darren

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group