복붙노트

[PYTHON] PIL에서 사용하도록 POST에서 base64 디코딩

PYTHON

PIL에서 사용하도록 POST에서 base64 디코딩

Flask에서 base64로 인코딩 된 이미지를 받아들이는 간단한 API를 만들고 있는데, 베개를 사용하여 추가 처리를 위해이를 디코딩합니다.

몇 가지 예를 살펴 보았습니다. (1, 2, 3) 나는이 과정의 요지를 얻었지만 베개가 내가 쓴 끈을 읽을 수없는 곳에서는 오류가 계속 발생합니다.

여기에 내가 지금까지 가지고있는 것이있다.

import cStringIO
from PIL import Image
import base64

data = request.form
image_string = cStringIO.StringIO(base64.b64decode(data['img']))
image = Image.open(image_string)

오류를 제공합니다 :

IOError: cannot identify image file <cStringIO.StringIO object at 0x10f84c7a0>

해결법

  1. ==============================

    1.다음과 같이 시도해야합니다.

    다음과 같이 시도해야합니다.

    from PIL import Image
    from io import BytesIO
    import base64
    
    data['img'] = '''R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==''' 
    
    im = Image.open(BytesIO(base64.b64decode(data)))
    

    data [ 'img'] 문자열에는 html 태그 나 매개 변수 data : image / jpeg; base64가 포함되어서는 안됩니다. 예를 들어 jsfiddle입니다.

    나는 가독성을 위해 Google에서 가져간 예제로 이미지 문자열을 변경했습니다.

  2. ==============================

    2.img 필드에 포함 된 data : image / jpeg; base64의 메타 데이터 프리픽스가 있습니다. 일반적으로이 메타 데이터는 이미지 데이터를 문서 또는 스타일 시트에 포함 할 때 CSS 또는 HTML 데이터 URI에서 사용됩니다. 임베디드 데이터의 MIME 유형 및 인코딩을 렌더링 브라우저에 제공합니다.

    img 필드에 포함 된 data : image / jpeg; base64의 메타 데이터 프리픽스가 있습니다. 일반적으로이 메타 데이터는 이미지 데이터를 문서 또는 스타일 시트에 포함 할 때 CSS 또는 HTML 데이터 URI에서 사용됩니다. 임베디드 데이터의 MIME 유형 및 인코딩을 렌더링 브라우저에 제공합니다.

    base64 디코드 전에 접두어를 없애면 PIL이로드 할 수있는 유효한 이미지 데이터가 생성되지만 (아래 참조), 메타 데이터가 서버에 제출되는 방법에 대해 질문 할 필요가 있습니다.

    import re
    import cStringIO
    from PIL import Image
    
    image_data = re.sub('^data:image/.+;base64,', '', data['img']).decode('base64')
    image = Image.open(cStringIO.StringIO(image_data))
    
  3. ==============================

    3.necromancy를 위해 유감스럽게 생각하는. 그러나 대답의 아무것도 나에게 완전하게 일하지 않았다. 다음은 Python 3.6 및 Flask 0.13에서 작동하는 코드입니다.

    necromancy를 위해 유감스럽게 생각하는. 그러나 대답의 아무것도 나에게 완전하게 일하지 않았다. 다음은 Python 3.6 및 Flask 0.13에서 작동하는 코드입니다.

    섬기는 사람:

    from flask import Flask, jsonify, request
    from io import BytesIO
    from web import app
    import base64
    import re
    import json
    from PIL import Image
    
    @app.route('/process_image', methods=['post'])
    def process_image():
        image_data = re.sub('^data:image/.+;base64,', '', request.form['data'])
        im = Image.open(BytesIO(base64.b64decode(image_data)))
        return json.dumps({'result': 'success'}), 200, {'ContentType': 'application/json'}
    

    클라이언트 JS :

    // file comes from file input
    var reader = new FileReader();
    reader.onloadend = function () {
        var fileName = file.name;
        $.post('/process_image', { data: reader.result, name: fileName });
    };
    reader.readAsDataURL(file);
    
  4. from https://stackoverflow.com/questions/26070547/decoding-base64-from-post-to-use-in-pil by cc-by-sa and MIT license