Tommy, the method you're using to do this probably works in most cases, but it is not generically safe.
You see, the reason Image.FromFile keeps the file locked is because GDI+ can (depending on the codec, the size of the file, and other factors) delay decoding (parts of) the image until they are actually needed (e.g. when you draw them). The Image.FromStream method will for the same reason keep a reference to the stream you passed it. If you close the stream and you run into one of these delayed-decoding scenarios, GDI+ will access the stream and fail with an ObjectDisposedException.
The only way that I know of to achieve this that is 100% safe in all cases is to load the image from file, create a new image, draw the original image into the new image, and then close the original one (which unlocks the file).
Public Module Utils
Public Function ImageFromFile(ByVal fileName As String) As Image
Using image As Image = image.FromFile(fileName)
Dim result As New Bitmap(image.Width, image.Height, Imaging.PixelFormat.Format32bppArgb)
Using g As Graphics = Graphics.FromImage(result)
g.DrawImage(image, 0, 0, image.Width, image.Height)
End Using
Return result
End Using
End Function
End Module