ย่อ / ขยาย / ย่อขนาดภาพในโหมดรูปภาพ


20

ด้วย doc-view-mode ของ Emacs ฉันสามารถย่อ / ขยาย / ฯลฯ PDF ได้อย่างง่ายดายอย่างไรก็ตามฉันต้องการทำสิ่งเดียวกันกับรูปภาพ ขณะนี้เมื่อฉันเปิดภาพฉันไม่สามารถปรับระดับการซูมเพื่อให้พอดีกับเฟรม ฉันรู้ว่ามีimage-mode-fit-frameแต่มันไม่ได้ช่วยเมื่อภาพมีขนาดใหญ่กว่าหน้าจอของฉัน

มีแพ็คเกจหรือโหมดที่จะอนุญาตให้ฉันซูมเข้าหรือออกภาพหรือไม่?

คำตอบ:


15

ฟังก์ชั่นดังกล่าวได้รับการพิสูจน์โดยแพ็คเกจ:

  • image-dired-thumbnail-mode

    ด้วยจุดในบัฟเฟอร์ภาพขนาดเล็กคุณสามารถพิมพ์RET( image-dired-display-thumbnail-original-image) เพื่อแสดงเวอร์ชันขนาดใหญ่ในหน้าต่างอื่น ขนาดนี้ปรับรูปภาพให้พอดีกับหน้าต่าง

    มันใช้convertคำสั่งของ ImageMagick

    นอกจากนี้คุณยังสามารถใช้เพื่อหลีกเลี่ยงปัญหาที่เกิดขึ้นและแสดงภาพของคุณในภาพภายนอกของผู้ชมเช่นimage-dired-external-viewerfeh

  • 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 - เริ่ม diaporama บนต้นไม้
    • eiv-viewer- emacs-image-viewerเดอะ อนุญาตให้นำทางในต้นไม้ dir และ subdir

5
หนึ่งควรทราบว่าการeimpปรับเปลี่ยนไฟล์ มันไม่ทำงานบนภาพแบบอ่านอย่างเดียว
Kaushal Modi

6

วิธีการแก้

ฉันใช้ซอร์สโค้ดlisp/image-mode.elเพื่อเขียนสิ่งนี้ การเรียกใช้ฟังก์ชันนี้ในบัฟเฟอร์รูปภาพใด ๆ จะปรับขนาดให้พอดีกับความกว้างหรือความสูงขึ้นอยู่กับอัตราส่วนภาพและอัตราส่วนความสูง / ความกว้างของหน้าต่าง

คุณต้องการ 2 สิ่งเหล่านี้เพื่อให้ฟังก์ชันนี้ทำงาน:

  • ความต้องการ emacs ของคุณจะได้รับการรวบรวมกับImageMagick
  • โดยตัวlibjpegโหลดเริ่มต้นจะใช้ในการจัดการjpgภาพ แฮ็คที่แสดงในส่วนถัดไปของคำตอบนี้ใช้บังคับให้ emac ใช้ตัวimagemagickโหลด
(กำหนดค่า modi / image-transform-fit-to-window ()
  "ปรับขนาดภาพให้พอดีกับความกว้างหรือความสูงตามอัตราส่วนภาพและหน้าต่าง
ต้องใช้ Imagemagick เพื่อเรียกใช้ฟังก์ชันนี้ "
  (เชิงโต้ตอบ)
  (ให้ * ((ขนาด img (ขนาดหน้าจอแสดงผล (คุณสมบัติรูปแบบรับภาพแสดง)))
          (ความกว้าง img (ขนาดรถ img))
          (img-height (cdr img- ขนาด))
          (img-h / w- อัตราส่วน (/ (ลอยสูง img-) (ลอยตัวกว้าง img))
          (win-width (- (nth 2 (ขอบหน้าต่างด้านในพิกเซล))
                        (nth 0 (ขอบหน้าต่างด้านในพิกเซล)))
          (win-height) - ((ลำดับที่ 3 (ขอบหน้าต่างด้านในพิกเซล))
                         (nth 1 (ขอบหน้าต่างด้านในพิกเซล)))
          (win-h / w-ratio (/ (float win-height) (float win-width)))
    ;; ปรับภาพให้พอดีกับความกว้างหากอัตราส่วน h / w ของหน้าต่างคืออัตราส่วน> h / w ของภาพ
    (ถ้า (>> อัตราส่วนของ win-h / w img-h / w-ratio)
        (ภาพเปลี่ยนพอดีไปกว้าง)
      ;; อื่นตามความสูง
      (ภาพเปลี่ยนพอดีไปสูง))))

แฮ็คเพื่อบังคับให้ emac ใช้imagemagickในการโหลดรูปภาพ

หลังจากทำตามรายงาน emacs ข้อผิดพลาด#18797, #10746และ#10112การแก้ปัญหาต่อไปนี้ทำงานสำหรับการบังคับให้ ImageMagick เพื่อโหลดภาพ; ใส่ไว้ในที่ของคุณinit.el:

ผมได้บังคับ emacs กับการใช้imagemagickเฉพาะสำหรับภาพไฟล์ที่คุ้นเคยกับฉัน: png, tiff, jpg/jpegและsvg; ส่วนที่เหลือจะถูกเก็บไว้เป็นค่าเริ่มต้น ฉันเลือกที่จะอนุญาตให้gifเปิดไฟล์โดยโหลดเดอร์เริ่มต้นเนื่องจาก emacs 24.4 ได้รับการปรับปรุงเพื่อรองรับการดูภาพหลายเฟรม regexp 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
         ))

ข้อเสียเปรียบ

  • ประเภทภาพที่เลือกที่จะโหลดโดยจะไม่แสดงขึ้นเป็นภาพอินไลน์ในimagemagickorg-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 ไม่รู้จัก-ลินุกซ์ GNU)ฉันยังมีต่อไปนี้ใน:config.log | #define HAVE_IMAGEMAGICK 1 | #define HAVE_MAGICKEXPORTIMAGEPIXELS 1 | #define HAVE_MAGICKMERGEIMAGELAYERS 1
Kaushal Modi

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.