This is a filter I've come up with:
Code:
; GrayScale Function

GrayScale proc uses edi esi hDC:DWORD,imageX:DWORD,imageY:DWORD

LOCAL rect:RECT
LOCAL red:DWORD
LOCAL green:DWORD
LOCAL blue:DWORD

mov edi,imageX
dec edi
mov esi,imageY
dec esi
.REPEAT
.REPEAT
invoke GetPixel,hDC,edi,esi

movzx ecx,al
mov red,ecx
shr eax,8
movzx ecx,al
mov green,ecx
shr eax,8
movzx ecx,al
mov blue,ecx

mov eax,66
imul red
mov ecx,eax
			
mov eax,129
imul green
add ecx,eax
		
mov eax,25
imul blue
add ecx,eax

add ecx,128
shr ecx,8
add ecx,16

xor eax,eax

mov al,cl
shl eax,8
mov al,cl
shl eax,8
mov al,cl

invoke SetPixelV,hDC,edi,esi,eax
dec esi
.UNTIL SIGN?
mov esi,imageY
dec esi
dec edi
.UNTIL SIGN?
ret	
GrayScale endp
If you compile it into a DLL you can use it in VB..

Phreak