3

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

4

2 に答える 2

1

あなたの出力によると、それはPNGファイルです。wbモードでファイルに保存するだけです。

あなたは PHP 開発者なので、Python で必要なものだけを使用します。

オプション 1:

ファイルに保存して PHP で取得する

...
output = image
f=open ("someFileName.png", wb)
f.write(output[1])
f.close()

次に"someFileName.png"、PHP ラッパーで使用します。

オプション 2: PHP ラッパーから Python スクリプトを呼び出します。イメージ データを終了コードとしてラッパーに渡します。

...
output = image
import sys
sys.exit(output[1])
于 2012-04-17T06:36:53.257 に答える
0

(これをコメントとここに入れたことをお詫びします)。問題を解決する - Windows は確かにこれを面倒にしましたが、今のところはそうしなければなりません。残念ながら、Linux VPS 用に完成させるにはコードを変更する必要がありますが、私が行ったことは次のとおりです。出力は文字配列であり、tostring() は期待どおりに機能し、生のコンテンツをダンプするだけです。私がする必要があるのは、破損を防ぐために出力を強制的にバイナリとして書き込むことだけです。バイナリでファイルに書き込むのは簡単ですが、バイナリとして stdout に書き込むのはプラットフォーム固有です。参照: リンク 助けてくれてありがとう。ここでガイダンスを見つけました:

Win32 Binary Write 最終コードは次のとおりです。

#!python
from indigo import *
from indigo_renderer import *
from array import *
import sys, cgitb, cgi

cgitb.enable()
httpArgs = cgi.FieldStorage()
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")

outputStream = renderer.renderToBuffer(mol1)
if sys.platform == "win32":
   import os, msvcrt
   msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
else:
sys.exit()
sys.stdout.write(outputStream.tostring())
于 2012-04-17T21:46:51.613 に答える