【问题标题】:Convert blob to bitmap image in Appcelerator titanium在 Appcelerator Titan 中将 blob 转换为位图图像
【发布时间】:2018-10-05 12:55:25
【问题描述】:

我有一个图像的 Blob,想将其转换为位图图像,以便在 appcelerator Titanium 中使用 android Canvas、Path 和 Paint。 我浏览了 appcelerator 文档,但找不到任何允许我直接转换的方法。 我尝试将 blob 转换为 Base64 字符串,然后通过 hyperloop 使用 android 本机方法创建位图对象,但未成功。

然后我尝试将 base64 转换为字节数组并使用此代码通过 Hyperloop 创建位图,但位图为空:

             var BitmapFactory = require('android.graphics.BitmapFactory');
             var ByteArrayInputStream = require("java.io.ByteArrayInputStream");

            var stringToSaveInDatabase = Ti.Utils.base64encode(newBlob).toString();
            var bytes = [];
            for (var k = 0; k < stringToSaveInDatabase.length; k++) {
                bytes.push(stringToSaveInDatabase.charCodeAt(k));
            }
            var arrayInputStream = new ByteArrayInputStream(bytes);
            var bitmap = BitmapFactory.decodeStream(arrayInputStream); 

【问题讨论】:

  • 抱歉,我的示例无法正常工作,因为我使用了自定义 SDK。像这样转换为 ByteArray 可以正常工作:var istream = new ByteArrayInputStream(new String(blob.toBase64().toString()).getBytes(StandardCharsets.UTF_8)); console.log("istream: " + istream); console.log("bmp: " + BitmapFactory.decodeStream(istream)); 但 decodeStream 最后返回 null。在您的示例中也可能是这种情况。您可以先保存图像,然后使用它来加载该资源:jira.appcelerator.org/browse/…
  • 是的,尽管内存中存在 blob 对象,但我得到了 null。我发现这个类 docs.appcelerator.com/module-apidoc/latest/android/… 它有方法:fromBlob(Activity activity, TiBlob blob) 和 getBitmap() 可以让我从blob 到位图,但我不知道如何访问这个类。我试过 require("org.appcelerator.titanium.view.TiDrawableReference") 但我收到错误 Requested module not found。你知道如何访问这个类并使用它的方法吗?
  • jira.appcelerator.org/browse/… 不支持访问核心 ti 类

标签: android titanium appcelerator titanium-mobile appcelerator-titanium


【解决方案1】:

更新示例:

var Activity = require('android.app.Activity')
var ImageView = require('android.widget.ImageView');
var Base64 = require('android.util.Base64');
var BitmapFactory = require('android.graphics.BitmapFactory');
var activity = new Activity(Ti.Android.currentActivity);
var RenderScript = require("android.renderscript.RenderScript");
var Allocation = require("android.renderscript.Allocation");
var Element = require("android.renderscript.Element");
var ScriptIntrinsicBlur = require("android.renderscript.ScriptIntrinsicBlur");

$.img.addEventListener("load", function() {
    $.img.toImage(function(blob) {
        var encodeByte = Base64.decode(blob.toBase64(), Base64.NO_WRAP)
        var bmp = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);

        const bmpOut = bmp.copy(bmp.getConfig(), true);
        const rs = RenderScript.create(activity);
        const blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        const allIn = Allocation.createFromBitmap(rs, bmp);
        const allOut = Allocation.createFromBitmap(rs, bmpOut);

        blurScript.setRadius(2.0);
        blurScript.setInput(allIn);
        blurScript.forEach(allOut);
        allOut.copyTo(bmpOut);
        bmp.recycle();
        rs.destroy();

        var image = new ImageView(activity);
        $.index.add(image);
        image.setImageBitmap(bmpOut);
    })
})

$.index.open();

index.xml:

<Alloy>
    <Window class="container">
        <ImageView id="img" image="/images/DefaultIcon.png" />
    </Window>
</Alloy>

bmp 将是ImageView 之外的位图,它将应用模糊并将其再次添加到窗口中。

【讨论】:

  • 感谢您的回复,但我收到以下错误“消息:未捕获的类型错误:blob.getImage 不是函数”
  • 我现在用工作代码更新了这个例子!它将克隆 ImageView 图像并添加它的模糊版本
猜你喜欢
  • 2021-10-10
  • 2013-05-11
  • 2013-03-28
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多