gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:23 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com