通过Parse Cloud Code功能下载图像

时间:2015-08-12 12:27:02

标签: 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);
  });

});

我有两个问题:

  • 这种方法是否正确,还是应该更好地存储图像的中等版本(如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.
    
        }
    });
    

1 个答案:

答案 0 :(得分:0)

上面的答案是正确的,并解决了我的问题,但我会更谨慎地提出依赖“运行时宽度”图像的建议。对于某些(大多数?)用途,使用服务器上托管的预缩放图像肯定会更好。

这里有两个问题:

  1. API请求:
  2. Parse会根据您在一秒钟内执行的API网络请求向您收取费用。这不是问题:无论是从ParseImageView调用callFunctionInBackground()还是loadInBackground(),都是一样的 - 每次调用一个API请求。但

    1. 缓存:
    2. 如果你有一个服务器保存的ParseFile,你可以在一秒钟内缓存它。如果你有一个刚刚为你创建的下载的Bitmap,你无法缓存它 - 无论如何都不能使用Parse SDK。您可以尝试将此ParseFile放入ParseObject并固定它,但它不起作用 - 固定需要ParseFiles存在于服务器中。您可以尝试将图像byte[]放在ParseObject字段中,但这会因大图像而失败而我无法使其正常工作。

      如果你没有缓存,很快就会出现问题 - 设置RecyclerView很麻烦,每次绑定一个视图持有者时,你都会花费一个新的API请求。

      所以 - 我不鼓励在适配器视图和回收器视图中使用这种自定义宽度图像方法。如果你走这条路,请确保你身边有一个图像缓存库。