Jpg/Png to Webp Converter

Adi-webp. Install, activate, then Media → WebP Conversion. If your server can’t write WebP, a red notice tells you at the top rather than failing silently.
On upload, the JPEG or PNG is converted and the WebP becomes the attachment — so every thumbnail size WordPress generates is WebP too, not just the original. The source file stays on disk by default.
Quality is 82, which is where WebP is visually indistinguishable from the source on photographs while being roughly 25–35% smaller. Two notes on that, since you asked specifically about maintaining quality: push it to 90+ for artwork and flat graphics, where banding shows up in gradients long before it does in photos — relevant for your paintings and prints. And never set it to 100; WebP at 100 routinely produces files larger than the JPEG you started with.
The minimum-saving guard is the part I’d most want you to leave on. Some flat PNGs and already-optimised JPEGs come out bigger as WebP, and blindly converting those makes the site slower. If the gain is under 5%, the original is kept and the attempt is logged as skipped.
Existing library: three images per request, so it can’t time out on shared hosting, with a progress bar, a running log and a stop button. You can resume later. The Media list gets a WebP column showing converted / pending / skipped.
Back up uploads and the database before the bulk run. Converting changes every image URL from .jpg to .webp. With “Keep the original” ticked the old files stay put so existing links still resolve, but there’s no undo button in this plugin, and I’d rather say that plainly than have you discover it.
GIF, SVG and existing WebP are never touched. Animated PNGs are detected and skipped, since conversion would silently drop the animation. Transparency in ordinary PNGs is preserved.