Rétrécir / Zoomer / Mettre à l'échelle les images en mode image

20

Avec le mode doc-view d'Emacs, je peux facilement réduire / zoomer / etc les fichiers PDF, cependant, j'aimerais pouvoir faire la même chose avec les images. Actuellement, lorsque j'ouvre une image, je ne peux pas régler le niveau de zoom pour l'adapter au cadre. Je sais qu'il y a image-mode-fit-frame, cependant, cela n'aide pas lorsque l'image est plus grande que mon écran.

Existe-t-il un package ou un mode qui me permettra d'effectuer un zoom avant ou arrière sur une image?

Lee H
la source

Réponses:

15

Une telle fonctionnalité est fournie par les packages:

  • image-dired-thumbnail-mode

    Avec le point dans le tampon de vignettes, vous pouvez taper RET( image-dired-display-thumbnail-original-image) pour en afficher une version de taille dans une autre fenêtre. Cela dimensionne l'image pour l'adapter à la fenêtre.

    Il utilise la convertcommande ImageMagick .

    Vous pouvez également utiliser image-dired-external-viewerpour éviter le problème et afficher vos images dans une visionneuse d'images externe telle que feh.

  • eimp

    (add-hook 'image-mode-hook 'eimp-mode)
    

    Il utilise l' mogrifyutilitaire d'ImageMagick pour effectuer les transformations réelles.

    (kbd "+") 'eimp-increase-image-size
    (kbd "-") 'eimp-decrease-image-size
    (kbd "<") 'eimp-rotate-image-anticlockwise
    (kbd ">") 'eimp-rotate-image-clockwise
    (kbd "B +") 'eimp-blur-image
    (kbd "B -") 'eimp-sharpen-image
    (kbd "B E") 'eimp-emboss-image
    (kbd "B G") 'eimp-gaussian-blur-image
    (kbd "B R") 'eimp-radial-blur-image
    (kbd "C B +") 'eimp-increase-image-brightness
    (kbd "C B -") 'eimp-decrease-image-brightness
    (kbd "C C +") 'eimp-increase-image-contrast
    (kbd "C C -") 'eimp-decrease-image-contrast
    (kbd "F ^") 'eimp-flip-image
    (kbd "F >") 'eimp-flop-image
    (kbd "F <") 'eimp-flop-image
    (kbd "N") 'eimp-negate-image
    
    ; Commands most relevant to you:
    (kbd "S f") 'eimp-fit-image-to-window
    (kbd "S h") 'eimp-fit-image-height-to-window
    (kbd "S w") 'eimp-fit-image-width-to-window
    
    (kbd "<right>") 'eimp-roll-image-right
    (kbd "<left>") 'eimp-roll-image-left
    (kbd "<up>") 'eimp-roll-image-up
    (kbd "<down>") 'eimp-roll-image-down
    (kbd "<down-mouse-1>") 'eimp-mouse-resize-image
    (kbd "<S-down-mouse-1>") 'eimp-mouse-resize-image-preserve-aspect
    (kbd "C-c C-k") 'eimp-stop-all
    
  • eiv- Il utilise également le package ImageMagick qui devrait fournir mogrify.

    Liste complète des commandes:

    • eiv-fit-image-to-window- Redimensionner l'image à la taille actuelle de la fenêtre.
    • eiv-rotate-current-image - Faire pivoter l'image actuelle à 90 degrés.
    • eiv-dec-or-inc-image - Redimensionner l'image à la taille de la fenêtre actuelle.
    • eiv-diaporama - Lancer un diaporama sur l'arbre.
    • eiv-viewer- Le emacs-image-viewer. Permet de naviguer dans un arbre de dir et subdir.
kmicu
la source
5
Il faut noter que eimpmodifie le fichier. Cela ne fonctionne pas sur les images en lecture seule.
Kaushal Modi
6

Solution

J'ai utilisé le code source lisp/image-mode.elpour écrire ceci. L'appel de cette fonction dans n'importe quel tampon d'image la redimensionnera pour s'adapter à la largeur ou à la hauteur en fonction des rapports hauteur / largeur de l'image et de la fenêtre.

Vous avez besoin de ces 2 choses pour que cette fonction fonctionne:

  • Votre emacs doit avoir été compilé avec Imagemagick .
  • Par défaut, le libjpegchargeur est utilisé pour gérer les jpgimages. Le hack montré dans la partie suivante de cette réponse est utilisé pour forcer emacs à utiliser le imagemagickchargeur.
