Alpha-Wert eines Bildes nach außen hin kleiner werden lassen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Brotenkopf

Betreff: Alpha-Wert eines Bildes nach außen hin kleiner werden lassen

BeitragFr, Mai 11, 2012 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute
Ich bin hier im Forum auf eine Funktion gestoßen die eine Bild Transparent macht https://www.blitzforum.de/foru...highlight=

Die Funktion geht ja jeden Pixel des Bildes einzeln durch mit
For i=x
For j=y

und ich weiß ja das das Zentrum des Bildes den Wert: X+(ImageWidth(Bild)/2) und Y+(ImageHeight(Bild)/2) hat

Wie kann ich nun den Alpha-Wert vom Mittelpunkt des Bildes bis zum äußeren Rand des Bildes kleiner werden lassen sodass der Rand dann nur noch 0.0000...1 und der Mittelpunkt den Alpha-Wert 1 hat?

Xeres

Moderator

BeitragFr, Mai 11, 2012 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic beherrscht kein Alpha, entsprechend langsam wird diese Funktion sein...

Du kannst den Abstand mittels Pythagoras bestimmten, Normalisieren (durch das Maximum teilen) und in die Berechnung einfließen lassen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Brotenkopf

BeitragFr, Mai 11, 2012 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe jetzt den Punkt P1 mit P1x und P1y (Zentrum) also x+imagewidth()/2 und y+imageHeight()/2
dann den Punkt P2 welcher sich auf der Hälfte des Bildes ganz oben also x+imagewidth()/2 und Y befindet
dann die Länge der Seite P1-P2 welche ja immer gleich ist.
dann berechne ich in der Schleife die seite P2-P3 und den berechne dann den Abstand aus den Beiden Seiten.

Wenn ich nun alpha=Abstand/Maximum setze sieht es noch nicht so aus wie ich mir das vorgestellt habe

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;Bild1
Bild=CreateImage(250,250)
Bild2=CreateImage(250,250)

SetBuffer ImageBuffer(Bild)
Color Rand(0,255),Rand(0,255),Rand(0,255):Rect 0,0,250,250
SetBuffer ImageBuffer(Bild2)
Color Rand(0,255),Rand(0,255),Rand(0,255):Rect 0,0,250,250
SetBuffer BackBuffer()


r=1
Repeat
   Cls

   DrawImage bild,35,35
   AlphaImage Bild2,25,25
   Flip
Until KeyDown(1)


