@tlsoup – We have looked to offer that a few times before, but the complexities and hackish nature of the solutions required are not ideal.
Properly protecting the actual media files has 2 ways of being accomplished.
1. At the server level, modifying your servers configs in a way to block access directly to the files. This has the limitation of not being able to validate against a users profile/user-role. This method is very performance based, but also hard to allow flexibility.
2. Via PHP, replace all usage of image1.jpg with hhkalw4h5laeufojdsklah.jpg, then have a DB table that maps that hash image to a real one. Then PHP can be used to validate if the current user has permission to view that image and return a fake image if not.
This is probably what you hoped for, BUT this makes a huge impact on your servers performance. Every protected image requires an entirely separate PHP process. This means every image will load the entirety of WordPress and all plugins, make multiple queries to the database and finally return the image.
If you had a page with 50 images, you would be making 51 separate page load requests to your server every time that page loads. If 10 people try to load it at once, now your talking 500 requests. This very quickly overwhelms most low cost servers making it not really viable.
Though we can implement this, we would have to recommend against most of our users enabling it without having their hosting upgraded to handle the extra loads that causes.
We are always re-evaluating, so it could get there one day, we definitely understand the desire for such a feature.