Code archives/Graphics/DrawTranslucidImage
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This is my first good and fast transparency-code for Blitzbasic. With this functions you can display images with a tranperency# from 0.0 to 1.0 . All in all it is not a Real-Time-Function, but hey, its tranparency :) ... | |||||
;TranslucidImage - by Max "Kekskiller" Beutling
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;DrawTranslucidImage(Bank,MaskRed,MaskGreen,MaskBlue,X,Y,Transparency#,CenterX=0,CenterY=0)
; - draws an image form a bank
;
;LoadTranslucidImage(File$)
; - loads an image file in to a bank
;
;ConvertImageToTranslucid(Picture)
; - converts an image to a image bank
Graphics 640,480,16,1
SetBuffer BackBuffer()
ClsColor 255,255,255
Temporary=LoadTranslucidImage("testmonster.bmp") ;<- name of the image
Global TranslucidDown=0,Translucid#=0
Global bwx,BW,oldZeit
Repeat
Cls
mx=MouseX()
my=MouseY()
Select TranslucidDown
Case 0
Translucid#=Translucid#+0.01
If Translucid#>=1 Then TranslucidDown=1:Translucid#=1
Case 1
Translucid#=Translucid#-0.01
If Translucid#<=0 Then TranslucidDown=0:Translucid#=0
End Select
DrawTranslucidImage(Temporary,255,255,255,mx,my,Translucid#,1,1)
bwx=bwx+1:If MilliSecs()>oldZeit+999 Then BW=bwx:bwx=0:oldZeit=MilliSecs()
Color 0,0,0
Text 1,1,BW
Flip
Until KeyHit(1)
End
Function DrawTranslucidImage(bank,mred,mgre,mblu,ox,oy,t#,centerx=0,centery=0)
out=BackBuffer()
pw=PeekByte(bank,0)
ph=PeekByte(bank,1)
gw=GraphicsWidth()-1
gh=GraphicsHeight()-1
If centerx=1 Then ox=ox-pw/2
If centery=1 Then oy=oy-ph/2
z=2
LockBuffer out
For y=0 To ph
For x=0 To pw
If ox+x>=0 And oy+y>=0 And ox+x<=gw And oy+y<=gh Then
ired=PeekByte(bank,z):z=z+1
igre=PeekByte(bank,z):z=z+1
iblu=PeekByte(bank,z):z=z+1
If ired<>mred Or igre<>mgre Or iblu<>mblu Then
opx=ReadPixelFast(ox+x,oy+y,out)
ored=ExtractRed(opx)
ogre=ExtractGreen(opx)
oblu=ExtractBlue(opx)
If ored<ired Then
fred=ored+Degree#(ored,ired)*t#
ElseIf ored>ired Then
fred=ired+Degree#(ored,ired)*t#
ElseIf ored=ired Then
fred=ored
EndIf
If ogre<igre Then
fgre=ogre+Degree#(ogre,igre)*t#
ElseIf ogre>igre Then
fgre=igre+Degree#(ogre,igre)*t#
ElseIf ogre=igre Then
fgre=ogre
EndIf
If oblu<iblu Then
fblu=oblu+Degree#(oblu,iblu)*t#
ElseIf oblu>iblu Then
fblu=iblu+Degree#(oblu,iblu)*t#
ElseIf oblu=iblu Then
fblu=oblu
EndIf
fpx=fred*$10000+fgre*$100+fblu
WritePixelFast ox+x,oy+y,fpx,out
EndIf
Else
z=z+3
EndIf
Next
Next
UnlockBuffer out
End Function
Function LoadTranslucidImage(file$)
picture=LoadImage(file$)
pw=ImageWidth(picture)-1
ph=ImageHeight(picture)-1
bnk=CreateBank(2+((pw+1)*(ph+1))*3)
in=ImageBuffer(picture)
PokeByte bnk,0,pw
PokeByte bnk,1,ph
z=2
LockBuffer in
For y=0 To ph
For x=0 To pw
ipx=ReadPixelFast(x,y,in)
ired=ExtractRed(ipx)
igre=ExtractGreen(ipx)
iblu=ExtractBlue(ipx)
PokeByte bnk,z,ired:z=z+1
PokeByte bnk,z,igre:z=z+1
PokeByte bnk,z,iblu:z=z+1
Next
Next
UnlockBuffer in
FreeImage picture
Return bnk
End Function
Function ConvertImageToTranslucid(picture)
pw=ImageWidth(picture)-1
ph=ImageHeight(picture)-1
bnk=CreateBank(2+((pw+1)*(ph+1))*3)
in=ImageBuffer(picture)
PokeByte bnk,0,pw
PokeByte bnk,1,ph
z=2
LockBuffer in
For y=0 To ph
For x=0 To pw
ipx=ReadPixelFast(x,y,in)
ired=ExtractRed(ipx)
igre=ExtractGreen(ipx)
iblu=ExtractBlue(ipx)
PokeByte bnk,z,ired:z=z+1
PokeByte bnk,z,igre:z=z+1
PokeByte bnk,z,iblu:z=z+1
Next
Next
UnlockBuffer in
Return bnk
End Function
Function Degree#(v1#,v2#)
Local bigger,out#
If v2#>v1# bigger=2
If v1#>v2# bigger=1
Select bigger
Case 0:out#=0
Case 1:out#=v1#-v2#
Case 2:out#=v2#-v1#
End Select
Return out#
End Function
Function ExtractRed(col)
o=(col And $FF0000)/$10000
Return o
End Function
Function ExtractGreen(col)
o=(col And $FF00)/$100
Return o
End Function
Function ExtractBlue(col)
o=col And $FF
Return o
End Function |
Comments
| ||
| Shouldn't that be Translucent rather than Translucid? Unless of course it is partially lucid, or across lucidity or something like that. |
Code Archives Forum