OK. So after some trial and error, here's the function I wanted:
(defun my-show-image-in-minibuffer (filename)
(let* ((img (create-image filename))
(y (floor (cdr (image-size img)))))
(with-current-buffer (window-buffer (minibuffer-window))
(setq resize-mini-windows 'grow-only)
(setq resize-mini-windows nil)
(delete-minibuffer-contents)
(window-resize (minibuffer-window) y)
(insert-image img))
(clear-this-command-keys t)
(read-event)
(with-current-buffer (window-buffer (minibuffer-window))
(delete-minibuffer-contents)
(window-resize (minibuffer-window) (- 0 y))
(setq resize-mini-windows 'grow-only))
(image-flush img)
(setq unread-command-events (list last-input-event))))
Additionally, after any key is pressed, it deletes the image and returns the minibuffer to its normal size.