Reduzir / ampliar / redimensionar imagens no modo de imagem

20

Com o modo de visualização de documentos do Emacs, eu posso facilmente reduzir / ampliar / etc PDFs, no entanto, gostaria de poder fazer o mesmo com as imagens. Atualmente, quando abro uma imagem, não consigo ajustar o nível de zoom para ajustá-lo ao quadro. Sei que image-mode-fit-frame, no entanto, não ajuda quando a imagem é maior que minha tela.

Existe um pacote ou modo que me permita ampliar e reduzir uma imagem?

Lee H
fonte

Respostas:

15

Essa funcionalidade é fornecida pelos pacotes:

  • image-dired-thumbnail-mode

    Com o ponto no buffer de miniaturas, você pode digitar RET( image-dired-display-thumbnail-original-image) para exibir uma versão dimensionada dele em outra janela. Isso dimensiona a imagem para caber na janela.

    Ele usa o convertcomando do ImageMagick .

    Você também pode usar image-dired-external-viewerpara evitar o problema e exibir suas imagens em um visualizador de imagens externo, como feh.

  • eimp

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

    Ele usa o mogrifyutilitário ImageMagick para fazer as transformações reais.

    (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- Ele também usa o pacote ImageMagick que deve fornecer mogrify.

    Lista de comandos completa:

    • eiv-fit-image-to-window- Redimensione a imagem para o tamanho atual da janela.
    • eiv-rotate-current-image - Gire a imagem atual em 90 graus.
    • eiv-dec-or-inc-image - Redimensione a imagem para o tamanho atual da janela.
    • eiv-diaporama - Inicie um diaporama na árvore.
    • eiv-viewer- o emacs-image-viewer. Permite navegar em uma árvore de dir e subdir.
kmicu
fonte
5
Deve-se notar que eimpmodifica o arquivo. Não funciona em imagens somente leitura.
precisa
6

Solução

Eu usei o código fonte lisp/image-mode.elpara escrever isso. A chamada dessa função em qualquer buffer de imagem redimensionará para caber na largura ou altura, dependendo das proporções de altura e largura da imagem e da janela.

Você precisa destas duas coisas para que esta função funcione:

  • Seu emacs precisa ter sido compilado com o Imagemagick .
  • Por padrão, o libjpegcarregador é usado para manipular jpgimagens. O hack mostrado na próxima parte desta resposta é usado para forçar o emacs a usar o imagemagickloader.
(desfazer modi / transformar-imagem-ajustar-à-janela ()
  "Redimensione a imagem para caber na largura ou altura com base nas proporções de imagem e janela.
O Imagemagick é necessário para executar esta função. "
  (interativo)
  (let * ((img-size (tamanho da exibição da imagem (propriedade da imagem))))
          (largura img (tamanho img do carro))
          (img-height (cdr img-size))
          (img-h / w-ratio (/ (float img-height) (float img-width)))
          (largura da vitória (- (enésimo 2 (bordas da janela dentro dos pixels)))
                        (enésimo 0 (janela dentro das bordas dos pixels))))
          (win-height (- (enésimo 3 (bordas da janela dentro dos pixels)))
                         (enésimo 1 (janela dentro das bordas dos pixels))))
          (win-h / w-ratio (/ (altura de ganho flutuante) (largura de ganho flutuante))))
    ;; Ajustar a imagem pela largura se a proporção h / w da janela for> proporção h / w da imagem
    (se (> proporção win-h / w img-h / w))
        (transformação da imagem ajustada à largura)
      ;; Outro ajuste pela altura
      (transformação de imagem ajustada à altura))))

Corte para forçar o uso do emacs imagemagickpara carregar imagens

Após seguir os relatórios de erros do emacs #18797, #10746e #10112a solução a seguir trabalhou para forçar o Imagemagick a carregar imagens; coloque em algum lugar do seu init.el:

Eu forcei Emacs para uso imagemagicksomente para os arquivos de imagem familiar para mim: png, tiff, jpg/jpege svg; o restante é mantido como padrão. Optei por permitir que os gifarquivos sejam abertos pelo carregador padrão, pois o emacs 24.4 aprimorou o suporte para a visualização de imagens com vários quadros. Todo o regexp é retirado 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
         ))

Recua

  • Os tipos de imagem escolhidos para serem carregados imagemagicknão serão exibidos como imagens embutidas org-mode.

Referências

Kaushal Modi
fonte
1

image-transform-set-scalepode ser o que você está procurando. No entanto, requer que o Emacs seja compilado com o suporte do Imagemagick.

Há também um comentário image-transform-modeno image-mode.elrotulado "Ainda não implementado".

dgtized
fonte
Eu vejo Does Emacs use imagemagick? yesquando estou correndo ./configure. Por isso, compilou com o imagemagick. A transformação de imagens estáticas não funciona para mim. (On emacs 24.4 x86_64-unknown-linux-gnu) Eu também tenho o seguinte em config.log: | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1.
precisa
0

Aqui está uma solução que permite aumentar e diminuir o tamanho usando as mesmas teclas usadas na escala de texto, Cx C- = e 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
fonte