我在python中解碼/解壓縮一個字串時遇到了問題,這個字串最初是用C#的 "GZipStream "壓縮的。 使用 "GZipStream "壓縮的字串。
"opencv mat "被轉換為json:
"opencv mat "被轉換為json。
public override void WriteJson(JsonWriter writer。Mat value, JsonSerializer serializer)
{
byte[] matBytes = null;
Cv2.ImEncode(".png", value, out matBytes) 。
//將byte[] 轉換為Base64字串。
string matBase64 = Convert.ToBase64String(matBytes)。
var resCompressed = Utils.StringCompressor.CompressString(matBase64)。
writer.WriteValue(resCompressed)。
}
一個解壓字串 "jsontoken "的例子是:
uAoAAB LCAAAAAAABADtls3SsrgWhS IASogOOiB/GgS/gkqMlMUgkFEEGK8 o7v1931DU7VqTqzU9UMfDS1srPY2dmx3pthwmbutnqsxRPgHXF2lfj28xNU1vrniceHr34HPrPGifeJur4q5nqHdocErlnx0YH8eA2fZwhrsz4q2epTEWRSyjESqDjO0VogzpFPK/yDWgD69I5jJLDFKYLOL1ABGyFKLYGfIOa/sf6XWJGbAaDW9kzmUryc6FDcpQMGmbYGaKIGka8J4ZmGYFnC9co1ahpOs JKpXRhE6O6zQg/qtdIzLuNp9YGmgWgfr8wTcImDzVaBAF3wkTxU5KP2MSRflTPZ1rsbtInBAttu4HRqLPTNX5jW78bfkudHZEWEphoOKYyOtsKTzKk3GU2N9o5z7Xe8OGYeih8L 4c7JEy7hi2NM8gS3DIUELbQv0gv6f9x1ZjHZq7RtKzdakBSCflpG4U KaNsVTWkrYZ7hMIl24GW7phmpLUmmP0Ys0c9NT7vAogU79OpvDFbmPco4PQ4KdmGo vBnlCQwpPplaNp3DF5oudzMchWFF5J5bvi3DVhMazF9qoQa6heZal4732OTjmguqfeoBgQG27OcZRnpYuZ2zJ72PSkPecBkXr2XSCeQczcDmJBMVT GSknjXXS0DsVfcTEOrWXmMHJ13sJl4N/nPoztQ8Xva5pSCLLXW OeH2vTjQ04xGn2GA8xcq2/Mx6U5YDjG71ayRioaAVYOM15vAy3/gILj6RbQXfEZ22rtYW19Bd4gbHhvhwWi2dDQu884NUGBourU74/P3XdmBTp92QHRAURsd0yDHkRcc0/1fLPNEdiemuPwmJSWR9hQYTUZkweJvUsH5b2xlcNLWrw4YqrJGw0OhQL14dDujKdMzGLxgS9gYd6ckspuCXFl9zVzVejUbY0zY5ux6mt8S9x5nPI/svKiezo0UZMnqqgjm3HrgcMPh2XJNpmYQESg yQAfwCZFdXeqZQYfLyg0rmd5pLDuvIap/Sqqq1OJ9dsXVMG6Gx6FY3dFfZ3dqq G class="hljs- regexp">/KaiD3 eq3FHn 9bjaN/fXqCt3X6 4eBzw1wv13fqS9R9POY9mNvv5A58kiMNAtoE2G8G8usceEx wFp 97jYxIV8S2Zxdo7mTvhU/6/Mba6NhThTAe4NQ C3PL6xD3bJZB2CEZYM0MRI6XPzluafbNsTOjylvkdnNKSiC2Uzklcnhl7chqqViRcN5sjU62L73ra/YIlEN85lkRjgZdiPoo9l0wF/Whn61zjz1NOTifBS0/1YDKAcqtecRzUReuzeZPTsMEkOWeQuMeibOAkg6WIDvhBqcRsEVd/07zhLsvy1Pyw8sp6f9h/FPqp1kjXV5kI2rUUD0L/X526OBfh 5G0bGY53aEaqad Vas9Z4vaLATR30aoPtCWQuOMTilU iy6sru12JO1pcmMPrenn6dc12xX3k6uUumLVIdi/4RMGWx0zn59gZpRs ftvDnTWQ8z7aceyu0FXMsJU9ld8H0hWhntsFGR LJHpbjhrVS7CJvNRvtFbdzVIp VI7xGfVvZbw13NbMWXiZHcd4giNRhlrsq9YZ0Yq6YigoSTaQBgf6qzBlGtZYVlMz6mnKD0xPNedBJ0n00KW2MfohLKSkRp788p3DmEzQJO8ND3MYheV7Xoh75PZpjTxDG1oZumzv S53o1BmTdEccKR4ag5QR2 rmWQn/JpD TJVvlFVNFAs1c9oTLtBVSAzHP8egK24MB493VdiCK42xS0EEY jREEeYVKacKz1hQ 4G2Il6ElgtDf6 lzVtIRQC4x68HXuh2kp7okFT6DceXYgChwBOVGP7bcd/H/ey//G q x5KpcbVeiPaTR Gbfv6AmSnaa01NUVdUff/wJwhGNxbgKAAA=
加載該資料的C#代碼是:
private static void CreateDataFromJsonZip(refThresholdMask mask, JObject jsonObj, string maskName)。
{
//獲得JSON結果物件到一個串列。
JToken jsonToken = jsonObj["Selection"]; # jsonToken
var res = Utils.StringCompressor.DecompressString(jsonToken.ToString() )。
byte[] data = Convert.FromBase64String(res)。
mask.Selection = Cv2.ImDecode(data, ImreadModes.Unchanged);
我在python中讀取資料的嘗試是:
jsonToken = r'uAoAAB LCAAAAAAABADtls3SsrgWhS IASogOOiB/GgS/gkqMlMUgkFEEGK8 o7v1931DU7VqTqzU9UMfDS1srPY2dmx3pthwmbutnqsxRPgHXF2lfj28xNU1vrniceHr34HPrPGifeJur4q5nqHdocErlnx0YH8eA2fZwhrsz4q2epTEWRSyjESqDjO0VogzpFPK/yDWgD69I5jJLDFKYLOL1ABGyFKLYGfIOa/sf6XWJGbAaDW9kzmUryc6FDcpQMGmbYGaKIGka8J4ZmGYFnC9co1ahpOs JKpXRhE6O6zQg/qtdIzLuNp9YGmgWgfr8wTcImDzVaBAF3wkTxU5KP2MSRflTPZ1rsbtInBAttu4HRqLPTNX5jW78bfkudHZEWEphoOKYyOtsKTzKk3GU2N9o5z7Xe8OGYeih8L 4c7JEy7hi2NM8gS3DIUELbQv0gv6f9x1ZjHZq7RtKzdakBSCflpG4U KaNsVTWkrYZ7hMIl24GW7phmpLUmmP0Ys0c9NT7vAogU79OpvDFbmPco4PQ4KdmGo vBnlCQwpPplaNp3DF5oudzMchWFF5J5bvi3DVhMazF9qoQa6heZal4732OTjmguqfeoBgQG27OcZRnpYuZ2zJ72PSkPecBkXr2XSCeQczcDmJBMVT GSknjXXS0DsVfcTEOrWXmMHJ13sJl4N/nPoztQ8Xva5pSCLLXW OeH2vTjQ04xGn2GA8xcq2/Mx6U5YDjG71ayRioaAVYOM15vAy3/gILj6RbQXfEZ22rtYW19Bd4gbHhvhwWi2dDQu884NUGBourU74/P3XdmBTp92QHRAURsd0yDHkRcc0/1fLPNEdiemuPwmJSWR9hQYTUZkweJvUsH5b2xlcNLWrw4YqrJGw0OhQL14dDujKdMzGLxgS9gYd6ckspuCXFl9zVzVejUbY0zY5ux6mt8S9x5nPI/svKiezo0UZMnqqgjm3HrgcMPh2XJNpmYQESg yQAfwCZFdXeqZQYfLyg0rm
string = jsonToken
original = base64.b64decode(string)
convert_to_np = np.frombuffer(original, dtype=np.uint8)
print(convert_to_np)
len(convert_to_np)
img = cv2.imdecode(convert_to_np, cv2.IMREAD_UNCHANGED)
不幸的是,最后一步的imdecode不起作用,結果是None。
有什么提示嗎?
uj5u.com熱心網友回復:
這將完全按照你的要求,按照這個SO答案中的StringCompressor.DecompressString代碼進行操作(解壓后的長度存盤在前4個位元組):
original = base64.b64decode(gzip.解壓(base64.b64decode(jsonToken))[4:])
然而,我建議簡化你的C#實作。從原始的OpenCV矩陣開始,你:
- 將其編碼為PNG影像 將二進制資料轉換為base64字串。
- 用gzip壓縮文本字串 。
- 再次轉換為base64字串
- 將其存盤到jQuery中。
- 將其存盤到json檔案中 。
第二步是完全不必要的,第三步是多余的,因為PNG編碼程序已經壓縮了影像資料。添加另一層壓縮不會有什么幫助,甚至可能會使情況更糟。
我將直接轉換為 PNG,用 base64 編碼,并將其寫入 json 檔案。然后你的原始 Python 代碼將如期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/332797.html
標籤:
