将二进制字符串解释为Python中的图像,由Javascript本地方法生成

Interpret binary string as image in Python, generated by Javascript native method

本文关键字:Javascript 地方法 图像 字符串 二进制 解释 Python      更新时间:2023-09-26
    var oReq = new XMLHttpRequest();
    var reader = new FileReader();
    reader.onload = function(e) {
      var rawData = reader.result;
      oReq.open("POST", '/upload', true);
      oReq.send(rawData);
      console.log(rawData);
    }
    reader.readAsBinaryString(postObj);
    // postObj is an image who's src is set to a data uri, taken via a webcam.

console.log(rawData) yield ==>

"PNG

IHDRÈÜÇ IDATx^d½idizw"##rϬ}ëîªÞfÃ!%2
ø£üølpµ0ù Q&É©¡,Ú2l²!æSeÃ$Y-ÉÎLïKuí{îáëºófe³§¦*3#Nó¾Ïr?÷³¼úOþÓùÉ tóne¸Øm.»ÙhÐtÃÅQ7<w''³nοg³Y·Èkóãn<Xì§G]·²Ø
ç]·8wÇ'å¨;á5vÁ°Ì»E¾?æ÷ywtÒuó¯ù{>Ïám]ÇëF£Qwt|'ßó5ä³NæÜÇ°^{r¿ùÜÁ|¡;>:êón0âß¼gûã6rm_ëgçõü4[vG¼gaa!?_à5#~³0'èxcß}Â}ú|ÜÓóóÅ!Ï=?â{®ã½ó^í½v'ü×úþÞ/×ñÏ}P®}Â÷ݸ;9f­X¨?[àUÇ|?à^|þáb=çòɸ[æ·¬@7q]>giÜqÓ~@oq´èMdY4í3-.ùÈzÿü̺Íy
7Ľֺؿ'Ü6¯õ:Ü ß·5r-|ºv½½ôú¬w¶ìõáþ<{/íuí{ÞÎÚy¯Gì%kÎ}NfÓÚÞã5ݶÏÞÔr×
ø«Õッk¯õï</ëïçz¬ïso§ÙsƳü5öß»{ÛÝádÌñö ïgÍÿù¿üWÝƹÝøüX7øK?ùó    ê¶/!Ë«ÝÂxÔ"
G.²Éxbæ]ñg@úýgé£Þ;¿ThƳ/ùòû(D¿Ã>2Þ-ð³7¯18"P<=ç>GSr±;r'à;³°<6ÎòZNAázndûûtù¼1ÇVGÁ¼^vܼ'3ÚÆu¸9×g]ÉñA   V°0óîÍ£TÃY½ïdaM">ÆhÎF9ú¿](3¯¢xeÜõt
¢DÞN¾E¾oÈEy×q®?ÂÀ»z=Bó|,¯JáæzíýÞ¯ÿöï&äM!rϼWóQÛ^ÏÛÖ5÷ܤûåϸÛüûÃkôF©]ß¿óÜ1F¤üNëÍsM¯Qü²úYX:f¯DSßÌõ4D1eTÛûüvÿþlrpÐM'SÇuòµÈïù?øî½>è~â'~¢ü$

我如何在Python中解释这个?在服务器上,这些数据显示为:

'...'x7f'xc2'xb4r'xc2'x87'x1c'xc2'xaa'n-'xc2'x9c'xc2'xa6QF'xc2'xac'xc2'xb0tS'xc3'xa4'xc2'xb0;'xc3'x8cisL@'xc3'x98'xc2'x94E'xc3'x94'xc2'xb8Bz'xc3'xb0'xc3'xa9'xc2'xaa#8'xc2'x90'xc3'xbb'xc3'xa5>'xc3'xbaO'xc2'xa8'xc3'x81H'xc3'x91'xc2'xaf:i'xc2'x8a'xc2'x926'xc2'x8b'xc2'x81'xc3'xbc'xc3'xa1Y'xc3'x93'xc2'x9b'xc2'xbat'xc2'x8f'xc3'x9e~'xc2'xa3PH4'x02_'x04'xc2'xbf'xc2'x92'xc2'xb7'xc3'xad'xc2'x8f'xc3'x9e'xc3'xbf'xc2'xb8<'xc2'x91V'xc3'xa0'xc3'x8b'x1f'xc3'x88'xc3'x9f'xc2'xa2>)'x1d'xc3'x94eY='xc3'x8ct'xc2'xa9+L^7'xc2'xa2I'xc3'x84'xc2'xba'x03'xc3'xb5!1f'xc3'x97'xc3'x81'xc3'xbfD'xc3'x87'xc3'xb7'x06'xc2'xaa'xc3'xafcz'xc3'xad('xc3'xb5'xc2'xab'xc3'x96'xc3'xb5<'xc3'x8e'xc2'xab'x08'xc3'x81'xc2'x88'x0b'xc3'x8a;'xc3'x8e!v'xc3'x84'xc2'xb1?'xc2'x8bVn'x19t'xc3'x80'xc2'x8bT`:'x1c'xc3'x8b'xc2'x99'xc3'xb2'xc3'x9c'xc3'xbf'x0fCsXi'xc3'xa6z'xc3'xb3l'x00'x00'x00'x00IEND'xc2'xaeB`'xc2'x82'

将此以PNG格式写入文件将生成无效的PNG。任何关于保存图片的指导都会很有帮助。

您需要在上传之前将图像的二进制表示转换为Base64 -这使得通过HTTP传输数据时可以安全使用。

当您在服务器端收到Base64编码的图像时,您可以将其转换回二进制,并将其写入文件。

客户端代码:

要转换为Base64,需要使用

fileReader.readAsDataURL( fileObject )

这自动表示您的数据在一个安全的通过HTTP格式上传。

服务器端代码:

import base64
coded_string = '''Q5YACgA...'''
binary = base64.b64decode(coded_string)
# now write binary to file...
open('/path/to/new_file.png', 'wb').write(rawData)

浏览器:

// Client Side:
var xhr = new XMLHttpRequest();
xhr.open('POST', uploadUrl);
xhr.send(base64EncodedItem);

在服务器上(我使用Flask/Python 2.x)

# Server Side:
import re
import uuid
# Obtain the base64 string
image_string = request.data
image_string = re.search(r'base64,(.*)', image_string).group(1)
# Generate a file name.
# We can assume PNG format in my specific implementation, but you could search
# the image_string variable to detect filetype.
output = open(str(uuid.uuid4()) + '.png', 'wb')
output.write(image_string.decode('base64'))
output.close()

这对我有用。