nat*_*rio 7 javascript java android parse-platform
我正在开发一个处理图片和使用parse.com服务作为后端的应用程序.在某些时候我不得不选择:
100x100用于缩略图,400x400用于更大的视图,1000x1000用于全屏视图;1000x1000版本,并在需要时将其缩小,可能是服务器端.我目前正在研究的解决方案是两者的混合:我持有100x100缩略图,1000x1000全屏视图,并希望将其缩小以满足任何其他需求.我开始研究云代码功能来实现这一目标.我希望将函数传递给当前视图的宽度,以使图像适应客户的需要.
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);
});
});
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
这种方法是正确的,还是应该更好地存储一个中等版本的图像(如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.
}
});
Run Code Online (Sandbox Code Playgroud)方法看起来不错。
由于 Parse API 的返回值是 JSON,因此发送二进制数据(图像)的唯一方法是作为 JSON 整数数组或使用二进制数据的 Hex 或 Base64 编码值。
您可以base64使用Parse Cloud 的 Buffer#toString() 方法返回字符串,如下所示。 base64与编码相比,字符串的大小更小hex,因此是首选。
response.success(data.toString('base64'));
Run Code Online (Sandbox Code Playgroud)
在 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);
}
}
}
);
Run Code Online (Sandbox Code Playgroud)
我已经测试了上面提出的更改,它们工作得很好。
注意:请注意,R.id.image_view仅供参考,您必须根据您的项目id使用ImageView
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |