Hi,tried to add the alpha channel, but get a dark halo effect around the pixels (see example below)...
Code: Select all
Procedure Min(a.i, b.i)
If a >= b
ProcedureReturn b
Else
ProcedureReturn a
EndIf
EndProcedure
Procedure Max(a.i, b.i)
If a <= b
ProcedureReturn b
Else
ProcedureReturn a
EndIf
EndProcedure
Procedure ImageBlur(img.i, radius.i)
Structure strColorRGBA
r.a
g.a
b.a
a.a
EndStructure
StartDrawing(ImageOutput(img))
If radius < 1
ProcedureReturn
EndIf
Protected imgWidth.i = ImageWidth(img)
Protected imgHeight.i = ImageHeight(img)
Protected imgWidthMinus1.i = imgWidth - 1
Protected imgHeightMinus1.i = imgHeight - 1
Protected imgTotalPixels.i = imgWidth * imgHeight
Protected div.i = radius + radius + 1
Dim r.i(imgTotalPixels - 1)
Dim g.i(imgTotalPixels - 1)
Dim b.i(imgTotalPixels - 1)
Dim a.i(imgTotalPixels - 1)
Protected yw.i
Protected rsum.i
Protected gsum.i
Protected bsum.i
Protected asum.i
Protected x.i
Protected y.i
Protected i.i
Protected *pixel.strColorRGBA
Protected pixel1.i
Protected pixel2.i
Protected *pixel1.strColorRGBA
Protected *pixel2.strColorRGBA
Protected yp.i
Protected yi.i
Dim vmin.i((max(imgWidth, imgHeight)) - 1)
Dim vmax.i((max(imgWidth, imgHeight)) - 1)
Protected *pix = DrawingBuffer()
Dim dv.i((256 * div) - 1)
For i = 0 To (256 * div) - 1
dv(i) = i / div
Next
yi = 0
yw = 0
For y = 0 To imgHeightMinus1
bsum = 0
gsum = 0
rsum = 0
asum = 0
For i = -radius To radius
*pixel = *pix + (yi * 4) + (min( imgWidthMinus1, max(i, 0)) * 4 )
rsum + *pixel\r
gsum + *pixel\g
bsum + *pixel\b
asum + *pixel\a
Next
For x = 0 To imgWidthMinus1
r(yi) = dv(rsum)
g(yi) = dv(gsum)
b(yi) = dv(bsum)
a(yi) = dv(asum)
If y = 0
vmin(x) = min(x + radius + 1, imgWidthMinus1)
vmax(x) = max(x - radius, 0)
EndIf
*pixel1 = *pix + (yw * 4) + (vmin(x) * 4)
*pixel2 = *pix + (yw * 4) + (vmax(x) * 4)
rsum + *pixel1\r - *pixel2\r
gsum + *pixel1\g - *pixel2\g
bsum + *pixel1\b - *pixel2\b
asum + *pixel1\a - *pixel2\a
yi = yi + 1
Next
yw = yw + imgWidth
Next
For x = 0 To imgWidthMinus1
bsum = 0
gsum = 0
rsum = 0
asum = 0
yp = -radius * imgWidth
For i = -radius To radius
yi = max(0, yp) + x
rsum = rsum + r(yi)
gsum = gsum + g(yi)
bsum = bsum + b(yi)
asum = asum + a(yi)
yp = yp + imgWidth
Next
yi = x
For y = 0 To imgHeightMinus1
*pixel = *pix + (yi * 4)
*pixel\r = dv( rsum )
*pixel\g = dv( gsum )
*pixel\b = dv( bsum )
*pixel\a = dv( asum )
If x = 0
vmin(y) = min(y + radius + 1, imgHeightMinus1) * imgWidth
vmax(y) = max(y - radius, 0) * imgWidth
EndIf
pixel1 = x + vmin(y)
pixel2 = x + vmax(y)
rsum+ r(pixel1) - r(pixel2)
gsum+ g(pixel1) - g(pixel2)
bsum+ b(pixel1) - b(pixel2)
asum+ a(pixel1) - a(pixel2)
yi = yi + imgWidth
Next
Next
StopDrawing()
EndProcedure
Procedure CreateKeyImage(image,w,h,b1,b2,b3,r1,r2,c1,c2,c3,c4)
Protected i
Protected bs=b1+b2
Protected r3=bs+r2
Protected g.f
Enumeration
#ImageTemp=99
#ImageCrop
EndEnumeration
CreateImage(image,w,h,32|#PB_Image_Transparent)
CreateImage(#ImageTemp,w,h,32|#PB_Image_Transparent)
StartDrawing(ImageOutput(#ImageTemp))
DrawingMode(#PB_2DDrawing_AllChannels)
; Glänzende Fläche oben
Circle(r3,r3,r2,c3)
Circle(w-r3,r3,r2,c3)
Box(r3,bs,w-r3<<1,b3,c3)
Circle(r3,r3,r2-b3,#False)
Circle(r3,r3+b3>>2,r2-b3+b3>>2,#False)
Circle(r3+b3>>2,r3+b3>>1,r2-b3+b3>>1,#False)
Circle(r3+b3>>1,r3+b3,r2-b3+b3,#False)
Circle(r3+b3>>1+b3>>3,r3+b3+b3>>1,r2+b3>>2,#False)
Circle(w-r3,r3+b3*3,r2+b3<<1,#False)
Box(r3+b3>>1,bs+b3,w-r3<<1-b3>>1,bs,#False)
StopDrawing()
For i=-1 To b3>>2
ImageBlur(#ImageTemp,2)
Next i
StartDrawing(ImageOutput(image))
DrawingMode(#PB_2DDrawing_AllChannels|#PB_2DDrawing_Gradient)
BackColor(c1)
FrontColor(c2)
LinearGradient(0,bs,0,h-bs)
RoundBox(b1,b1,w-b1<<1,h-b1<<1,r1-b1,r1-b1)
DrawingMode(#PB_2DDrawing_Default)
;DrawImage(ImageID(#ImageTemp),0,0)
DrawAlphaImage(ImageID(#ImageTemp),0,0)
StopDrawing()
EndProcedure
Procedure Grey(tone)
ProcedureReturn $FF000000|tone*$10101
EndProcedure
CreateKeyImage(0,570,420,15,20,20,80,40,Grey(150),Grey(70),Grey(220),#Yellow)
OpenWindow(0,0,0,570,420,"")
ImageGadget(0,0,0,570,420,ImageID(0))
Repeat
Until WaitWindowEvent()=#WM_CHAR