2014-09-26 15 views
13

Tôi có một máy tính xách tay ipython với một hình ảnh nhúng từ ổ đĩa cục bộ của tôi. Tôi đã mong đợi nó được nhúng vào JSON cùng với đầu ra của các ô mã, nhưng khi tôi phân phối sổ ghi chép, hình ảnh không xuất hiện cho người dùng. Cách được khuyến nghị (hoặc cách nào) để nhúng hình ảnh vào Notebook, để nó không biến mất nếu người dùng chạy lại các ô mã, xóa đầu ra ô, v.v ...?ảnh Nhúng trong máy tính xách tay ipython để phân phối

Hệ thống sổ ghi chép lưu trữ hình ảnh đi kèm với ![label](image.png), nhưng chúng chỉ kéo dài cho đến khi "hạt nhân" phục vụ sổ ghi chép được khởi động lại. Nếu tôi đổi tên tập tin hình ảnh trên đĩa, tôi có thể đóng và mở lại sổ ghi chép và nó vẫn hiển thị hình ảnh; nhưng nó biến mất khi tôi khởi động lại hạt nhân.

Edit: Nếu tôi tạo ra một hình ảnh như tế bào đang đầu ra và sau đó xuất máy tính xách tay sang HTML, hình ảnh được nhúng trong html như dữ liệu được mã hóa. Chắc chắn phải có một cách để móc vào chức năng này và tải đầu ra vào một ô đánh dấu (hay còn gọi là "nbconvert nguyên") tốt hơn?

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

sẽ được xuất khẩu (với ipython nbconvert) để html chứa sau:

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

Tuy nhiên, ngay cả khi tôi tự nhúng đoạn này vào một ô markdown, tôi không thể có được hình ảnh để hiển thị. Tôi đang làm gì sai?

PS Câu trả lời hiện có (cũ) cung cấp một số gợi ý hữu ích, nhưng không phải là giải pháp.

+0

Đáng tiếc là không ai trả lời câu hỏi này trong tất cả thời gian này! Có lẽ có một giải pháp ngay bây giờ? – alexis

+0

Tôi đã gặp sự cố tương tự. Rõ ràng lý do tại sao hộp thoại trình đơn ' tel

+0

Yeah, that's reasonable, and I had expected some sort of filter. Actually I'd be surprised if originally there was no filter at all-- it's more likely that was just strengthened in version 2. But the question is still, _is_ there some method that gets past the filters? – alexis

Trả lời

5

Bạn có hạnh phúc khi sử dụng một tế bào mã thêm để hiển thị hình ảnh? Nếu vậy, sử dụng này:

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

Các tế bào đầu ra sẽ có dữ liệu hình ảnh thô nhúng trong file .ipynb để bạn có thể chia sẻ nó và hình ảnh sẽ được giữ lại.

Lưu ý rằng lớp Image cũng có một từ khóa url, nhưng điều này sẽ chỉ liên kết đến hình ảnh trừ khi bạn cũng chỉ định embed=True (xem documentation để biết chi tiết). Vì vậy, an toàn hơn khi sử dụng từ khóa filename trừ khi bạn đang đề cập đến một hình ảnh trên một máy chủ từ xa.

Tôi không chắc liệu có giải pháp dễ dàng không nếu bạn yêu cầu hình ảnh được bao gồm trong ô Đánh dấu, tức là không có ô mã riêng để tạo dữ liệu hình ảnh được nhúng. Bạn có thể sử dụng python markdown extension cho phép tự động hiển thị nội dung của các biến Python trong các ô đánh dấu. Tuy nhiên, phần mở rộng tạo ra các tế bào markdown động, vì vậy để duy trì sản lượng khi chia sẻ máy tính xách tay, bạn sẽ cần phải chạy ipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebook sử dụng tiền xử lý pymdpreprocessor.py như đã đề cập trong phần "Cài đặt". Sau đó, sổ ghi chép được tạo ra có dữ liệu được nhúng trong ô đánh dấu dưới dạng thẻ HTML có dạng <img src="data:image/png;base64,..."> để bạn có thể xóa ô mã tương ứng từ preprocessed_notebook.ipynb. Thật không may, khi tôi thử nội dung này của thẻ <img> không thực sự được hiển thị trong trình duyệt, do đó, không chắc chắn đây có phải là giải pháp khả thi hay không. : -/

