Copying the lock value in move_bitmap seems wrong to me, as it breaks any locks on the destination. Locking the source doesn't make sense because the caller is supposed to control the only reference to it.
I'm not sure it makes sense in free_image_data either, as it leaves the image in an invalid state. Anything calling it should have a lock if this is important.
I think it is possible to get unlock != true, when GdipImageRotateFlip calls GdipBitmapLockBits.