Reducir / Zoom / Escalar imágenes en modo imagen


20

Con el modo de visualización de documentos de Emacs, puedo reducir / ampliar / etc fácilmente los archivos PDF, sin embargo, me gustaría poder hacer lo mismo con las imágenes. Actualmente, cuando abro una imagen, no puedo ajustar el nivel de zoom para que se ajuste al marco. Sé que image-mode-fit-frame, sin embargo, no ayuda cuando la imagen es más grande que mi pantalla.

¿Hay algún paquete o modo que me permita acercar y alejar una imagen?

Respuestas:


15

Dicha funcionalidad es proporcionada por paquetes:

  • image-dired-thumbnail-mode

    Con el punto en el búfer de miniaturas, puede escribir RET( image-dired-display-thumbnail-original-image) para mostrar una versión de tamaño en otra ventana. Esto dimensiona la imagen para que se ajuste a la ventana.

    Utiliza el convertcomando de ImageMagick .

    También puede usar image-dired-external-viewerpara evitar el problema y mostrar sus imágenes en un visor de imágenes externo como feh.

  • eimp

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

    Utiliza la mogrifyutilidad de ImageMagick para hacer las transformaciones reales.

    (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- También utiliza el paquete ImageMagick que debería proporcionar mogrify.

    Lista completa de comandos:

    • eiv-fit-image-to-window- Cambiar el tamaño de la imagen al tamaño de la ventana actual.
    • eiv-rotate-current-image - Rotar la imagen actual a 90 grados.
    • eiv-dec-or-inc-image - Cambiar el tamaño de la imagen al tamaño de la ventana actual.
    • eiv-diaporama - Comienza un diaporama en el árbol.
    • eiv-viewer- El emacs-image-viewer. Permite navegar en un árbol de dir y subdir.

55
Hay que tener en cuenta que eimpmodifica el archivo. No funciona en imágenes de solo lectura.
Kaushal Modi

6

Solución

Usé el código fuente lisp/image-mode.elpara escribir esto. Al llamar a esta función en cualquier búfer de imagen, se cambiará su tamaño para que se ajuste al ancho o la altura, dependiendo de la imagen y la relación altura / ancho de la ventana.

Necesita estas 2 cosas para que esta función funcione:

  • Su emacs necesita haber sido compilado con Imagemagick .
  • Por defecto, el libjpegcargador se utiliza para manejar jpgimágenes. El truco que se muestra en la siguiente parte de esta respuesta se usa para obligar a emacs a usar el imagemagickcargador.
(defun modi / image-transform-fit-to-window ()
  "Cambia el tamaño de la imagen para que se ajuste al ancho o alto según la imagen y las relaciones de ventana.
Se requiere Imagemagick para ejecutar esta función ".
  (interactivo)
  (let * ((img-size (image-display-size (image-get-display-property) t))
          (ancho de imagen (tamaño de imagen del automóvil))
          (img-height (cdr img-size))
          (relación img-h / w (/ (altura flotante img) (ancho flotante img)))
          (win-width (- (enésimo 2 (ventana-dentro-píxeles-bordes))
                        (enésimo 0 (ventana-dentro-píxeles-bordes))))
          (win-height (- (enésimo 3 (ventana-dentro-píxeles-bordes))
                         (enésimo 1 (ventana-dentro-píxeles-bordes))))
          (relación win-h / w (/ (altura de ganancia flotante) (ancho de ganancia flotante))))
    ;; Ajuste la imagen por ancho si la relación h / w de la ventana es> relación h / w de la imagen
    (if (> win-h / w-ratio img-h / w-ratio)
        (imagen-transformar-ajustar-a-ancho)
      ;; Otra forma de altura
      (imagen-transformar-ajustar-a-altura))))

Hack para forzar el uso imagemagickde emacs para cargar imágenes

Después de seguir a través de los informes de errores emacs #18797, #10746y #10112, la siguiente solución trabajó para forzar Imagemagick a cargar imágenes; ponlo en algún lugar de tu init.el:

Me he obligado a emacs uso imagemagicksólo para los archivos de imagen familiar para mí: png, tiff, jpg/jpegy svg; El resto se mantiene por defecto. Elegí permitir gifque el cargador predeterminado abra los archivos ya que emacs 24.4 ha mejorado el soporte para ver imágenes de múltiples cuadros. Se toma toda la expresión regular 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
         ))

Retirarse

  • Los tipos de imagen elegidos para cargar imagemagickno se mostrarán como imágenes en línea en org-mode.

Referencias


1

image-transform-set-scalepuede ser lo que buscas. Sin embargo, requiere que Emacs se compile con el soporte de Imagemagick.

También hay un comentario image-transform-modeen la image-mode.eletiqueta "Aún no implementado".


Ya veo Does Emacs use imagemagick? yescuando corro ./configure. Así que compiló con imagemagick. La transformación de imagen fija no funciona para mí. (En Emacs 24.4 x86_64-unknown-linux-gnu) también tiene lo siguiente en config.log: | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1.
Kaushal Modi

0

Aquí hay una solución que le permite escalar hacia arriba y hacia abajo usando las mismas teclas que se usan para la escala de texto, Cx C- = y 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.