バッファ内の画像URLから画像を表示


7

Emacsは画像の表示方法を知っているので、これはかなり簡単なようです。

バッファで、次のような画像へのURLがあるとします。

http://centre.nikkeiplace.org/wp-content/uploads/2012/07/aikido11.jpg

そのURLにキャレットを置き、のような関数を呼び出してexpand-image-from-url、画像をインラインでレンダリングしたいと思います。

これは簡単にできることですか?

回答:


10

別のバッファに表示されている画像を気にしない場合は、

M-x ffap

現在のバッファに表示される画像を主張する場合は、もう少し作業を行う必要があります。

(require 'url)

(defun insert-image-from-url (&optional url)
  (interactive)
  (unless url (setq url (url-get-url-at-point)))
  (unless url
    (error "Couldn't find URL."))
  (let ((buffer (url-retrieve-synchronously url)))
    (unwind-protect
         (let ((data (with-current-buffer buffer
                       (goto-char (point-min))
                       (search-forward "\n\n")
                       (buffer-substring (point) (point-max)))))
           (insert-image (create-image data nil t)))
      (kill-buffer buffer))))

それが同じことです。同じバッファーにインラインで表示します。
bitops

1
あなたはタフな顧客です。いくつかのサンプルコードで編集。
jch 2015年

非常に素晴らしい!注意すべき点の1つは、「thingatpt」パッケージの一部を取得して機能させる必要があったことです。url-get-url-at-pointは組み込みコマンドではないと思います。
bitops

1
あなただけが必要(require 'url)です。
jch

ありがとうございました!完璧に動作します。
ギーゼル

0

次の書き換えられた関数を使用して、Orgモードでインライン画像とWeb画像(インライン画像を表示する方法とまったく同じ)を表示できます(作業環境がOrgモードの場合)。

  1. インライン画像を表示する場合、ローカルディスクに親指ファイルを生成して表示します。これを使用すると、元の画像を損なうことなく、できるだけ自由に画像に注釈を付けることができます。
  2. URL画像を表示する場合、画像を変数に保存し、ダウンロードせずに表示します。

任意の拡張が可能です。もちろん、インライン画像を表示することはできますが、わずかな変更でサムファイルを生成することはできません。しかし、私は上記の方法を好みます。

(defun org-display-inline-images (&optional include-linked refresh beg end)
  "Display inline and url images.
Normally only links without a description part are inlined, because this
is how it will work for export.  When INCLUDE-LINKED is set, also links
with a description part will be inlined.  This
can be nice for a quick
look at those images, but it does not reflect what exported files will look
like.
When REFRESH is set, refresh existing images between BEG and END.
This will create new image displays only if necessary.
BEG and END default to the buffer boundaries."
  (interactive "P")
  (unless refresh
    (org-remove-inline-images)
    (if (fboundp 'clear-image-cache) (clear-image-cache)))
  (save-excursion
    (save-restriction
      (widen)
      (setq beg (or beg (point-min)) end (or end (point-max)))
      (goto-char beg)
      (let ((re (concat "\\(\\(http\\)\\|\\(\\[\\[\\(\\(file:\\)\\|\\([./~]\\)\\)\\)\\)\\([^]\n]+?"
                    (substring (org-image-file-name-regexp) 0 -2)
                    "\\)" (format "\\(\\(\\]%s\\)\\|\\)" (if include-linked "" "\\]"))))
        old file ov img width point-begin point-end)
    (while (re-search-forward re end t)
      (setq old (get-char-property-and-overlay (match-beginning 1)
                                               'org-image-overlay)
            match (match-string-no-properties 0)
            point-begin (match-beginning 0)
            point-end (match-end 0))
      (if (s-starts-with? "http" match)
          (save-excursion
            (let* ((buffer (url-retrieve-synchronously match))
                   (unwind-protect
                       (let ((data (with-current-buffer buffer
                                     (goto-char (point-min))
                                     (search-forward "\n\n")
                                     (buffer-substring (point) (point-max)))))
                         (require 'image+)
                         (setq img (imagex--fit-to-size (create-image data 'jpeg t) 400 400)))))))
        (setq file (expand-file-name
                    (concat (or (match-string 6) "") (match-string 7)))
              width (if (eq (car (org-element-property :parent (org-element-at-point))) 'table) 200 400))
        (when (file-exists-p file)
          (let ((file-thumb (format "%s%s_thumb.png" (file-name-directory file) (file-name-base file))))
            (if (file-exists-p file-thumb)
                (let ((thumb-time (nth 5 (file-attributes file-thumb 'string)))
                      (file-time (nth 5 (file-attributes file 'string))))
                  (if (time-less-p thumb-time file-time)
                      (shell-command (format org-imagemagick-display-command
                                             file width width file-thumb) nil nil)))
              (shell-command (format org-imagemagick-display-command
                                     file width width file-thumb) nil nil))
            (if (and (car-safe old) refresh)
                (image-refresh (overlay-get (cdr old) 'display))
              (setq img (save-match-data (create-image file-thumb)))))))
      (when img
        (setq ov (make-overlay point-begin point-end))
        (overlay-put ov 'display img)
        (overlay-put ov 'face 'default)
        (overlay-put ov 'org-image-overlay t)
        (overlay-put ov 'modification-hooks
                     (list 'org-display-inline-remove-overlay))
        (push ov org-inline-image-overlays)))))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.