I suggest the following:
Save the files to a folder that is not directly accessible by anyone.
Register the name of the file, the id of the user to which it belongs, and a flag indicating if it's public or private in a table in your database.
Now create an HttpModule for serving your images. You do this by implementing the IHttpModule interface.
In your httpmodule code, you check the request url to find out which image is being requested and to whom it belongs. Now check against the database to see if it's public or private.
If it's public you write it to the response stream (remember to set content type to image/jpeg) by reading it from disk and writing it to Response.OutputStream.
If it's private you either just end the response (eg. with a access denied http code) if the requestor is not the owner of the picture, or serve the picture otherwise.
To learn more about creating your own httpmodule read this: http://msdn2.microsoft.com/en-us/library/ms227673.aspx
Hope it points you in the right direction.
/Klaus