(defun modi / image-transform-fit-to-window ()
  "Redimensionnez l'image pour qu'elle s'adapte à la largeur ou à la hauteur en fonction des rapports entre l'image et la fenêtre.
Imagemagick est requis pour exécuter cette fonction. "
  (interactif)
  (let * ((img-size (image-display-size (image-get-display-property) t)))
          (largeur img (taille img de la voiture))
          (img-height (cdr img-size))
          (img-h / w-ratio (/ (float img-height) (float img-width))))
          (win-width (- (nth 2 (window-inside-pixel-bords)))
                        (nième 0 (fenêtre à l'intérieur des bords des pixels))))
          (win-height (- (nth 3 (window-inside-pixel-bords)))
                         (nième 1 (fenêtre à l'intérieur des bords des pixels))))
          (win-h / w-ratio (/ (float win-height) (float win-width)))))
    ;; Ajuster l'image en largeur si le rapport h / w de la fenêtre est> rapport h / w de l'image
    (si (> rapport gagnant-h / w rapport img-h / w))
        (image-transform-fit-to-width)
      ;; Sinon, ajustement en hauteur
      (image-transform-fit-to-height))))

Hack pour forcer emacs à utiliser imagemagickpour charger des images

Après avoir suivi les rapports de bogues emacs #18797, #10746et #10112, la solution suivante a fonctionné pour forcer Imagemagick à charger des images; mettez-le quelque part dans votre init.el:

Je l' ai forcé emacs à utiliser imagemagickuniquement pour les fichiers d' images familières moi: png, tiff, jpg/jpeget svg; les autres sont conservés par défaut. J'ai choisi d'autoriser gifl'ouverture des fichiers par le chargeur par défaut car emacs 24.4 a amélioré la prise en charge de la visualisation d'images multi-images. L'ensemble de l'expression rationnelle est extrait de lisp/image.el.

 (setq image-type-header-regexps
       `(
         ("\\`/[\t\n\r ]*\\*.*XPM.\\*/" . xpm)
         ("\\`P[1-6]\\\(?:\
              \\(?:\\(?:#[^\r\n]*[\r\n]\\)?[[:space:]]\\)+\
              \\(?:\\(?:#[^\r\n]*[\r\n]\\)?[0-9]\\)+\
              \\)\\{2\\}" . pbm)
         ("\\`GIF8[79]a" . gif)
         ;; ("\\`\x89PNG\r\n\x1a\n" . png) ;; Uncomment this (and comment the below line) to enable inline png images in org-mode
         ("\\`\x89PNG\r\n\x1a\n" . imagemagick) ; png
         ("\\`[\t\n\r ]*#define \\([a-z0-9_]+\\)_width [0-9]+\n\
              #define \\1_height [0-9]+\n\\(\
              #define \\1_x_hot [0-9]+\n\
              #define \\1_y_hot [0-9]+\n\\)?\
              static \\(unsigned \\)?char \\1_bits" . xbm)
         ;; ("\\`\\(?:MM\0\\*\\|II\\*\0\\)" . tiff)
         ("\\`\\(?:MM\0\\*\\|II\\*\0\\)" . imagemagick) ; tiff
         ("\\`[\t\n\r ]*%!PS" . postscript)
         ;; ("\\`\xff\xd8" . jpeg) ;; Uncomment this (and comment the below line) to enable inline jpg images in org-mode
         ("\\`\xff\xd8" . imagemagick)    ; jpeg
         ("\\`\377\330" . imagemagick)    ; jpeg
         (,(let* ((incomment-re "\\(?:[^-]\\|-[^-]\\)")
                  (comment-re (concat "\\(?:!--" incomment-re "*-->[ \t\r\n]*<\\)")))
             (concat "\\(?:<\\?xml[ \t\r\n]+[^>]*>\\)?[ \t\r\n]*<"
                     comment-re "*"
                     "\\(?:!DOCTYPE[ \t\r\n]+[^>]*>[ \t\r\n]*<[ \t\r\n]*" comment-re "*\\)?"
                     "[Ss][Vv][Gg]"))
          ;; . svg)  ;; Uncomment this (and comment the below line) to enable inline svg images in org-mode
          . imagemagick) ; svg
         ))

Inconvénient

  • Les types d'images choisis pour être chargés par imagemagickn'apparaîtront pas comme des images en ligne dans org-mode.

Les références

Kaushal Modi
la source
1

image-transform-set-scalepeut être ce que vous recherchez. Cependant, il nécessite qu'Emacs soit compilé avec le support d'Imagemagick.

Il y a aussi un commentaire image-transform-modedans image-mode.el"Pas encore implémenté".

dgtized
la source
Je vois Does Emacs use imagemagick? yesen courant ./configure. Il a donc compilé avec imagemagick. La transformation d'images fixes ne fonctionne pas pour moi. (Sur emacs 24,4 x86_64-unknown-linux-gnu) J'ai aussi ce qui suit dans config.log: | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1.
Kaushal Modi
0

Voici une solution qui vous permet de monter et descendre en utilisant les mêmes touches que celles utilisées pour la mise à l'échelle du texte, Cx C- = et Cx C--

(defun scale-image ()
  "Scale the image by the same factor specified by the text scaling."
  (image-transform-set-scale
   (expt text-scale-mode-step
         text-scale-mode-amount)))

(defun scale-image-register-hook ()
  "Register the image scaling hook."
  (add-hook 'text-scale-mode-hook 'scale-image))

(add-hook 'image-mode-hook 'scale-image-register-hook)
killdash9
la source