Javascript 如何将Easeljs图形对象转换为base64?

Javascript 如何将Easeljs图形对象转换为base64?,javascript,base64,easeljs,Javascript,Base64,Easeljs,我注意到图形对象中有一种基于base64字符串绘制的方法,可以向图形对象添加笔划和填充,但是否有其他方法可以实现相反的转换?i、 e.从图形对象创建base64字符串?我想这样做的原因是,图形对象可以以字符串形式存储,然后解码为图形对象。如果有一个easeljs函数可以做到这一点,那将是我首选的方法。如果没有,我想知道是否有办法访问图形信息并将其转换为字符串。有人刚刚投票支持我的问题,所以我想我会回答它 简而言之,答案是否定的,没有这样的功能 但是你可以自己做。CreateJS在其base 64

我注意到图形对象中有一种基于base64字符串绘制的方法,可以向图形对象添加笔划和填充,但是否有其他方法可以实现相反的转换?i、 e.从图形对象创建base64字符串?我想这样做的原因是,图形对象可以以字符串形式存储,然后解码为图形对象。如果有一个easeljs函数可以做到这一点,那将是我首选的方法。如果没有,我想知道是否有办法访问图形信息并将其转换为字符串。

有人刚刚投票支持我的问题,所以我想我会回答它

简而言之,答案是否定的,没有这样的功能

但是你可以自己做。CreateJS在其base 64编码中使用的模式描述如下:

解码器的源代码位于:

下面是一个示例函数。然而,它将只编码直线;它不会对二次曲线或贝塞尔曲线进行编码。另外,如果我没记错的话,它不会为较小的x和y值优化字符串大小。如果有人有一个更完整的解决方案并愿意分享,我很乐意看到它,因为如果我有时间的话,我实际上计划在未来一两个月内重新开始这个项目

kettu.BASE_64_LIST = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i', 'j', 'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'];

kettu.toBase64 = function(myShape) {
    var result = '';
    var prevX = 0;
    var prevY = 0;
    for(var i = 2; i < myShape.graphics._instructions.length - 1; i++) {
        var header;
        var x = 0x00000;
        var y = 0x00000;
        if(myShape.graphics._instructions[i].f == kettu.context.lineTo || myShape.graphics._instructions[i].f == kettu.context.moveTo) {
            if(myShape.graphics._instructions[i].f == kettu.context.lineTo) {
                header = 'M';
                xStart = myShape.graphics._instructions[i].params[0] * 10 - prevX;
                yStart = myShape.graphics._instructions[i].params[1] * 10 - prevY;
                x = Math.abs(xStart);
                y = Math.abs(yStart);
                prevX += xStart;
                prevY += yStart;
                x1 = (x & 0xff000);
                if (xStart < 0) x1 |= 0x20;
                x2 = (x & 0x00fc0) >> 6;
                x3 = (x & 0x0003f);
                y1 = (y & 0xff000) >> 12;
                if (yStart < 0) y1 |= 0x20;
                y2 = (y & 0x00fc0) >> 6;
                y3 = (y & 0x0003f);
                x = kettu.BASE_64_LIST[x1] + kettu.BASE_64_LIST[x2] + kettu.BASE_64_LIST[x3];
                y = kettu.BASE_64_LIST[y1] + kettu.BASE_64_LIST[y2] + kettu.BASE_64_LIST[y3];
            }
            else if(myShape.graphics._instructions[i].f == kettu.context.moveTo) {
                header = 'E';
                x |= myShape.graphics._instructions[i].params[0] * 10;
                y |= myShape.graphics._instructions[i].params[1] * 10;
                prevX = x;
                prevY = y;
                x1 = (x & 0xff000) >> 12;
                if (x < 0) x1 |= 0x20;
                x2 = (x & 0x00fc0) >> 6;
                x3 = (x & 0x0003f);
                y1 = (y & 0xff000) >> 12;
                if (y < 0) y1 |= 0x20;
                y2 = (y & 0x00fc0) >> 6;
                y3 = (y & 0x0003f);
                x = kettu.BASE_64_LIST[x1] + kettu.BASE_64_LIST[x2] + kettu.BASE_64_LIST[x3];
                y = kettu.BASE_64_LIST[y1] + kettu.BASE_64_LIST[y2] + kettu.BASE_64_LIST[y3];
            }
        }
        result += header + x + y;
    }
    return result;
}
[A',‘B',‘C',‘D',‘E',‘E',‘F',‘F,‘G',‘H',‘H',‘H',‘H',‘H',‘I',‘J',‘J',‘K',‘K',‘K',‘图.基土.基.基.基.基.基.基.基.基.基.基.64.表表表表表表表表表列=[[[[[[[[[[A,[A,'A,'A,'A,'A,'A','A',‘A',,'基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.基.64."T","U","V","W","X","Y","Z","0","1"2","3"4"; kettu.toBase64=函数(myShape){ var结果=“”; var-prevX=0; var-prevY=0; 对于(变量i=2;i>6; x3=(x&0x0003f); y1=(y&0xff000)>>12; 如果(yStart<0)y1 |=0x20; y2=(y&0x00fc0)>>6; y3=(y&0x0003f); x=kettu.BASE_64_列表[x1]+kettu.BASE_64_列表[x2]+kettu.BASE_64_列表[x3]; y=kettu.BASE_64_LIST[y1]+kettu.BASE_64_LIST[y2]+kettu.BASE_64_LIST[y3]; } else if(myShape.graphics.\u指令[i].f==kettu.context.moveTo){ 标题='E'; x |=myShape.graphics._指令[i].params[0]*10; y |=myShape.graphics._指令[i].参数[1]*10; prevX=x; prevY=y; x1=(x&0xff000)>>12; 如果(x<0)x1 |=0x20; x2=(x&0x00fc0)>>6; x3=(x&0x0003f); y1=(y&0xff000)>>12; 如果(y<0)y1 |=0x20; y2=(y&0x00fc0)>>6; y3=(y&0x0003f); x=kettu.BASE_64_列表[x1]+kettu.BASE_64_列表[x2]+kettu.BASE_64_列表[x3]; y=kettu.BASE_64_LIST[y1]+kettu.BASE_64_LIST[y2]+kettu.BASE_64_LIST[y3]; } } 结果+=标题+x+y; } 返回结果; }
我知道有一个
decodePath
,但我不知道有任何“encodePath”,
decodePath
主要用于Flash工具包(但我不确定)-您可以通过
\u activeInstructions
访问指令,其中存储了包含绘图指令数据的
命令
对象。不确定这是否对你有帮助,你可能想看看来源:@olsn嘿,谢谢你的回答!我认为如果你把答案作为一个答案而不是一个评论发布,然后人们投票,你会得到一些声誉分数。我一定会投赞成票。Graphics.decodePath函数源代码中的注释非常有用,并且可以查看_active指令。