尝试将内存映像转换为base64字符串时获取TypeError?

时间:2014-02-17 13:41:47

标签: python django base64 dajax

我通过DAJAX获取URL。

然后将URL传递给下面的函数。抛出TypeError。

我不想将'img'保存到磁盘,然后重新打开它以进行转换。

我不知道还有什么可以尝试所以我认为我是世界。感谢您的帮助。

def getqrcode(link):
    bsettings = Bitcoinsettings.objects.get(pk=1)
    qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=bsettings.qrcodesize , border=5,)
    qr.add_data(link)
    qr.make(fit=True)
    img = qr.make_image()
    output = StringIO.StringIO()
    img.save(output, 'GIF')
    contents = output.getvalue()
    data = base64.b64encode(open(contents,'rb').read())
    data = "data:image/png;base64," + data
    output.close()
    img = []
    return data

TypeError: file() argument 1 must be encoded string without NULL bytes, not str

这是ajax.py代码。

from torgap.bitcoin.bitcoin import getqrcode
from dajaxice.decorators import dajaxice_register
from dajax.core import Dajax
@dajaxice_register
def getimage(request, image):
    try:
        dajax = Dajax()
        link = image
        image = getqrcode(link)
        dajax.assign('#qrcode', 'src', image)
        return dajax.json()
    except Exception as e: 
        print e 

1 个答案:

答案 0 :(得分:0)

由于您尝试使用

重新读取文件,我不确定您是否理解返回ouput.getvalue()的内容
data = base64.b64encode(open(contents,'rb').read())

但是上面的行contents已经包含了图像文件的字符串表示。几乎可以肯定,这里隐藏着file()抱怨的烦人的 NULL字节

尝试通过以下方式更改上面的行:

 data = base64.b64encode(contents)

另外,您可以查看StringIO参考。