javascript - 使用python将base64字符串转换为png图像
问题描述
我正在开发一个 Django 应用程序,用户可以在其中使用 javascript 触发网络摄像头并拍照。此图片存储在画布中。我想用 python 检索这个图像作为 base64 字符串,将其转换为 png 文件并将其保存到 Django 服务器中。到目前为止,这是我的代码
HTML 模板
<center>
<button type="button" name="button" class='btn btn-outline-dark btn-lg' id='start'>Start Video Capture</button>
<div class="container-fluid mt-2">
<video id="video" width="640" height="480" autoplay></video><br>
<button type="button" data-toggle="modal" data-target="#image_model" class="btn btn-lg btn-dark" id="snap">Snap Photo</button>
</div>
</center>
<center>
<canvas id="canvas" width="640" height="480"></canvas>
</center>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Retake</button>
<form class="image_to_server" action="{% url 'img_submit' %}" method="post">
{% csrf_token %}
<input type="text" name="base64Field" value="" id='base64'>
<input type="submit" value="Use Image" class="btn btn-primary" id="use_image">
</form>
Javascript代码
// Grab elements, create settings, etc.
var video = document.getElementById('video');
// Elements for taking the snapshot
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
$('#start').click(function() {
// Get access to the camera!
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({
video: true
}).then(function(stream) {
//video.src = window.URL.createObjectURL(stream);
video.srcObject = stream;
video.play();
});
}
$('#snap').fadeIn();
// Trigger photo take
$('#snap').click(function() {
context.drawImage(video, 0, 0, 640, 480);
var dataURL = canvas.toDataURL();
$('#base64').val(dataURL)
$("#use_image").click(function() {
console.log('clicked');
});
});
});
Django 视图.py
def img_submit(request):
if request.method == 'POST':
data = request.POST.get('base64Field')
byte_data = base64.b64decode(data)
image_data = BytesIO(byte_data)
img = Image.open(image_data)
return HttpResponse(data)
我收到 python 代码的“不正确的填充错误”。我不确定我做错了什么。或者如何纠正这个错误。
我按照这个链接编写了python代码。
解决方案
您没有从字符串中删除标题,这意味着它不仅仅是 b64 数据
,如果您查看示例,您将看到这些行
import re
base64_data = re.sub('^data:image/.+;base64,', '', data)
删除标题后,您应该可以将字符串用作 b64
我所说的标题看起来像这样data:image/png;base64,