web-dev-qa-db-ja.com

配布用のipythonノートブックへの画像の埋め込み

ローカルドライブからの画像が埋め込まれたipythonノートブックがあります。コードセルの出力とともにJSONに埋め込まれることを期待していましたが、ノートブックを配布したときに、画像がユーザーに表示されませんでした。ユーザーがコードセルを再実行したり、セル出力をクリアしたりしても画像が消えないように、ノートブックに画像を埋め込むための推奨される方法は何ですか?

ノートブックシステムは![label](image.png)に含まれる画像をキャッシュしますが、それらはノートブックを提供するpython "kernel"が再起動されるまでしか持続しません。ディスク上の画像ファイルの名前を変更すると、ノートブックを閉じて再度開くと、画像は表示されますが、カーネルを再起動すると消えます。

編集:画像をコードセルoutputとして生成し、ノートブックをhtmlにエクスポートすると、画像はエンコードされたデータとしてのhtml。確かに、この機能にフックして、出力をマークダウン(またはより良いのは「生のnbconvert」)セルにロードする方法が必要ですか?

from IPython.display import Image 
Image(filename='imagename.png')

エクスポートされます(ipython nbconvert)以下を含むhtmlへ:

<div class="output_png output_subarea output_execute_result">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA...
</div>

ただし、手動でthisスニペットをマークダウンセルに埋め込んだ場合でも、画像を表示できませんでした。私は何が間違っているのですか?

[〜#〜] ps [〜#〜]既存の(古い)回答はいくつかの非常に有用な指針を示していますが、解決策ではありません。

16
alexis

追加のコードセルを使用して画像を表示してもよろしいですか?もしそうなら、これを使用してください:

from IPython.display import Image
Image(filename="example.png")

出力セルには、生の画像データが.ipynbファイルに埋め込まれているため、共有して画像を保持できます。

Imageクラスにもurlキーワードがありますが、これは、あなたもそうしない限り、画像にリンクするだけであることに注意してくださいembed=Trueを指定します(詳細については、 ドキュメント を参照してください)。したがって、リモートサーバー上のイメージを参照している場合を除いて、filenameキーワードを使用する方が安全です。

画像をマークダウンセルに含める必要がある場合、つまり埋め込み画像データを生成するための個別のコードセルがない場合、簡単な解決策があるかどうかはわかりません。 python markdown extension を使用すると、マークダウンセルにPython変数の内容を動的に表示できます。ただし、拡張機能はマークダウンセルを動的に生成するため、ノートブックを共有するときに出力を保持するには、「インストール」のセクションで説明したように、プリプロセッサipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebookを使用してpymdpreprocessor.pyを実行する必要があります。生成されたノートブックでは、マークダウンセルに次のようにデータが埋め込まれます。 <img src="data:image/png;base64,...">の形式のHTMLタグ。これにより、対応するコードセルをpreprocessed_notebook.ipynbから削除できます。残念ながら、これを試したところ、<img>タグの内容が実際にブラウザに表示されませんでした。 、これが実行可能な解決策であるかどうかわからない。:-/

別のオプションは、コードセルでImageクラスを使用して上記のように画像を生成し、カスタムテンプレートでnbconvertを使用して、ノートブックからコード入力セルを削除することです。詳細については、 このスレッド を参照してください。ただし、これにより、変換されたノートブックからallコードセルが削除されるため、希望どおりでない場合があります。

9
cilix

理由

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA...

タグをマークダウンセルに配置しても、タグは何もしません。これは、IPythonがHTMLサニタイザー( Google Caja と呼ばれるもの)を使用して、このタイプのタグ(および他の多くのタグ)をスクリーニングするためです。レンダリングされます。

IPythonのHTMLサニタイザーは、custom.jsファイル(通常は~/.ipython/profile_default/static/custom/custom.jsにあります)に次の行を追加することで完全に無効にできます。

iPython.security.sanitize_html = function (html) { return html; };  

ただし、セキュリティリスクが発生するため、優れたソリューションではありません。また、配布にはあまり役立ちません。

Postscript
base64でエンコードされた文字列を画像としてレンダリングする機能!=明らかなセキュリティ上の懸念があるため、Cajaの人々が最終的にこの種のことを許可する方法があるはずです(ただし 関連する機能リクエストチケット 2012年に最初にオープンしたので、息を止めないでください)。

3
tel

IPython HTML()関数を使用して生のHTMLを出力する場合、次の方法を使用して、リンクされた画像をbase64タグ内の<img>に埋め込むことができます。

import base64
import requests
from IPython.core.display import HTML

def embedded_image(url):
    response = requests.get(url)
    uri = ("data:" + 
       response.headers['Content-Type'] + ";" +
       "base64," + str(base64.b64encode(response.content).decode('utf-8')))
    return uri

# Here is a small example. When you export the notebook as HTML,
# the image will be embedded in the HTML file 
html = f'<img src="{embedded_image("https://upload.wikimedia.org/wikipedia/commons/5/56/Kosaciec_szczecinkowaty_Iris_setosa.jpg")}" />'
HTML(html)

PDATE: @alexisが指摘しているように、これは実際には質問に正しく答えません。これにより、ユーザーはセルを再実行して画像を保持できなくなります(このソリューションでは画像を埋め込むことしかできません)輸出に)。

0
gbmhunter

Jupyter Notebook 5以降、画像データをセルに添付し、attachment:<image-file-name>を介してセルからそれらを参照できます。メニューEdit > Insert Imageを参照するか、ドラッグアンドドロップを使用します。

残念ながら、画像が添付された(埋め込まれた)ノートブックをHTMLに変換すると、それらの画像は表示されません。

それらをHTMLコードに取り込むには、(たとえば) nbtoolbelt を使用できます。これらのattachment:参照をdata:に置き換え、imgタグに埋め込まれた画像データに置き換えます。

0
Tom Verhoeff