Rather than exposing the direct url to the image in your image tag, you expose an http handler (.ashx file).
The code behind in the .ashx file would check for the referrer and make sure it is valid. A direct call to the .ashx from outside the browser would have a referrer of null or empty string. You'd use Response.WriteFile to write the contents of the image to the output stream.
context.Response.StatusCode = 200;
context.Response.ContentType = contentType;
context.Response.WriteFile(fileName);