我正在开发一个处理图片并使用 parse.com
服务作为后端的应用程序。在某些时候,我不得不在以下两者之间做出选择:
- 存储同一张图片的不同版本,例如
100x100
用于缩略图,400x400
用于更大 View ,1000x1000
用于全屏 View ; - 仅存储
1000x1000
版本,并在需要时缩小它,可能是在服务器端。
我目前正在研究的解决方案是两者的混合:我将 100x100
用于缩略图,将 1000x1000
用于全屏 View ,并希望将其缩小为任何其他需要。我开始研究云代码功能来实现这一目标。我的愿望是将当前 View 的宽度传递给函数,以便使图像适应客户的需要。
var Image = require("parse-image");
Parse.Cloud.define("getPicture", function(request, response) {
var url = request.params.pictureUrl;
var objWidth = request.params.width / 2;
Parse.Cloud.httpRequest({
url: url
}).then(function(resp) {
var i = new Image();
return i.setData(resp.buffer);
}).then(function(i) {
var scale = objWidth / i.width();
if (scale >= 1) {
response.success(i.data());
}
return i.scale({
ratio: scale
});
}).then(function(i) {
return i.data();
}).then(function(data) {
response.success(data);
});
});
我有两个问题:
这种方法是否正确,或者我最好只存储图像的中等尺寸版本(如
400x400
)?这是否会导致对云代码功能的调用过多? (我不知道parse.com
对云函数调用的数量有任何限制,但可能有)i.data()
返回什么样的对象,我如何从中获取Bitmap
?从我正在调用的 Android 应用中:HashMap<String, Object> params = new HashMap<>(); params.put("pictureUrl",getUrl()); params.put("width", getWidth()); ParseCloud.callFunctionInBackground("getPicture", params, new FunctionCallback<Object>() { @Override public void done(Object object, ParseException e) { //here I should use BitmapFactory.decodeByteArray(...) //but object is definitely not a byte[] ! //From debugging it looks like a List<Integer>, //but I don't know how to get a Bitmap from it. } });
最佳答案
方法看起来不错。
由于 Parse API 的返回值是 JSON,因此您可以将二进制数据(图像)发回的唯一方法是作为 JSON 整数数组或使用二进制数据的十六进制或 Base64 编码值。
您可以使用Buffer#toString() method of Parse Cloud 返回base64
字符串如下所示。与 hex
编码相比,base64
字符串的大小更小,因此是首选。
response.success(data.toString('base64'));
在 Android 端,可以使用下面给出的代码将 base 64 字符串解码为 byte[]
以便可以在 Bitmapfactory#decodeByteArray
中使用.
ParseCloud.callFunctionInBackground("getPicture", params,
new FunctionCallback<String>() {
@Override
public void done(String object,
ParseException e) {
byte[] imgBytes = Base64.decode(object, Base64.DEFAULT);
if (imgBytes.length > 0) {
Bitmap bitmap = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
((ImageView) findViewById(R.id.image_view)).setImageBitmap(bitmap);
}
}
}
);
我已经测试了上面提出的更改,它们运行良好。
注意:请注意,R.id.image_view
仅供引用,您必须使用id
ImageView
适用于您的项目
关于javascript - 通过解析云码功能下载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31965221/