Một tùy chọn khác sẽ là sử dụng lớp Image trong ô mã để tạo hình ảnh như trên, sau đó sử dụng nbconvert với mẫu tùy chỉnh để xóa ô nhập mã từ sổ ghi chép.Xem this thread để biết chi tiết. Tuy nhiên, điều này sẽ xóa tất cả ô mã từ sổ ghi chép được chuyển đổi, vì vậy, nó có thể không phải là những gì bạn muốn.

+0

Thanks! I don't _require_ the image to be in a markdown cell, but using code is (a) distracting, since the code cell cannot be hidden; and (b) more crucially, it's unsafe because these are notebooks for programming practice and the user can be expectedto clear cell outputs now and then. – alexis

+0

PS. Thanks for the nbconvert thread... I've been gradually piling up my own conversion scripts because nbconvert's guts are completely opaque (and not very well documented). Maybe this will lead me to a source of better explanations. – alexis

+0

Not sure if this is relevant, but maybe [this example](https://github.com/maxalbert/auto-exec-notebook) can also be helpful to better understand 'nbconvert' and automated notebook execution. I haven't looked at it in detail, but in my limited experience the nbconvert machinery seems to be relatively tidy in the latest version of IPython (and potentially simpler than in previous versions due to the simplification of the notebook format itself). – cilix

2

Lý do tại sao thẻ

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

không làm bất cứ điều gì khi bạn đặt nó trong một tế bào markdown là vì IPython sử dụng một HTML khử trùng (một cái gì đó gọi là Google Caja) mà sàng lọc ra loại thẻ (và nhiều thứ khác) trước khi nó có thể được hiển thị.

Các khử trùng HTML trong IPython có thể hoàn toàn bị vô hiệu hóa bằng cách thêm dòng sau vào tập tin của bạn custom.js (thường nằm ở ~/.ipython/profile_default/static/custom/custom.js):

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

Nó không phải là một giải pháp tuyệt vời mặc dù, vì nó không tạo ra một nguy cơ bảo mật và nó không thực sự giúp ích nhiều cho việc phân phối.

Postscript:
Khả năng làm base64 chuỗi mã hóa như hình ảnh = mối quan tâm an ninh rõ ràng, vì vậy cần có một cách để những người Caja để cuối cùng cho phép các loại điều này thông qua (mặc dù the related feature request ticket lần đầu tiên được mở trở lại! vào năm 2012, vì vậy đừng nín thở).

+1

That's a good lead! Notebooks have a concept of "trusted" notebook, implemented (I think) as a cryptographic key once a notebook has been inspected by the user. The reasonable thing to do would be to relax html sanitizing for trusted notebooks. Any ideas on how this could be set up? – alexis

+1

@alexis *le sigh* I tried that too. Clicking though the 'File -> Trust Notebook' dường như không ảnh hưởng đến vệ sinh HTML theo cách này hay cách khác. Bạn nói đúng rằng nó nên, mặc dù. Tôi tưởng tượng rằng nó sẽ phải được thực hiện trong codebase IPython. Có lẽ bạn hoặc tôi sẽ nhận được xung quanh để gửi yêu cầu kéo? – tel

+0

Không phải tôi, tôi không có ý tưởng làm thế nào để thực hiện điều này trên tài sản đáng tin cậy (hoặc nơi để đặt nó, thực sự). Và tôi không chắc chắn rằng việc khử trùng hoàn toàn là đúng - phải có một danh sách trắng lớn hơn về các tính năng được thông qua. Nếu bạn đủ quan tâm để làm điều đó, tôi rất tò mò muốn xem các nhà phát triển có đưa ra ý tưởng đó không! – alexis

Các vấn đề liên quan