Зменшити / Збільшити / Масштабувати зображення в режимі зображення


20

У режимі doc-view Emacs я легко можу скорочувати / масштабувати / тощо 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- The emacs-image-viewer. Дозволяє орієнтуватися в дереві dir та subdir.

5
Слід зазначити, що eimpфайл модифікує. Він не працює на зображення, доступні лише для читання.
Каушал Моді

6

Рішення

Я використовував вихідний код, lisp/image-mode.elщоб написати це. Виклик цієї функції в будь-якому буфері зображення дозволить змінити її розмір відповідно до ширини або висоти залежно від співвідношення зображення та висоти вікна / ширини зображення.

Для роботи цієї функції вам потрібні ці 2 речі:

  • Ваші emacs повинні бути складені за допомогою Imagemagick .
  • За замовчуванням libjpegзавантажувач використовується для обробки jpgзображень. Хак, показаний у наступній частині цієї відповіді, використовується для того, щоб змусити emacs використовувати imagemagickзавантажувач.
(defun modi / image-transform-fit-to-window ()
  Msgstr "Змініть розмір зображення відповідно до ширини чи висоти на основі співвідношення зображень та вікон.
Для запуску цієї функції потрібен Imagemagick. "
  (інтерактивний)
  (нехай * ((img-size (image-display-size (image-get-display-property) t))
          (img-width (автомобіль img-size))
          (img-height (cdr img-size))
          (коефіцієнт img-h / w (/ (float img-height) (float img-width)))
          (win-width (- (nth 2 (вікно-всередині-пікселя))
                        (nth 0 (краю вікна-всередині пікселя))))
          (win-height (- (nth 3 (вікно-всередині-пікселя))
                         (nth 1 (вікно-всередині-пікселя))))
          (співвідношення win-h / w (/ (float win-height) (float win-width))))
    ;; Підібрати зображення по ширині, якщо співвідношення h / w вікна> співвідношення h / w зображення
    (якщо (> співвідношення 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помічених «ще не реалізовано.»


Бачу, 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.