所以,我被困在我的IoT项目中,我必须在我的网页上实时显示用我的picam拍摄的照片(托管在000webhost上)。
以下是我的尝试: 在我的raspberrry pi我有一个python代码将图像转换为Base64(使用pubnub发布)和使用Pubnub javascript sdk收集base64字符串并使用它来解码并显示图像。 问题是: Pubnub一次只能发送近35kb的数据
有没有办法可以在后端用我的picam拍照并通过显示当时拍摄的照片来更新我的网页。
(我正在使用pubnub从我的网页发送消息(触发器)到我的覆盆子pi上的python脚本来拍照)
答案 0 :(得分:1)
这不是一个直接的答案。这只是一个很好的提示!
您可以在gzip POST your publish calls时发布更大的图片尺寸。您可以轻松地以多种语言发布gzip压缩数据。这是bash中的一个简单示例。 nodejs下面还有另一个。
#!/bin/bash
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
## PubNub POST GZIP Example
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
echo '{"hello":["world",123,null]}' | gzip -c9 | \
curl \
-H "Content-Encoding: gzip" \
--data-binary @- \
'http://pubsub.pubnub.com/publish/demo/demo/0/my_channel/0'
echo
您也可以使用以下示例在Node.JS中执行此操作。
var http = require("http");
var zlib = require("zlib");
exports.publish = function(msg) {
var req = http.request({
"host" : "pubsub.pubnub.com",
"method" : "POST",
"path" : "/publish/demo/demo/0/my_channel/0",
"headers" : {
"Content-Encoding" : "gzip",
"Content-Type" : "application/json; charset=UTF-8",
},
}, function (res) {
var body = "";
res.on("data", function (chunk) {
body += chunk;
});
res.on("end", function () {
console.log(body)
})
});
req.on("error", function (e) {
console.error("ERROR:", e.message);
});
zlib.gzip(msg, function (error, result) {
console.log("data:", result);
req.write(result);
req.end();
});
};
exports.publish('{"hello":["world",123,null]}');
答案 1 :(得分:1)
通常,您的主要挑战是图片尺寸。你的形象太大了。而且PubNub最多允许~34KB。您可以做的是在发送之前压缩和缩小图像。现代压缩效果非常好。
定义最大尺寸。
然后,通过min(maxwidth/width, maxheight/height)
计算调整大小比率。
正确的尺寸为oldsize*ratio
。
当然还有一种库方法:方法Image.thumbnail
以下是PIL documentation中的(已编辑)示例。
import Image
size = 512, 512 # change this to match (check aspect ratio)
im = Image.open('./path/to/file.png')
im.resize( size, Image.ANTIALIAS )
im.save( './path/to/file.jpg', 'JPEG' )
im.close()
现在,您可以对新的.jpg
文件进行base64编码,以通过PubNub发送。