1스프린트-day3
- pixel_convert.py 분석
pixel.py 안의 함수를 pixel_convert.py 안에서 사용하기 때문에
먼저 pixel_convert.py 코드를 하나씩 분석해 보자
pixel_convert.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# coding:utf-8
from flask import Flask, render_template, request, redirect, url_for, abort, logging
import os
import cv2
from PIL import Image
import hashlib
import datetime as dt
from pixel import make_dot
app = Flask(__name__)
config = {'MAX_CONTENT_LENGTH': 1024 * 1024 * 2, 'DEBUG': False}
app.config.update(config)
@app.route('/', methods=['GET'])
def index():
return render_template('pixel.html')
@app.route('/', methods=['POST'])
def post():
img = request.files['image']
if not img:
error='ファイルを選択してね'
return render_template('pixel.html', error=error)
k = int(request.form['k'])
scale = int(request.form['scale'])
blur = int(request.form['blur'])
erode = int(request.form['erode'])
try:
alpha = bool(int(request.form['alpha']))
except:
alpha = False
try:
to_tw = bool(int(request.form['to_tw']))
except:
to_tw = False
img_name = hashlib.md5(str(dt.datetime.now()).encode('utf-8')).hexdigest()
img_path = os.path.join('static/img', img_name + os.path.splitext(img.filename)[-1])
result_path = os.path.join('static/results', img_name + '.png')
img.save(img_path)
with Image.open(img_path) as img_pl:
if max(img_pl.size) > 1024:
img_pl.thumbnail((1024, 1024), Image.ANTIALIAS)
img_pl.save(img_path)
img_res, colors = make_dot(img_path, k=k, scale=scale, blur=blur, erode=erode, alpha=alpha, to_tw=to_tw)
cv2.imwrite(result_path, img_res)
return render_template('pixel.html', org_img=img_path, result=result_path, colors=colors)
@app.errorhandler(413)
def error_file_size(e):
error = 'ファイルサイズが大きすぎます。アップロード可能サイズは2MBまでです。'
return render_template('pixel.html', error=error), 413
@app.errorhandler(404)
def not_found(e):
error = 'らめぇ'
return render_template('pixel.html', error=error), 404
if __name__ == '__main__':
app.run()
|
cs |
flask부분
https://hleecaster.com/flask-introduction/
대충 보면 flask 는 웹 프레임 워크이고
웹에서 python 코드를 돌리기 위해서 사용됬던것 같다
render_template 은 템플릿에 저장된 html을 불러올 때 사용하는 함수라고 한다.
https://scribblinganything.tistory.com/166
try except 까지 html 에서 정보를 가져와서 변수에 할당하는 부분인것 같다
이 부분은 모르는것 투성이인데
일단 hashlib 라이브러리의 md5 함수를 사용하는것 같다.
일단 hash 가 뭐고 왜 저런 작업이 필요할까?
https://siyoon210.tistory.com/85
이건 나중에 교수님한테 물어보자...
쳐도 잘 안나온다...
그러면 md5 안에 들어가는 것들의 의미는 뭘까
일단 datatime.now() 이거는 딱봐도 지금 시간을 의미하는것 같고 이걸 str 로 문자열로 바꾸고
encode('utf-8') 이거는 utf-8 로 인코딩 하라는것 같은데
왜?
아 인터넷을 뒤져봤는데
참고 : 웹에서 전달 된 문자열은 이미 UTF-8로 인코딩되어 있으므로 ASCII가 아닌 UTF-8로 처리하도록 Python을 만들고 싶습니다.
에 뭐 그렇다고 합니다
웹하고 인코딩 방식을 맞춰준 부분인것 같고
이 부분도 모르는 것 투성이인데
변수 이름이 일단 경로를 저장하는것 같다
일단 os.path.join 은 , 로 구분된 두 문자열을 합쳐주는 거라고 한다
https://engineer-mole.tistory.com/188
그렇다면 join() 안에 있는
'static/img' 는 아마 파이썬 웹 서버 안에 있는 경로일꺼고
img_name + os.path.splitext(img.filename)[-1] 이랑 합친다는건데
일단 splitext 안의 img 는 위 코드에서 request.files 로 받아온 파일의 이름인것 같고
splitext 는 확장자를 구해주는 함수라고 한다.
여기선 [1] 을 넣는다고 되어있는데
다른 글들을 찾아보니까 -1 을 넣어도 확장자를 반환해주는 것 같다.
즉 위에서 헤시화 한 img_name 에 확장자를 붙여주는 구문인듯 하다.
이거는 잘 모르겠는데 아마 PIL 라이브러리 에서 지원하는 함수인것 같다.
대충 보면 img 를 img_path 에 저장하라는거겠지?
이 with 함수는 평소 파이썬 코딩할때 진짜 한번도 못보던 거였는데
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wideeyed&logNo=221653260516
프로세스 연결 + 해제를 위해 사용한다고 한다.
그렇다는건 image.open() 을 with 로 해서 열고 닫게 한다는 거겠지
...
왜그렇게하는거지?
위에 request.from 이거는 크롤링이고
파일경로로 name 만들고
리사이징할때만 with 로 연결한다
아 그래야
파일 리사이징 하고 나서 딱 프로세스 닫아주니까~
그런건가?
원본 이미지랑 결과 이미지랑 다르게 저장해서 보여주는 거니까
result_path 로 저장하는 듯 하다
정리!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# coding:utf-8
from flask import Flask, render_template, request, redirect, url_for, abort, logging
import os
import cv2
from PIL import Image
import hashlib
import datetime as dt
from pixel import make_dot
#flask
app = Flask(__name__)
config = {'MAX_CONTENT_LENGTH': 1024 * 1024 * 2, 'DEBUG': False}
app.config.update(config)
@app.route('/', methods=['GET'])
def index():
return render_template('pixel.html')
@app.route('/', methods=['POST'])
def post():
#html 에서 정보 가져오기
img = request.files['image']
if not img:
error='ファイルを選択してね'
return render_template('pixel.html', error=error)
k = int(request.form['k'])
scale = int(request.form['scale'])
blur = int(request.form['blur'])
erode = int(request.form['erode'])
try:
alpha = bool(int(request.form['alpha']))
except:
alpha = False
try:
to_tw = bool(int(request.form['to_tw']))
except:
to_tw = False
#md5 해시값 변환
img_name = hashlib.md5(str(dt.datetime.now()).encode('utf-8')).hexdigest()
#img_path=기존경로 + md5로 변환한 img_name과 img의 확장자
img_path = os.path.join('static/img', img_name + os.path.splitext(img.filename)[-1])
result_path = os.path.join('static/results', img_name + '.png')
#img 를 'img_path' 로 저장
img.save(img_path)
#Image.open() 을 with로 연결 및 해제
with Image.open(img_path) as img_pl:
if max(img_pl.size) > 1024:
img_pl.thumbnail((1024, 1024), Image.ANTIALIAS)
img_pl.save(img_path)
#이미지 변환
img_res, colors = make_dot(img_path, k=k, scale=scale, blur=blur, erode=erode, alpha=alpha, to_tw=to_tw)
#imread 로 연 이미지 파일을 저장
cv2.imwrite(result_path, img_res)
#return
return render_template('pixel.html', org_img=img_path, result=result_path, colors=colors)
@app.errorhandler(413)
def error_file_size(e):
error = 'ファイルサイズが大きすぎます。アップロード可能サイズは2MBまでです。'
return render_template('pixel.html', error=error), 413
@app.errorhandler(404)
def not_found(e):
error = 'らめぇ'
return render_template('pixel.html', error=error), 404
if __name__ == '__main__':
app.run()
|
cs |
그리고 안드로이드 스튜디오 세팅을 하려고 했는데
https://hwanglex.tistory.com/5
음 일단 더 알아보고 세팅을 해야겠다...
'Archive > [App] 도트감성:pixel painter' 카테고리의 다른 글
[1주-5일차] NFT maker APP - 안드로이드 to AWS파이썬api서버 연동 (0) | 2022.04.30 |
---|---|
[1주-4일차] NFT maker APP - 안드로이드 스튜디오 프로젝트 세팅 + AWS파이썬 서버 만들기 (0) | 2022.04.29 |
[1주-2일차] NFT maker APP - 1스프린트-day2 코드 해석 (0) | 2022.04.27 |
[1주-1일차] NFT maker APP - 1주차 스프린트 계획 수립, 1스프린트-day1 (0) | 2022.04.23 |
NFT maker APP - 개발계획 + 제품기능목록 작성 (0) | 2022.04.12 |