By allowing it to be directly loaded in a web page you, by definition, are downloading it. A completely separate request is made by your browser for the image file itself independent of the request for the web page it loads in.
You could put code in place to dynamically send image information to a page. The code could read the image files from a location outside of your document root and send the data to the page. Then there would be no URL for the image and thus it couldn't be downloaded from a browser.
The code would read the binary image data from the file and then output that same data while setting the mime-type to whatever format your image is (image/jpg, image/png, etc). This can be done via CGI, ASP, JSP, or any other kind of application gateway.
Preventing hotlinking is a better suggestion than this, though.