공부하기싫어

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((10241024), 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 사용법 1 (완전 기초) - 아무튼 워라밸

Flask는 웹 애플리케이션 개발을 위한 파이썬 프레임워크다. Django는 너무 무겁고 기능이 많아서 복잡하기 때문에 필요한 기능만 최대한 라이트하게 개발을 하기 위해서는 Flask처럼 가벼운 프레임

hleecaster.com

대충 보면 flask 는 웹 프레임 워크이고

웹에서 python 코드를 돌리기 위해서 사용됬던것 같다

 

render_template 은 템플릿에 저장된 html을 불러올 때 사용하는 함수라고 한다.

https://scribblinganything.tistory.com/166

 

파이썬 flask에서 render_template 함수 예제로 이해해보기

render_template 란? render_template 함수는 flask에서 제공하는 함수로 templates에 저장된 html을 불러올 때 사용하는 함수 이다. 아래 예제를 통해 이해해보자. render_template 실습 예제 a_page.html >> <!..

scribblinganything.tistory.com

try except 까지 html 에서 정보를 가져와서 변수에 할당하는 부분인것 같다

 

img_name = hashlib.md5(str(dt.datetime.now()).encode('utf-8')).hexdigest()

이 부분은 모르는것 투성이인데

 

일단 hashlib 라이브러리의 md5 함수를 사용하는것 같다.

 

일단 hash 가 뭐고 왜 저런 작업이 필요할까?

https://siyoon210.tistory.com/85

 

해시(Hash)란 무엇인가?

해시 (Hash) 해시란 데이터를 다루는 기법 중에 하나로 검색과 저장이 아주 빠르게 진행됩니다! 아주 빠르게 진행될 수 있는 이유는 데이터를 검색할 때 사용할 key와 실제 데이터의 값이 (value가)

siyoon210.tistory.com

 

이건 나중에 교수님한테 물어보자...

쳐도 잘 안나온다...

 

그러면 md5 안에 들어가는 것들의 의미는 뭘까

일단 datatime.now() 이거는 딱봐도 지금 시간을 의미하는것 같고 이걸 str 로 문자열로 바꾸고

encode('utf-8') 이거는 utf-8 로 인코딩 하라는것 같은데

왜?

 

아 인터넷을 뒤져봤는데

 

참고 : 웹에서 전달 된 문자열은 이미 UTF-8로 인코딩되어 있으므로 ASCII가 아닌 UTF-8로 처리하도록 Python을 만들고 싶습니다.

 

에 뭐 그렇다고 합니다

웹하고 인코딩 방식을 맞춰준 부분인것 같고

 

 

img_path = os.path.join('static/img', img_name + os.path.splitext(img.filename)[-1])

이 부분도 모르는 것 투성이인데

변수 이름이 일단 경로를 저장하는것 같다

 

일단 os.path.join 은 , 로 구분된 두 문자열을 합쳐주는 거라고 한다

https://engineer-mole.tistory.com/188

 

[python] os.path.join사용법

os.path.join이란  경로(패스)명 조작에 관한 처리를 모아둔 모듈로써 구현되어 있는 함수의 하나이다. 인수에 전달된 2개의 문자열을 결합하여, 1개의 경로로 할 수 있다. os.path.jon()을 사용하기 위

engineer-mole.tistory.com

 

그렇다면 join() 안에 있는

'static/img' 는 아마 파이썬 웹 서버 안에 있는 경로일꺼고

img_name + os.path.splitext(img.filename)[-1] 이랑 합친다는건데

 

일단 splitext 안의 img 는 위 코드에서 request.files 로 받아온 파일의 이름인것 같고

 

splitext 는 확장자를 구해주는 함수라고 한다.

https://bskyvision.com/1077

 

[python] 파일의 확장자를 알려주는 함수, os.path.splitext()

파일의 경로에서 확장자(extension)만 알고 싶다면 어떻게 해야 할까요? C:\Users\Sim\Desktop\test\c1.txt 위와 같은 경로에서 .txt만을 분리해내고 싶다면 어떻게 해야 할까요? 바로 파이썬 표준 라이브러리

bskyvision.com

여기선 [1] 을 넣는다고 되어있는데

 

다른 글들을 찾아보니까 -1 을 넣어도 확장자를 반환해주는 것 같다.

즉 위에서 헤시화 한 img_name 에 확장자를 붙여주는 구문인듯 하다.

 

img.save(img_path)

이거는 잘 모르겠는데 아마 PIL 라이브러리 에서 지원하는 함수인것 같다.

대충 보면 img 를 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)

이 with 함수는 평소 파이썬 코딩할때 진짜 한번도 못보던 거였는데

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wideeyed&logNo=221653260516 

 

[Python] with문 이해하기

Python의 with문에 대해서 알아보겠습니다. 자원을 획득하고 사용 후 반납해야 하는 경우 주로 사용합니다...

blog.naver.com

프로세스 연결 + 해제를 위해 사용한다고 한다.

 

그렇다는건 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((10241024), 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

 

Python Server - Android Studio(Java) Client (TCP Socket)

이 글에서는 파이썬 서버와 자바 클라이언트 간의 이미지, 텍스트 소켓 통신을 다루어보려고 한다. 1) 자바에서 파이썬으로 이미지 전송 2) 자바에서 파이썬으로 텍스트 전송 3) 파이썬에서 자바

hwanglex.tistory.com

음 일단 더 알아보고 세팅을 해야겠다...