ement.el
                                
                                
                                
                                    ement.el copied to clipboard
                            
                            
                            
                        User-specified percentage image scaling
I've just tried this and it seems to work.
When using M-RET or <mouse-1> on an image you can either supply a numeric prefix arg as a scale percentage, or with C-u it will prompt you for the percentage.
The last-prefix-arg bit for the mouse-driven command was a hunch that seems to be correct, but I've not gone digging to find out exactly why that happens (my guess is that it's because there are two mouse events when you click-and-release, with <mouse-1> following from <down-mouse-1>).
modified   ement-room.el
@@ -4935,14 +4935,19 @@ ement-room-image-scale-mouse
   (let* ((pos (event-start event))
          (window (posn-window pos)))
     (with-selected-window window
-      (ement-room-image-scale (posn-point pos)))))
+      ;; Any prefix arg has been demoted to `last-prefix-arg' by this point.
+      (ement-room-image-scale (posn-point pos) last-prefix-arg))))
 
-(defun ement-room-image-scale (pos)
+(defun ement-room-image-scale (pos &optional scale)
   "Toggle scale of image at POS.
 Scale image to fit within the window's body.  If image is already
 fit to the window, reduce its max-height to 10% of the window's
-height."
-  (interactive "d")
+height.
+
+With a prefix argument, scale the image to the specified
+percentage of its actual size (if numeric), or prompt for a
+percentage (if not numeric)."
+  (interactive "d\nP")
   (pcase-let* ((image (get-text-property pos 'display))
                (window-width (window-body-width nil t))
                (window-height (window-body-height nil t))
@@ -4951,14 +4956,24 @@ ement-room-image-scale
                (new-height (if (= window-height (or (image-property image :max-height) -1))
                                (/ window-height 10)
                              window-height)))
-    (when (fboundp 'imagemagick-types)
-      ;; Only do this when ImageMagick is supported.
-      ;; FIXME: When requiring Emacs 27+, remove this (I guess?).
-      (setf (image-property image :type) 'imagemagick))
-    ;; Set :scale to nil since image scaling commands might have changed it.
-    (setf (image-property image :scale) nil
-          (image-property image :max-width) window-width
-          (image-property image :max-height) new-height)))
+    (if scale
+        (let ((scale (if (consp scale)
+                         (read-number "Scale (% of original): " 100
+                                      'read-number-history)
+                       scale)))
+          (unless (cl-plusp scale)
+            (error "Not a positive number: %s" scale))
+          (setf (image-property image :scale) (/ scale 100.0)
+                (image-property image :max-width) nil
+                (image-property image :max-height) nil))
+      (when (fboundp 'imagemagick-types)
+        ;; Only do this when ImageMagick is supported.
+        ;; FIXME: When requiring Emacs 27+, remove this (I guess?).
+        (setf (image-property image :type) 'imagemagick))
+      ;; Set :scale to nil since image scaling commands might have changed it.
+      (setf (image-property image :scale) nil
+            (image-property image :max-width) window-width
+            (image-property image :max-height) new-height))))
(Edit: In hindsight, the 'imagemagick' test should be evaluated outside of the if form, as it would be relevant in both cases.)