By definition, if a visitor can view an image, it has already been downloaded. That's how a web page works. You can however use a variety of tactics to make it more difficult to do so.

As you've mentioned, using JavaScript to interfere with the normal contextual menu is an option. However, that won't work if the user has disabled JavaScript on their browser.

Another method some websites use is to slice each image into several pieces and merge them back together within the browser (using CSS, for instance). Although this doesn't prevent downloading each and all the parts of the picture, it does make it more tedious.

Of course, anyone with some moderate scripting skills and enough determination will be able to overcome those difficulties.

In essence, it's impossible to prevent people/cats/robots to download your pictures but it's possible to make it hard/annoying enough to make it not worth their while.

**Addendum**: To highlight what I and others have numerous times mentioned, it is impossible to completely prevent resources from being downloaded. There will **always** be a workaround. To be clear: **if you can see a picture, you can download it.**

To illustrate: while I can't condone such behavior, some individuals download movies from Netflix, Amazon et al. all the time. Even DRM mechanisms used by mega-corporations with virtually unlimited resources can't prevent a sufficiently determined individual from downloading content.

`<friendly sarcasm>`The best way I know to **almost** completely prevent someone from downloading pictures from a website is to host it on an [air-gapped](https://en.wikipedia.org/wiki/Air_gap_%28networking%29) server. However, accessing the website itself would prove rather difficult. `</friendly sarcasm>`

The best you can do is to make it just difficult or annoying enough to deter the average user.