Function Alphaimage(bi,x#,y#)
   w=ImageWidth(bi)
   h=ImageHeight(bi)
   p1x#=x+(ImageWidth(bi)/2)
   p1y#=y+(ImageHeight(bi)/2)
   p2x#=x+(ImageWidth(bi)/2)
   p2y#=y
   p1p2_max#=Sqr(((p1x-p2x)*(p1x-p2x))+((p1y-p2y)*(p1y-p2y)))
   p2p3_max#=Sqr(((p2x-x)*(p2x-x))+((p2y-y)*(p2y-y)))
   max#=Sqr(p1p2_max*p1p2_max)+Sqr(p2p3_max*p2p3_max)
   LockBuffer BackBuffer()
   LockBuffer ImageBuffer(bi)
      For i#=x To x+w-1
         For j#=y To y+h-1
         p2p3#=Sqr(((p2x-i)*(p2x-i))+((p2y-j)*(p2y-j)))
         abstand#=Sqr(p1p2*p1p2)+Sqr(p2p3*p2p3)
         a#=Abstand/max
            rgb=ReadPixelFast(i,j,BackBuffer())
            r=(rgb And $FF0000)/$10000
            g=(rgb And $FF00)/$100
            b=rgb And $FF
            rgb2=ReadPixelFast(i-x,j-y,ImageBuffer(bi))
            r2=(rgb2 And $FF0000)/$10000
            g2=(rgb2 And $FF00)/$100
            b2=rgb2 And $FF
            r=r+(r2-r)/(1/a#)
            g=g+(g2-g)/(1/a#)
            b=b+(b2-b)/(1/a#)
            rgb=r*$10000 + g*$100 + b   
            WritePixelFast(i,j,rgb,BackBuffer())
         Next
      Next
   UnlockBuffer ImageBuffer(bi)
   UnlockBuffer BackBuffer()
End Function
 

Lador

BeitragSa, Mai 12, 2012 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie willst du denn, dass es aussieht?

Ich verstehe nicht ganz, warum p2y immer gleich y ist. Ich hab den Wert mal so definiert:
Code: [AUSKLAPPEN]
p2y#=y+(ImageHeight(bi)/2)

und finde, dass das eigentlich recht gut aussieht. Auch diese komischen unteren Ecken (wo der Alphawert dann gleich 0 ist) sind dann Geschichte.

Hab mir den Code jetzt zwar nicht genau angesehen, aber ich verstehe ihn nicht wirklich. ^^ Auch denke ich mal, dass a = Abstand/Max nie gleich 1 sein kann, wenn das denn beabsichtigt war.

MFG Lador
Mein aktuelles Projekt:
2D-Rollenspiel "Iliran"
Screenshot | Worklog
Fortschritt: ca. 70%

Brotenkopf

BeitragSo, Mai 13, 2012 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich wollte das es genau SO aussieht

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;Bild1
Bild=CreateImage(800,600)
Bild2=CreateImage(800,600)

SetBuffer ImageBuffer(Bild)
Color Rand(0,255),Rand(0,255),Rand(0,255):Rect 0,0,800,600
SetBuffer ImageBuffer(Bild2)
Color Rand(0,255),Rand(0,255),Rand(0,255):Rect 0,0,800,600
SetBuffer BackBuffer()


r=1
Repeat
   Cls
DrawImage bild,0,0
Alphaimage(bild2,0,0)


   Flip
Until KeyDown(1)


Function Alphaimage(bi,x#,y#)
   w=ImageWidth(bi)
   h=ImageHeight(bi)
   p1x#=x+(ImageWidth(bi)/2)
   p1y#=y+(ImageHeight(bi)/2)
   p2x#=x+(ImageWidth(bi)/2)
   p2y#=y+(ImageHeight(bi)/2)
   p1p2_max#=Sqr(((p1x-p2x)*(p1x-p2x))+((p1y-p2y)*(p1y-p2y)))
   p2p3_max#=Sqr(((p2x-x)*(p2x-x))+((p2y-y)*(p2y-y)))
   max#=Sqr(p1p2_max*p1p2_max)+Sqr(p2p3_max*p2p3_max)
   LockBuffer BackBuffer()
   LockBuffer ImageBuffer(bi)
      For i#=x To x+w-1
         For j#=y To y+h-1
         p2p3#=Sqr(((p2x-i)*(p2x-i))+((p2y-j)*(p2y-j)))
         abstand#=Sqr(p1p2*p1p2)+Sqr(p2p3*p2p3)
         a#=1-Abstand/max
            rgb=ReadPixelFast(i,j,BackBuffer())
            r=(rgb And $FF0000)/$10000
            g=(rgb And $FF00)/$100
            b=rgb And $FF
            rgb2=ReadPixelFast(i-x,j-y,ImageBuffer(bi))
            r2=(rgb2 And $FF0000)/$10000
            g2=(rgb2 And $FF00)/$100
            b2=rgb2 And $FF
            r=r+(r2-r)/(1/a#)
            g=g+(g2-g)/(1/a#)
            b=b+(b2-b)/(1/a#)
            rgb=r*$10000 + g*$100 + b   
            WritePixelFast(i,j,rgb,BackBuffer())
         Next
      Next
   UnlockBuffer ImageBuffer(bi)
   UnlockBuffer BackBuffer()
End Function


weiß nich hatte wohl nen Denkfehler an der Stelle. Danke an Lador und Xeres

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group