Zmniejsz / powiększ / skaluj obrazy w trybie obrazu

20

W trybie przeglądania dokumentów Emacsa mogę łatwo zmniejszać / powiększać / itp. Pliki PDF, jednak chciałbym móc robić to samo z obrazami. Obecnie po otwarciu obrazu nie mogę dostosować poziomu powiększenia, aby dopasować go do ramki. Wiem image-mode-fit-framejednak, że to nie pomaga, gdy obraz jest większy niż mój ekran.

Czy istnieje pakiet lub tryb, który pozwoli mi powiększać i pomniejszać obraz?

Lee H.
źródło

Odpowiedzi:

15

Taką funkcjonalność zapewniają pakiety:

  • image-dired-thumbnail-mode

    Z punktem w buforze miniatur, możesz wpisać RET( image-dired-display-thumbnail-original-image), aby wyświetlić jego wersję w innym oknie. To dopasowuje rozmiar obrazu do okna.

    Używa convertpolecenia ImageMagick .

    Możesz także użyć, image-dired-external-vieweraby uniknąć problemu i wyświetlić obrazy w zewnętrznej przeglądarce obrazów, takiej jak feh.

  • eimp

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

    Korzysta z mogrifynarzędzia ImageMagick do faktycznych przekształceń.

    (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- Korzysta również z pakietu ImageMagick, który powinien zapewniać mogrify.

    Pełna lista poleceń:

    • eiv-fit-image-to-window- Zmień rozmiar obrazu do bieżącego rozmiaru okna.
    • eiv-rotate-current-image - Obróć bieżący obraz o 90 stopni.
    • eiv-dec-or-inc-image - Zmień rozmiar obrazu do bieżącego rozmiaru okna.
    • eiv-diaporama - Uruchom diaporama na drzewie.
    • eiv-viewer- The emacs-image-viewer. Umożliwia nawigację w drzewie katalogów i katalogów.
kmicu
źródło
5
Należy zauważyć, że eimpmodyfikuje plik. Nie działa na obrazach tylko do odczytu.
Kaushal Modi
6

Rozwiązanie

Użyłem kodu źródłowego, lisp/image-mode.elaby to napisać. Wywołanie tej funkcji w dowolnym buforze obrazu spowoduje zmianę jej rozmiaru w celu dopasowania do szerokości lub wysokości w zależności od proporcji obrazu do okna i wysokości.

Aby ta funkcja działała, potrzebujesz następujących 2 rzeczy:

  • Twój emacs musi zostać skompilowany z Imagemagick .
  • Domyślnie libjpegmoduł ładujący służy do obsługi jpgobrazów. Hack pokazany w następnej części tej odpowiedzi służy do zmuszenia emacsa do użycia imagemagickmodułu ładującego.
(defun modi / image-transform-fit-to-window ()
  „Zmień rozmiar obrazu, aby dopasować szerokość lub wysokość na podstawie proporcji obrazu i okna.
Imagemagick jest wymagany do uruchomienia tej funkcji. ”
  (interaktywny)
  (let * ((img-size (image-display-size (image-get-display-property) t))
          (img-szerokość (samochód img-rozmiar))
          (img-height (cdr img-size))
          (img-h / w-ratio (/ (float img-height) (float img-width)))
          (win-width (- (nth 2 (okno-wewnątrz-pikseli-krawędzi))
                        (nth 0 (okno-wewnątrz-pikseli-krawędzi))))
          (win-height (- (nth 3 (okno-wewnątrz-pikseli-krawędzi))
                         (nth 1 (okno-wewnątrz-pikseli-krawędzi))))
          (stosunek wyg / h do ((float wygrana-wysokość) (float wygrana-szerokość))))
    ;; Dopasuj obraz do szerokości, jeśli stosunek h / w okna wynosi> stosunek h / w obrazu
    (if (> stosunek wyg / h / w img-h / w)
        (transformacja obrazu-dopasowanie do szerokości)
      ;; W przeciwnym razie dopasowanie wysokości
      (image-transform-fit-to-height))))

Hack, aby zmusić emacsa do użycia imagemagickdo ładowania zdjęć

Po wykonaniu przez emacs raportów błędów #18797, #10746a #10112następujące rozwiązanie pracował dla zmuszając ImageMagick do obrazów obciążenia; umieść to gdzieś w swoim init.el:

I zmusiły emacsowi użytku imagemagicktylko dla plików graficznych znajomy do mnie: png, tiff, jpg/jpegi svg; reszta jest zachowana jako domyślna. Zdecydowałem się zezwolić gifna otwieranie plików przez domyślny moduł ładujący, ponieważ emacs 24.4 poprawił obsługę wyświetlania obrazów wielu klatek. Całe wyrażenie regularne pochodzi z 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
         ))

Wada

  • Typy obrazów wybrane do załadowania imagemagicknie będą wyświetlane jako obrazy wbudowane w org-mode.

Bibliografia

Kaushal Modi
źródło
1

image-transform-set-scalemoże być tym, czego szukasz. Wymaga to jednak skompilowania Emacsa z obsługą Imagemagick.

Istnieje również komentarz image-transform-modew image-mode.eletykiecie „Jeszcze nie zaimplementowano”.

zdeterminowany
źródło
Widzę Does Emacs use imagemagick? yespodczas biegania ./configure. Więc skompilował się z imagemagick. Nadal przekształcanie obrazu nie działa dla mnie. (Na emacs 24.4 x86_64-unknown-linux-gnu) Mam także następujące w config.log: | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1.
Kaushal Modi
0

Oto rozwiązanie, które umożliwia skalowanie w górę i w dół przy użyciu tych samych klawiszy, które są używane do skalowania tekstu, Cx C- = i 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
źródło