javascript - 通过解析云码功能下载图片

标签 javascript java android parse-platform

我正在开发一个处理图片并使用 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/

相关文章:

java - 将 RegEx 转换为我的 Java 函数

android - 从图库中检索未缓存的 Picasa 图像。 3.0 和 4.0

android - 在 Android 中,NetworkInterface.getInterfaceAddresses() 需要 API 级别 9。如何使用 API 级别 8 执行此操作?

javascript - Google SpreadSheet 脚本 - 检查文件数量

javascript - Google 组合图 - 具有多个条形和线条的间隔

javascript - 我的 javascript 函数仅在我硬刷新页面后才起作用

javascript - 如何构建一个只接受 16 个或更少字段的正则表达式

java - 如何避免很多 if else 条件

java - JFrame 与 JscrollPane

android - 如何使用python捕获android屏幕