What's wrong with my alpha blend routine?

Just starting out? Need help? Post your questions and find answers here.
Trond
Always Here
Always Here
Posts: 7446
Joined: Mon Sep 22, 2003 6:45 pm
Location: Norway

Post by Trond »

Code: Select all


UsePNGImageDecoder()

Global Dim Lookup.f(255)
For I = 0 To 255
  Lookup(I) = 0.0+I/255
Next

Procedure Min(A, B)
  If A > B
    ProcedureReturn B
  EndIf
  ProcedureReturn A
EndProcedure

Structure RGBTRIPLECRUDE
  rgbBlue.c
  rgbGreen.c
  rgbRed.c
EndStructure

Procedure BlitImageTranlucent(Img1, Img2, Alpha)
  Protected Mem1, Mem2
  Protected Bmp.BITMAP
  Protected X, Y
  Protected *OldVal1.RGBTRIPLECRUDE ; Haha this is the trick
  Protected *OldVal2.RGBTRIPLECRUDE
  GetObject_(ImageID(Img1), SizeOf(BITMAP), @Bmp)
  Mem1 = Bmp\bmBits
  GetObject_(ImageID(Img2), SizeOf(BITMAP), @Bmp)
  Mem2 = Bmp\bmBits
  Target2 = Mem2 + Bmp\bmWidthBytes * Bmp\bmHeight-3
  For *OldVal2 = Mem2 To Target2 Step 3
    *OldVal1 = Mem1
    Mem1 + 3
    *OldVal1\rgbRed   = *OldVal1\rgbRed   * Lookup(255-Alpha) + *OldVal2\rgbRed    * Lookup(Alpha)
    *OldVal1\rgbGreen = *OldVal1\rgbGreen * Lookup(255-Alpha) + *OldVal2\rgbGreen  * Lookup(Alpha)
    *OldVal1\rgbBlue  = *OldVal1\rgbBlue  * Lookup(255-Alpha) + *OldVal2\rgbBlue   * Lookup(Alpha)
  Next
EndProcedure

OpenWindow(0, 0, 0, 512, 384, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_BorderLess)
CreateGadgetList(WindowID(0))

; Note, my png images are 24-bit
LoadImage(0, "Terragen___Astounding_by_tigaer.PNG")
LoadImage(1, "gallery_2_0_255974.png")
CreateImage(2, 512, 384, 24)

ResizeImage(0, 512, 384)
ResizeImage(1, 512, 384)


Debug "starting fade"

#Step = 25
For I = 0 To #Step
  StartDrawing(ImageOutput(2))
    DrawImage(ImageID(0), 0, 0)
  StopDrawing()
    BlitImageTranlucent(2, 1, 255/#Step*I)
  StartDrawing(WindowOutput(0))    
    DrawImage(ImageID(2), 0, 0)
  StopDrawing()
Next


Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
User avatar
Michael Vogel
Addict
Addict
Posts: 2811
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Post by Michael Vogel »

THANK YOU!

Tronds code ist simple and fast (enough) and works on all notebooks (but mine) - And, I think, all JPGs are 24 Bit, so I can use this routine in my dia show now!

GREAT !

Code: Select all

UseJPEGImageDecoder()
UsePNGImageDecoder()

Structure RGBTRIPLECRUDE
	rgbBlue.c
	rgbGreen.c
	rgbRed.c
EndStructure

Procedure BlitImageTranlucent(Img1,Img2,Alpha)
	Protected Mem1,Mem2
	Protected Bmp.BITMAP
	Protected X,Y
	Protected *OldVal1.RGBTRIPLECRUDE ; Haha this is the trick
	Protected *OldVal2.RGBTRIPLECRUDE
	Protected Beta=255-Alpha
	GetObject_(ImageID(Img1),SizeOf(BITMAP),@Bmp)
	Mem1=Bmp\bmBits
	GetObject_(ImageID(Img2),SizeOf(BITMAP),@Bmp)
	Mem2=Bmp\bmBits
	Target2=Mem2 + Bmp\bmWidthBytes * Bmp\bmHeight-3
	For *OldVal2=Mem2 To Target2 Step 3
		*OldVal1=Mem1
		Mem1 + 3
		*OldVal1\rgbRed=(*OldVal1\rgbRed*Beta+*OldVal2\rgbRed*Alpha)>>8
		*OldVal1\rgbGreen=(*OldVal1\rgbGreen*Beta+*OldVal2\rgbGreen*Alpha)>>8
		*OldVal1\rgbBlue=(*OldVal1\rgbBlue*Beta+*OldVal2\rgbBlue*Alpha)>>8
	Next
EndProcedure

OpenWindow(0,0,0,776,384,"",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_BorderLess)
CreateGadgetList(WindowID(0))

; Note,my png images are 24-bit
;LoadImage(0,"Terragen___Astounding_by_tigaer.PNG")
;LoadImage(1,"gallery_2_0_255974.png")

LoadImage(0,"Data\1.jpg")
LoadImage(1,"Data\2.jpg")
;LoadImage(1,"Data\test.bmp")
CreateImage(2,512,384,24)
ResizeImage(0,512,384)
ResizeImage(1,512,384)


DisableDebugger

Debug "starting fade"

zeit-GetTickCount_()
#Step=255
For I=0 To 255 Step 5
	StartDrawing(ImageOutput(2))
	DrawImage(ImageID(0),0,0)
	StopDrawing()
	BlitImageTranlucent(2,1,i)
	StartDrawing(WindowOutput(0))
	DrawImage(ImageID(2),0,0)
	DrawImage(ImageID(1),520,0,256,192)
	DrawImage(ImageID(0),520,192,256,192)
	StopDrawing()
Next
zeit+GetTickCount_()

EnableDebugger
Debug zeit

Repeat
	Select WaitWindowEvent()
	Case #PB_Event_CloseWindow
		Break
	EndSelect
ForEver
Post Reply