我正在为基于 Web 的化学项目使用Indigo 库。长话短说,他们为它编写了一个不错的 Python 界面,我正在通过 CGI 使用它。有几种输出格式,包括 SVG 和 PNG。我不是 Python 专业人士,所以我对作者关于缓冲区的想法感到有些困惑。以下作品:
#!python
from indigo import *
from indigo_renderer import *
from struct import *
print "Content-type: image/svg+xml"
print
indigo = Indigo()
renderer = IndigoRenderer(indigo);
mol1 = indigo.loadMolecule("ONc1cccc1");
indigo.setOption("render-output-format", "svg");
indigo.setOption("render-highlight-color-enabled", "true");
image = renderer.renderToBuffer(mol1);
output = image.tostring()
print output
也就是说,上面的代码输出了格式正确的 SVG XML,没有不需要的前导或尾随字符。Firefox 识别了内容类型并将其渲染得很好。
但是,我很难理解我应该为 PNG 做什么:
我将代码更改为:
from indigo import *
from indigo_renderer import *
from struct import *
print "Content-type: image/png"
print
indigo = Indigo()
renderer = IndigoRenderer(indigo);
mol1 = indigo.loadMolecule("ONc1cccc1");
indigo.setOption("render-output-format", "png");
indigo.setOption("render-highlight-color-enabled", "true");
image = renderer.renderToBuffer(mol1);
output = image
print output
我得到了这个(这不是我对 PNG 的期望):
array('c', '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00[ truncated by me ]')
如果我尝试使用 toString() 方法,我确实得到了一个不错的二进制文件(我没有花任何精力试图解释它),但它显然仍然被破坏了。我觉得这需要在转储到客户端之前进行解码(我以前用 PHP 来做)——这可能很简单,但我从文档中找不到太多帮助(或者我找到了我想要的东西)正在寻找,这超出了我的理解)。我只是不确定发生了什么,并希望得到一些建议。