在图像模式下缩小/缩放/缩放图像


20

使用Emacs的doc-view-mode,我可以轻松地缩小/缩放/等PDF,但是,我希望能够对图像执行相同的操作。当前,当我打开图像时,无法调整缩放水平以使其适合框架。我知道有image-mode-fit-frame,但是,当图像大于我的屏幕时,它无济于事。

是否有可让我放大和缩小图像的程序包或模式?

Answers:


15

此类功能由软件包提供:

  • image-dired-thumbnail-mode

    将点指向缩略图缓冲区,您可以键入RETimage-dired-display-thumbnail-original-image)在另一个窗口中显示其大小版本。这将调整图像大小以适合窗口。

    它使用ImageMagick的convert命令。

    您也可以使用image-dired-external-viewer以避免问题,并在诸如的外部图像查看器中显示图像feh

  • eimp

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

    它使用mogrifyImageMagick 的实用程序进行实际的转换。

    (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-它还使用应提供的ImageMagick软件包mogrify

    完整的命令列表:

    • eiv-fit-image-to-window-将图像调整为当前窗口大小。
    • eiv-rotate-current-image -将当前图像旋转90度。
    • eiv-dec-or-inc-image -将图像调整为当前窗口大小。
    • eiv-diaporama -在树上开始渗出。
    • eiv-viewer- emacs-image-viewer。允许在dir和subdir的树中导航。

5
应该注意eimp修改文件。它不适用于只读图像。
2014年

6

我使用了源代码lisp/image-mode.el来编写它。在任何图像缓冲区中调用此函数都会调整其大小以适合宽度或高度,具体取决于图像和窗口的高/宽比。

您确实需要以下两项才能使此功能正常工作:

  • 您的emacs需要使用Imagemagick进行编译。
  • 默认情况下,libjpeg加载程序用于处理jpg图像。此答案下一部分显示的hack用来强制emacs使用imagemagick加载程序。
(defun modi / image-transform-fit-to-window()
  “根据图像和窗口比率调整图像大小以适合宽度或高度。
必须使用Imagemagick才能运行此功能。”
  (互动)
  (let *((img-size(图像显示尺寸(image-get-display-property)t))
          (img-width(汽车img-size))
          (img-height(cdr img-size))
          (img-h / w-ratio(/(float img-height)(float img-width)))
          (win-width(-(nth 2(window-inside-pixel-edges)))
                        (第0个(窗口内像素边缘)))
          (win-height(-(nth 3(window-inside-pixel-edges)))
                         (第1个(窗口内像素边缘)))
          (win-h / w-ratio(/(float win-height)(float win-width))))
    ;; 如果窗口的纵横比>图像的纵横比,则按宽度拟合图像
    (如果(> win-h / w-ratio img-h / w-ratio)
        (图像转换为适合宽度)
      ;; 其他适合身高
      (图像转换为适合高度)))

黑客强制emacs imagemagick用于加载图像

通过emacs的bug报告以下后#18797#10746#10112,以下解决方案为迫使ImageMagick的负载图像; 将它放在您的某处init.el

我已经迫使Emacs在使用imagemagick只为图像文件耳熟:pngtiffjpg/jpegsvg; 其余的保留为默认值。我选择允许gif默认加载程序打开文件,因为emacs 24.4改进了对查看多帧图像的支持。整个正则表达式取自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
         ))

退税

  • 选择要加载的图像类型imagemagick不会在中显示为嵌入式图像org-mode

参考文献


1

image-transform-set-scale可能就是您要寻找的。但是,它要求Emacs在Imagemagick支持下进行编译。

image-transform-modeimage-mode.el标有“尚未实施” 的注释中也有注释。


Does Emacs use imagemagick? yes跑步的时候看到了./configure。因此它确实使用imagemagick进行编译。静止图像变换对我不起作用。(在Emacs的24.4 x86_64的未知-Linux的GNU)我也有以下config.log| #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1
2014年

0

这是一个解决方案,可让您使用与文本缩放,Cx C- =和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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.