One way to create a greyscale image is to redraw it offscreen and recapture it. When you redraw the image data, average the three color values, red, green, blue, and then substitute that value in for all three values to get a grey level. That's just my idea on it. As for turning it too just different shades of 1 color, I'm not sure.
But to blend the two together, you can use linear interpolation.
The code below shows how to fade between two different images.
sync on
sync rate 20
REM VARIABLES
TEXTURE_WIDTH = 100
TEXTURE_HEIGHT = 100
dim textureA(TEXTURE_WIDTH,TEXTURE_HEIGHT,2)
dim textureB(TEXTURE_WIDTH,TEXTURE_HEIGHT,2)
REM TEXTURE SETUP
REM Texture A will contain pixels of random colors
REM Texture B will be a black and white tile
rem texture A
for y = 0 to TEXTURE_HEIGHT - 1
for x = 0 to TEXTURE_WIDTH - 1
R = rnd(255)
G = rnd(255)
B = rnd(255)
textureA(x,y,0) = R
textureA(x,y,1) = G
textureA(x,y,2) = B
next x
next y
rem texture B
for y = 0 to TEXTURE_HEIGHT/2 - 1
for x = 0 to TEXTURE_WIDTH/2 - 1
textureB(x,y,0) = 255
textureB(x,y,1) = 255
textureB(x,y,2) = 255
textureB(x+TEXTURE_WIDTH/2,y+TEXTURE_HEIGHT/2,0) = 255
textureB(x+TEXTURE_WIDTH/2,y+TEXTURE_HEIGHT/2,1) = 255
textureB(x+TEXTURE_WIDTH/2,y+TEXTURE_HEIGHT/2,2) = 255
next x
next y
K# = 0.0
do
cls
REM DRAW INTERPOLATED TEXTURE
`K#=0
for x = 0 to TEXTURE_HEIGHT - 1
for y = 0 to TEXTURE_WIDTH - 1
R = textureA(x,y,0) + ((textureB(x,y,0) - textureA(x,y,0)) * K#)
G = textureA(x,y,1) + ((textureB(x,y,1) - textureA(x,y,1)) * K#)
B = textureA(x,y,2) + ((textureB(x,y,2) - textureA(x,y,2)) * K#)
ink rgb(R,G,B),0
dot x, y
next y
`inc K#, 0.01
next x
rem REM these 4 lines and unREM the 2 lines above to show a transitional fade
if upkey()=1 then K# = K# + 0.1
if K#>1 then K#=1
if downkey()=1 then K# = K# - 0.1
if K#<0 then K#=0
set cursor 200,100
print K#
sync
loop