【问题标题】:Getting TypeError when trying to convert in-memory image to base64 string?尝试将内存中的图像转换为 base64 字符串时出现 TypeError?
【发布时间】:2014-02-17 13:41:46
【问题描述】:

我通过 DAJAX 通过 POST 获取 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 

【问题讨论】:

    标签: python django base64 dajax


    【解决方案1】:

    我不确定您是否理解返回 ouput.getvalue() 的内容,因为您正在尝试再次读取文件

    data = base64.b64encode(open(contents,'rb').read())
    

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

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

     data = base64.b64encode(contents)
    

    您也可以查看StringIO 参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-07
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多