7

私はカイロを生成するコードを持っていますImageSurface、そして私はそれを次のように公開します:

def preview(...):
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
    ...
    cherrypy.response.headers['Content-Type'] = "image/png"
    return surface.get_data()
preview.exposed = True

これは機能しません(ブラウザは画像にエラーがあると報告します)。

私はそれがsurface.write_to_png('test.png')機能することをテストしましたが、データを返すためにデータを何にダンプするかがわかりません。ファイルのようなオブジェクトを推測していますか?pycairoのドキュメントによると、get_data()はバッファを返します。私も試しました:

tempf = os.tmpfile()
surface.write_to_png(tempf)
return tempf

また、このイメージを作成してメモリに保持する(私がやろうとしているように)か、一時ファイルとしてディスクに書き込んでそこから提供する方がよいでしょうか?画像が必要なのは1回だけで、その後は破棄できます。

4

4 に答える 4

17

これらのインポートを追加します。

from cherrypy.lib import file_generator
import StringIO

そして、このように行きます:

def index(self):
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
    cherrypy.response.headers['Content-Type'] = "image/png"

    buffer = StringIO.StringIO()
    surface.write_to_png(buffer)
    buffer.seek(0)

    return file_generator(buffer)

さらに、スタンドアロンファイルを提供していて(つまり、Webページの一部ではない)、ブラウザにレンダリングするのではなく、ディスクに保存するファイルとして扱う場合は、もう1つのヘッダーが必要です。

cherrypy.response.headers['Content-Disposition'] = 'attachment; filename="file.png"'

また、このイメージを作成してメモリに保持する(私がやろうとしているように)か、一時ファイルとしてディスクに書き込んでそこから提供する方がよいでしょうか?画像が必要なのは1回だけで、その後は破棄できます。

このファイルをブラウザに提供することだけが必要な場合は、サーバー上のディスクにファイルを作成する理由はありません。まったく逆です。ハードディスクにアクセスするとパフォーマンスが低下することを忘れないでください。

于 2010-06-20T20:26:45.857 に答える
1

の動作を理解していないために失敗していますsurface.get_data()。mime-typeを返そうとしてimage/pngsurface.get_data()ますが、「仮想画面」(サーフェス)からのプレーンイメージダンプであるプレーンビットマップイメージ(ヘッダー付きのWindowsビットマップファイル.BMPではありません)を返します

このような:

0000010000
0000101000
0001000100
0010000010
0001000100
0000101000
0000010000
于 2011-01-25T07:30:16.977 に答える
0

試しましたreturn str(surface.get_data())か?

于 2010-06-17T22:27:04.630 に答える
0

「メモリ内のファイル」アプローチでこれを試してください

return StringIO.StringIO(surface.get_data())
于 2010-06-18T06:38:18.230 に答える