본문 바로가기
Nodejs

Nodejs python-shell binary 연동, 바이트 파일 주고받기, Base64, example opencv image 변경

by ahsung 2020. 1. 17.

 

 

다른 포스팅에서는 opencv형태로 image를 전송하기위해

json을 이용하여 bytes 배열을 보내는 방법을 사용하였다.

 

표준입출력의 특성상 어쨌든 보내면 문자열로 변하는 문제가 있어  결국 파싱의 문제가 생겨 우회했던 방법인데,

( 바이트 코드 xFFx16을 전송할때  "xFFx16"의 문자열로 보내기 때문에

이를 다시 그대로 byte로 디코딩하면 "xFFx16"문자열의 바이트코드 즉 아스키코드 값이 나오는 문제점!! )

 

 

바이너리를 직접 문자열으로 인코딩 디코딩 하는 좋은 방법인 base64를 소개합니다.

 

Base64는 바이트코드를 64진법 ascii 코드로 인코딩하고, 다시 bytes 정보로 디코딩 하는 기법중 하나입니다.

 

즉, Database나  표준입출력과 같이 문자열으로서 통신할때 바이너리를 손쉽게 파싱(디코딩)할 수 있도록 제공된 방법입니다.

javaScript

var pyshell = require("python-shell")
var fs = require("fs");

var data = fs.readFileSync("../../detImage/i2.jpeg")
var base64 = data.toString("base64");

//파이썬.py파일과, 실행시킬 python 프로그램의 경로를 문자열로 입력
pyshell = new Pythonshell.PythonShell(scriptPath, {
   pythonPath: pythonPath
});

//base64로 인코딩한 문자열을 전송
pyshell.send(base64);

pyshell.on("message", rebase64 => {
   var err = null;
   
   //base64 문자열을  Buffer(bytes)타입으로 디코딩
   result = Buffer.from(rebase64,"base64");
   console.log(result);
   fs.writeFileSync("result.jpeg", result);
});

pyshell.end(err => {
   if (err) {
   	console.log(err);
   }
});

 

Python

import sys
import base64
import numpy as np
import cv2

# base64 받음
inputs = sys.stdin.read()
binary_arry = base64.b64decode(inputs)
binary_np = np.frombuffer(binary_arry, dtype=np.uint8)

# data cv2 np convert
img_np = cv2.imdecode(binary_np, cv2.IMREAD_ANYCOLOR)

# # image change
# 네모 모양의 검은색 색칠
img_np[0:50, 0:50] = 0

# convert bytes
_, imen = cv2.imencode('.jpeg', img_np)
imenb = imen.tobytes()

# python의 endcode는 base64 문자열의 bytes타입으로 바꿔주므로, 다시 문자열로 decode
result = base64.b64encode(imenb).decode()
print(result)

'Nodejs' 카테고리의 다른 글

Nodejs python-shell image 이미지 파일 Json으로 주고 받기  (1) 2020.01.16

댓글