Bilder im Bildmodus verkleinern / zoomen / skalieren

20

Mit dem Doc-View-Modus von Emacs kann ich PDFs leicht verkleinern / zoomen / etc. Wenn ich ein Bild öffne, kann ich die Zoomstufe derzeit nicht anpassen, um sie an den Rahmen anzupassen. Ich weiß image-mode-fit-frame, dass es jedoch nicht hilft, wenn das Bild größer als mein Bildschirm ist.

Gibt es ein Paket oder einen Modus, mit dem ich ein Bild vergrößern und verkleinern kann?

Lee H
quelle

Antworten:

15

Diese Funktionalität wird durch Pakete bereitgestellt:

  • image-dired-thumbnail-mode

    Mit einem Punkt im Pufferspeicher für Miniaturansichten können Sie RET( image-dired-display-thumbnail-original-image) eingeben, um eine Version davon in einem anderen Fenster anzuzeigen. Dadurch wird das Bild an das Fenster angepasst.

    Es verwendet den convertBefehl von ImageMagick .

    Sie können image-dired-external-viewerdas Problem auch umgehen und Ihre Bilder in einem externen Bildbetrachter anzeigen, z feh.

  • eimp

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

    Es verwendet das mogrifyDienstprogramm von ImageMagick, um die eigentlichen Transformationen durchzuführen.

    (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- Es wird auch das ImageMagick-Paket verwendet, das bereitgestellt werden sollte mogrify.

    Komplette Befehlsliste:

    • eiv-fit-image-to-window- Ändere die Größe des Bildes auf die aktuelle Fenstergröße.
    • eiv-rotate-current-image - Das aktuelle Bild um 90 Grad drehen.
    • eiv-dec-or-inc-image - Bildgröße auf aktuelle Fenstergröße ändern.
    • eiv-diaporama - Starten Sie ein Diaporama am Baum.
    • eiv-viewer- Die emacs-image-viewer. Ermöglicht das Navigieren in einem Baum von dir und subdir.
kmicu
quelle
5
Man sollte beachten, dass sich eimpdie Datei ändert. Bei schreibgeschützten Bildern funktioniert dies nicht.
Kaushal Modi
6

Lösung

Ich habe den Quellcode verwendet lisp/image-mode.el, um dies aufzuschreiben. Wenn Sie diese Funktion in einem Bildpuffer aufrufen, wird die Größe an die Breite oder Höhe angepasst, je nach Verhältnis von Bild und Fensterhöhe / -breite.

Sie benötigen diese 2 Dinge, damit diese Funktion funktioniert:

  • Ihr Emacs muss mit Imagemagick kompiliert worden sein .
  • Standardmäßig wird der libjpegLoader zum Verarbeiten von jpgBildern verwendet. Der im nächsten Teil dieser Antwort gezeigte Hack wird verwendet, um Emacs zur Verwendung des Loaders zu zwingen imagemagick.
(defun modi / image-transform-fit-to-window ()
  "Passen Sie die Größe des Bildes an die Breite oder Höhe an, die auf den Bild - und Fensterverhältnissen basieren.
Zum Ausführen dieser Funktion ist Imagemagick erforderlich. "
  (interaktiv)
  (let * ((img-size (Bildanzeigegröße (image-get-display-property) t))
          (Bildbreite (Auto Bildgröße))
          (img-height (cdr img-size))
          (img-h / w-Verhältnis (/ (float img-height) (float img-width))
          (win-width (- (nth 2 (Fenster-innerhalb-Pixel-Kanten))
                        (n-te 0 (Fenster-innerhalb-Pixel-Kanten)))
          (win-height (- (nth 3 (Fenster-innerhalb-Pixel-Kanten))
                         (n-te 1 (Fenster-innerhalb-Pixel-Kanten)))
          (win-h / w-Verhältnis (/ (float win-height) (float win-width)))
    ;; Passen Sie das Bild nach Breite an, wenn das H / W-Verhältnis des Fensters> H / W-Verhältnis des Bildes ist
    (if (> win-h / w-verhältnis img-h / w-verhältnis)
        (Bildtransformationsanpassung an Breite)
      ;; Ansonsten fit von der Höhe
      (Bild-Transformation-Anpassung-an-Höhe)))

Hack um Emacs zum imagemagickLaden von Bildern zu zwingen

Nachdem Sie durch die Emacs - Fehlerberichte #18797, #10746und #10112arbeitete die folgende Lösung ImageMagick Lasten Bilder zu zwingen; steck es irgendwo in dein init.el:

Ich habe Emacs Verwendung gezwungen imagemagicknur für die Bilddateien vertraut mir: png, tiff, jpg/jpegund svg; Der Rest wird standardmäßig beibehalten. Ich habe mich dafür entschieden, das gifÖffnen von Dateien mit dem Standard-Loader zuzulassen , da Emacs 24.4 die Unterstützung für die Anzeige von Bildern mit mehreren Frames verbessert hat. Der gesamte reguläre Ausdruck stammt von 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
         ))

Nachteil

  • Bildtypen, die zum Laden ausgewählt wurden, werden imagemagickin nicht als Inline-Bilder angezeigt org-mode.

Verweise

Kaushal Modi
quelle
1

image-transform-set-scaleVielleicht ist es das, wonach Sie suchen. Allerdings muss Emacs mit Unterstützung von Imagemagick kompiliert werden.

Es gibt auch einen Kommentar gesetzt image-transform-modein der image-mode.elAufschrift „Noch nicht implementiert.“

dgtized
quelle
Ich sehe Does Emacs use imagemagick? yesbeim Laufen ./configure. Also hat es mit imagemagick kompiliert. Die Standbildtransformation funktioniert bei mir nicht. (On Emacs 24.4 x86_64-unknown-linux-gnu) Ich habe auch die folgenden in config.log: | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1.
Kaushal Modi
0

Hier ist eine Lösung, mit der Sie mit denselben Tasten, die für die Textskalierung verwendet werden, hoch- und runterskalieren können: Cx C- = und 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
quelle