ローカルドライブからの画像が埋め込まれた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 [〜#〜]既存の(古い)回答はいくつかの非常に有用な指針を示していますが、解決策ではありません。
追加のコードセルを使用して画像を表示してもよろしいですか?もしそうなら、これを使用してください:
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コードセルが削除されるため、希望どおりでない場合があります。
理由
<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年に最初にオープンしたので、息を止めないでください)。
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が指摘しているように、これは実際には質問に正しく答えません。これにより、ユーザーはセルを再実行して画像を保持できなくなります(このソリューションでは画像を埋め込むことしかできません)輸出に)。
Jupyter Notebook 5以降、画像データをセルに添付し、attachment:<image-file-name>
を介してセルからそれらを参照できます。メニューEdit > Insert Image
を参照するか、ドラッグアンドドロップを使用します。
残念ながら、画像が添付された(埋め込まれた)ノートブックをHTMLに変換すると、それらの画像は表示されません。
それらをHTMLコードに取り込むには、(たとえば) nbtoolbelt
を使用できます。これらのattachment:
参照をdata:
に置き換え、img
タグに埋め込まれた画像データに置き換えます。