通过Parse Cloud Code功能下载图像

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)

Wan*_*ker 1

方法看起来不错。

由于 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