반응형
포인트 리스트를 가지고 그림을 드로잉하고, 이것을 원하는 크기로 Resize 하고, 투명 이미지 datauri 만들기...
pointlist = '[(10,10)(20,20)(40,50)(60,80)][(10,80)(24,70)(40,60)(60,40)]'
# image 필드에 데이터가 없는 목록만 뽑아서 배치 작업을 수행한다.
def to_datauri(sn):
sn = sn.strip()
# 정규표현식으로 포맷 문자열에서 점 정보 추출
point_regex = r"\(([-+]?\d+),([-+]?\d+)\)"
strokes = sn.replace('[', '')
strokes = strokes.split(']')
strokes = [ s for s in strokes if s!='' ]
# 그래프 그리기
plt.figure()
fig, ax = plt.subplots(figsize=(3, 2))
ax.set_facecolor('none') # 배경 투명
fig.patch.set_alpha(0) # 배경 투명
# 축과 눈금 숨기기
ax.axis('off')
# 각 획별로 분리하여 그리기
for stroke in strokes:
points = re.findall(point_regex, stroke)
if len(points)==0:
continue
x_list = [int(point[0]) for point in points]
y_list = [int(point[1]) for point in points]
ax.plot(x_list, y_list, color='black', lw=2)
plt.gca().invert_yaxis() # y축 뒤집기
# 그래프 저장
buf = io.BytesIO()
plt.savefig(buf, format='png', bbox_inches='tight')
buf_resized = buf
## resize 작업
buf.seek(0)
img = Image.open(buf)
img_resized = img.resize((150,100), Image.Resampling.LANCZOS)
# img_resized = img.resize((150,100), Image.ANTIALIAS)
# sampling=Image.ANTIALIAS deprecated 되었다. 버전에 따라 위 둘 중 하나를 사용.
buf_resized = io.BytesIO()
img_resized.save(buf_resized, format=img.format)
# buf대신 buf_resized를 변환
buf_resized.seek(0)
data_uri = 'data:image/png;base64,'+base64.b64encode(buf_resized.read()).decode('utf-8')
plt.close()
plt.clf()
plt.close('all')
img.close()
img_resized.close()
buf.close()
buf_resized.close()
return data_uri
이 함수를 사용하여 드로잉 데이터를 넣으면, datauri 텍스트가 출력된다.
시작,끝 따옴표를 제거한 텍스트를 복사해서 브라우저 URL창에 넣으면 드로잉된 투명이미지가 나온다.. (드래그해 보면, 선만 움직이는 것을 확인할 수 있다. 배경투명)
y축을 뒤집은 이유는? 모니터 스크린 좌표계에서 보통 좌상단이 (0,0) 이다. plot에서는 좌하단이 (0,0)이다. 따라서 스크린 좌표계로 보이게 하려고 하였다.
datauri가 아니라 파일로 저장하려면 plt.close() 전에 plt.savefig('test.png') 로 저장하면 된다.
'Python' 카테고리의 다른 글
투명 배경 이미지 만들기 (0) | 2023.03.22 |
---|---|
set에 set 추가? frozenset (1) | 2021.02.24 |
Jupyter Notebook 소스 복구 (0) | 2020.06.16 |
Docker python venv 패키지 유지 (0) | 2020.06.07 |
딕셔너리에서 키삭제 (0) | 2019.12.07 |