使用Python将图像输出到HTML

22

我有一个由Python生成的网页,它的功能是正常的,使用以下代码:

print 'Content-type: text/html\n\n'
print  ""                                 # blank line, end of headers
print '<link href="default.css" rel="stylesheet" type="text/css" />'
print "<html><head>"

我想在这个网页中添加图片,但当我这样做时:

sys.stdout.write( "Content-type: image/png\n\n" + file("11.png","rb").read() )
print 'Content-type: text/html\n\n'
print  ""                                 # blank line, end of headers
print '<link href="default.css" rel="stylesheet" type="text/css" />'
...

我得到的只是图片,如果我把图片代码放在我的HTML/文本标题下面,我只能得到图片中的文本内容,例如:

<Ï#·öÐδÝZºm]¾|‰k×®]žòåËÛ¶ÃgžyFK–,ÑôéÓU½zuIÒ}÷ݧ&MšH’V¯^­?üð¼1±±±zýõ×%IñññÚºu«*W®¬wß}W.—K3gÎÔÌ™ÿw‹Ú””I’¹w¤¥hdÒd½q÷X•Šˆ²m¿þfïÞ½*]º´éÈs;¥¤¤Ø¿ILLÔˆ#rÊ

此外,如果我尝试:

print "<img src='11.png'>"

我在浏览器中看到了一张损坏的图片,直接访问该图片会产生500内部服务器错误,并且我的Apache日志显示:

8)Exec format error: exec of './../../11.png' failed Premature end of script headers: 11.png 

不要展示你的打印语句,而是展示生成的HTML文件。 - David Heffernan
文件/目录布局是什么?看起来Apache试图将您的11.png作为CGI脚本执行。通常情况下,您会将CGI脚本存储在/cgi-bin下,其他资源存储在其他地方。您是否碰巧混合了它们? - Helgi
3个回答

61

你可以使用以下代码将图像直接嵌入到HTML中: Python 3

import base64
data_uri = base64.b64encode(open('Graph.png', 'rb').read()).decode('utf-8')
img_tag = '<img src="data:image/png;base64,{0}">'.format(data_uri)
print(img_tag)

Python 2.7

data_uri = open('11.png', 'rb').read().encode('base64').replace('\n', '')
img_tag = '<img src="data:image/png;base64,{0}">'.format(data_uri)

print(img_tag)

或者对于Python <2.6:

data_uri = open('11.png', 'rb').read().encode('base64').replace('\n', '')
img_tag = '<img src="data:image/png;base64,%s">' % data_uri

print(img_tag)

<type 'exceptions.AttributeError'>:'str'对象没有属性'format' args = (“'str'对象没有属性'format'”,) message = "'str'对象没有属性'format'" - Kilizo
你使用的是哪个Python版本?看起来应该是低于2.6的版本,因为str.format是在那个版本中引入的(http://docs.python.org/library/stdtypes.html#str.format)我添加了另一种格式化方式,应该可以在2.5上工作。 - Glider
我正在使用2.6.4,你的第二个建议起作用了,到目前为止这是唯一的解决方案,谢谢,我会给你“打勾”的!有没有想法为什么我不能简单地使用“print '<img src=...>'”? - Kilizo
1
你真的应该使用普通的 <img src=...>。找出它为什么失败了。 - David Heffernan
不要忘记在Python版本> 3的情况下将“import base64”添加到脚本中。 - Adriaan

2

网页中的图像通常是对服务器的第二次请求。HTML页面本身没有图像,只是引用图像,例如:<img src='the_url_to_the_image'>。然后浏览器会向服务器发出第二个请求,并获取图像数据。

您唯一的选择是在img标记中使用data: url来同时提供图像和HTML。


0

你不能直接将图像数据倒入HTML中。

你需要将文件提供服务并链接到它,或者将图像编码为base64并嵌入其中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接