2010-12-15 33 views
0

我曾经使用CPython + PIL + bottle在我的网站上提供图像文件。我使用下面的代码直接提供来自PIL内存的图像数据。来自MemoryStream的图像文件(IronPython网络服务)

# works well in CPython 
@route('/test') 
def index(): 
    response.set_content_type('image/png') 
    img = DrawSomePILImage() 
    output = StringIO.StringIO() 
    img.save(output,'PNG') 
    contents = output.getvalue() 
    output.close() 
    return contents 

现在,我需要使用IronPython而不是CPython来提供图像文件。我正在尝试提供Microsoft图表控件(System.Windows.Forms.DataVisualization.Charting)的图像。

# image is broken in IronPython 
@route('/test') 
def index(): 
    response.set_content_type('image/png') 
    cht = GetChartControl() 
    stream = MemoryStream() 
    cht.SaveImage(stream, ChartImageFormat.Png) 
    contents = System.Text.ASCIIEncoding.ASCII.GetString(stream.ToArray()) 
    stream.Close() 
    return contents 

但这不起作用。 Web浏览器上的投放图像文件已损坏。你们能帮助我如何使这个蟒蛇代码工作?

回答

0

我找到了答案(或者只是一个解决方法)。 Ironpython的大小是unicode,而cpython的大小(3以下)不是。所以我删除了在Bottle框架中将unicode数据的转换部分移除到WSGI兼容(bottle.py的第543行),并返回如下的流数据。

contents = ''.join([chr(v) for v in stream.ToArray()]) 
0

这是这一行:

contents = System.Text.ASCIIEncoding.ASCII.GetString(stream.ToArray()) 

在这一过程中,您要发送一个字符串,它是图像中的字节编码形式时,在现实中,你只是要发送的字节。

我想,如果你把它改成这样:

contents = stream.ToArray() 

它可能工作(我不是一个Python的家伙)。这里的想法是将字节传递给发出请求的客户端,而不是字符串。

+0

感谢您的回答,但这似乎不起作用。我之前尝试过,它使内部(网络)服务器错误。我想我需要将.net类型(字节[])转换为python类型(str或其他) – 2010-12-15 17:18:13