I think I've answered myself on this one - I hadn't realised that the Lockbits method allowed me to modify the image before unlocking, so I think that's the best method. If it works I'll post the code for anyone that might have the same question.
[Edit:] OK. here's the subroutine for reading and modifying an image with Lockbits. The original image is black & white, so I use the green channel to get luminance. LUT() is the look-up table - an array of colors (0-255). (Derived this from the MS Bitmap Class documentation).
Private Sub Read_and_Write_Image(ByRef bmp As Bitmap,byref LUT() as color)
' Lock the bitmap's bits.
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect,
Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
Dim tmpG As Integer
' Get the address of the first line.
Dim ptr As IntPtr = bmpData.Scan0
' Declare an array to hold the bytes of the bitmap.
' This code is specific to a bitmap with 24 bits per pixels.
Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
Dim rgbValues(bytes - 1) As Byte
dummy = 1
' Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
For counter As Integer = 0 To rgbValues.Length - 1 Step 3
tmpG = CInt(rgbValues(counter))
rgbValues(counter) = LUT(tmpG).B
rgbValues(counter + 1) = LUT(tmpG).G
rgbValues(counter + 2) = LUT(tmpG).R
Next
' Copy the RGB values back to the bitmap
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)
ImgBox.Image = bmp
' Unlock the bits.
bmp.UnlockBits(bmpData)
End Sub