ipython - 関数 - ジュピター ノート ブック mac




配布用にipythonノートブックに画像を埋め込む (2)

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

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

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

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

次のものを含むhtmlに( ipython nbconvert )エクスポートされます:

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

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

PS既存の(古い)答えは、いくつかの非常に有用な点を示していますが、解決策はありません。


なぜ

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

タグは、マークアップセルに置いたときに何もしません。なぜなら、IPythonは、このタイプのタグ(および他の多くのタグ)をレンダリングする前にスクリーンするHTMLサニタイザ( Google Caja )を使用するからです。

IPythonのHTML custom.jsは、通常は~/.ipython/profile_default/static/custom/custom.jsあるcustom.jsファイルに次の行を追加することで完全に無効にすることができます:

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

しかし、それはセキュリティ上のリスクを引き起こすので、素晴らしい解決策ではありません。そして、それは実際に配布でそれほど役に立ちません。

追記
base64でエンコードされた文字列を画像としてレンダリングする機能=明らかなセキュリティ上の問題です。したがって、Cajaの人々がこの種のものを最終的に許可する方法が必要です( 関連する機能要求チケットは2012年に最初に開かれました。あなたの息を止めないでください)。


イメージを表示するために余分なコードセルを使用してもよろしいですか? もしそうなら、これを使う:

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

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

Imageクラスにはurlキーワードもありますがembed=Trueも指定しない限り、イメージにのみリンクされます(詳細はdocumentationを参照)。 したがって、リモートサーバー上のイメージを参照していない限り、 filenameキーワードを使用する方が安全です。

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

別のオプションは、コード・セルのImageクラスを使用して上記のようにイメージを生成し、次にカスタム・テンプレートとともにnbconvertを使用して、ノートブックからコード入力セルを除去することです。 詳細については、 このスレッドを参照してください。 しかし、これは、変換されたノートブックからすべてのコードセルを削除するので、あなたが望むものではないかもしれません。