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 で行っていました)。これはおそらくかなり単純ですが、ドキュメントから多くの助けを見つけることができませんでした (または、おそらく私が見つけたものを見つけました)。探していましたが、私の理解を超えていました)。何が起こっているのかわからないので、アドバイスをいただければ幸いです。