Here's a snippet for convolving a bitmap
example with a simple 3x3 box filter, but look at the Sobel edge detection kernals in the links above..
Load Bitmap "Image.bmp", 1
Make MemBlock 1, 36
SetKernalRow(1, 0, 1.0/9.0, 1.0/9.0, 1.0/9.0)
SetKernalRow(1, 1, 1.0/9.0, 1.0/9.0, 1.0/9.0)
SetKernalRow(1, 2, 1.0/9.0, 1.0/9.0, 1.0/9.0)
ConvolveBitmap(1, 1)
Copy Bitmap 1, 0
do
loop
end
Function SetKernalRow(ConvolutionKernalMemblock, Row, Value1#, Value2#, Value3#)
Write MemBlock Float ConvolutionKernalMemblock, Row*12, Value1#
Write MemBlock Float ConvolutionKernalMemblock, Row*12+4, Value2#
Write MemBlock Float ConvolutionKernalMemblock, Row*12+8, Value3#
EndFunction
Function ConvolveBitmap(Bitmap, ConvolutionKernalMemblock)
TempMemBlock = 2
Make Memblock From Bitmap TempMemBlock, Bitmap
LineWidth = Bitmap Width(Bitmap) * 4
XMax = Bitmap Width(Bitmap) - 1
YMax = Bitmap Height(Bitmap) - 1
PrevCurrentBitmap = Current Bitmap()
Set Current Bitmap Bitmap
Lock Pixels
For Y = 0 To YMax
For X = 0 To XMax
TotalAlpha# = 0.0
TotalRed# = 0.0
TotalGreen# = 0.0
TotalBlue# = 0.0
CurrentPos = 0
For KY = -1 To 1
Y2 = Y + KY
If Y2 < 0 Then Y2 = 0
If Y2 > YMax Then Y2 = YMax
For KX = -1 To 1
X2 = X + KX
If X2 < 0 Then X2 = 0
If X2 > XMax Then X2 = XMax
Color = MemBlock DWORD(TempMemBlock, 12 + Y2*LineWidth + X2*4)
k# = MemBlock Float(ConvolutionKernalMemblock, CurrentPos)
TotalAlpha# = TotalAlpha# + ((Color && 0xff000000) / 4278190080.0) * k#
TotalRed# = TotalRed# + ((Color && 0x00ff0000) / 16711680.0) * k#
TotalGreen# = TotalGreen# + ((Color && 0x0000ff00) / 65280.0) * k#
TotalBlue# = TotalBlue# + ((Color && 0x000000ff) / 255.0) * k#
Inc CurrentPos, 4
Next KX
Next KY
If TotalAlpha# > 1.0 Then TotalAlpha# = 1.0
If TotalRed# > 1.0 Then TotalRed# = 1.0
If TotalGreen# > 1.0 Then TotalGreen# = 1.0
If TotalBlue# > 1.0 Then TotalBlue# = 1.0
Dot X, Y, RGB(TotalAlpha#*255, TotalRed#*255, TotalGreen#*255, TotalBlue#*255)
Inc CurrentPos, 4
Next X
Next y
Unlock Pixels
Delete MemBlock TempMemBlock
Set Current Bitmap PrevCurrentBitmap
EndFunction
It's requires
IanM's Matrix1DLLs