Уменьшить / увеличить / масштабировать изображения в режиме изображения

20

С помощью режима Emacs doc-view-mode я могу легко сжимать / масштабировать и т. Д. PDF-файлы, однако я бы хотел сделать то же самое с изображениями. В настоящее время, когда я открываю изображение, я не могу отрегулировать уровень масштабирования, чтобы подогнать его под кадр. Я знаю, что image-mode-fit-frame, однако, это не помогает, когда изображение больше, чем мой экран.

Есть ли пакет или режим, который позволит мне увеличивать и уменьшать изображение?

Ли Х
источник

Ответы:

15

Такая функциональность обеспечивается пакетами:

  • image-dired-thumbnail-mode

    С точкой в ​​буфере миниатюр вы можете набрать RET( image-dired-display-thumbnail-original-image), чтобы отобразить ее уменьшенную версию в другом окне. Это размер изображения в соответствии с окном.

    Он использует convertкоманду ImageMagick .

    Вы также можете использовать, image-dired-external-viewerчтобы избежать проблемы и отображать ваши изображения во внешнем средстве просмотра изображений, например feh.

  • eimp

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

    Он использует mogrifyутилиту из ImageMagick для выполнения реальных преобразований.

    (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.
kmicu
источник
5
Следует отметить, что eimpизменяет файл. Это не работает на изображениях только для чтения.
Каушал Моди
6

Решение

Я использовал исходный код, lisp/image-mode.elчтобы написать это. Вызов этой функции в любом буфере изображения изменит его размер, чтобы он соответствовал ширине или высоте в зависимости от отношения изображения и высоты окна к ширине.

Вам нужны эти 2 вещи, чтобы эта функция работала:

  • Ваш emacs должен быть скомпилирован с Imagemagick .
  • По умолчанию libjpegзагрузчик используется для обработки jpgизображений. Взлом, показанный в следующей части этого ответа, используется, чтобы заставить emacs использовать imagemagickзагрузчик.
(defun modi / image-transform-fit-to-window ()
  Msgstr "Измените размер изображения, чтобы соответствовать ширине или высоте на основе изображения и соотношения окон.
Imagemagick требуется для запуска этой функции. "
  (Интерактивный)
  (let * ((img-size (image-display-size (image-get-display-property) t))
          (img-width (автомобиль img-size))
          (img-height (cdr img-size))
          (отношение img-h / w (/ (высота плавающего изображения) (ширина плавающего изображения)))
          (win-width (- (nth 2 (window-inside-pixel-edge))
                        (nth 0 (окно-внутри-края-пикселя))))
          (win-height (- (nth 3 (window-inside-pixel-edge))
                         (nth 1 (window-inside-pixel-edge))))
          (коэффициент выигрыша / ширины (/ (высота выигрыша с плавающей запятой) (ширина выигрыша с плавающей запятой))))
    ;; Подогнать изображение по ширине, если соотношение ч / б окна> ч / ш изображения
    (если (> отношение win-h / w img-h / w)
        (Изображение-преобразование-прилегание к ширине)
      ;; Остальное подгонка по высоте
      (Изображение-преобразование-прилегание к высоте))))

Взломать, чтобы заставить Emacs использовать imagemagickдля загрузки изображений

После ознакомления с отчетами об ошибках emacs #18797, #10746и #10112следующее решение работало, чтобы заставить Imagemagick загружать изображения; поместите это где-нибудь в своем init.el:

Я вынужден Emacs для использования imagemagickтолько для графических файлов мне знакомо: png, tiff, jpg/jpegи svg; остальные остаются по умолчанию. Я решил разрешить 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-modeв image-mode.elпомеченных «еще не реализовано.»

dgtized
источник
Я вижу, Does Emacs use imagemagick? yesкогда работает ./configure. Так что это скомпилировано с imagemagick. Преобразование неподвижного изображения не работает для меня. (На Emacs 24,4 x86_64-неизвестно-Linux-гну) У меня также есть следующее config.log: | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1.
Каушал Моди
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)
killdash9
источник