【问题标题】:EaselJs - cross-domain images workaround?EaselJs - 跨域图像解决方法?
【发布时间】:2017-01-04 16:18:08
【问题描述】:

当我尝试使用时:

temp = new createjs.Bitmap(obj.path)

我得到错误:

Uncaught An error has occurred. This is most likely due to security restrictions on reading canvas pixel data with local or cross-domain images.

这和this question有些关系。除了上述情况,用户没有使用网络服务器。

就我而言,我使用的是网络服务器,但我需要使用 https 将图像托管在 AWS S3 存储桶上。

是否有我可以使用 EaselJs 允许 CORS 的设置?

S3 存储桶上的 CORS 设置:

<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

编辑:related question

【问题讨论】:

    标签: easeljs


    【解决方案1】:

    位图不处理 CORS,因为您必须在设置 src 之前直接在图像上定义一个跨域属性

    最好的方法是自己创建图像,然后在将其传递给位图之前应用跨域。

    var image = document.createElement("img");
    image.crossOrigin = "Anonymous"; // Should work fine
    image.src = obj.path;
    temp = new Bitmap(image);
    

    目前EaselJS上没有API可以通过crossOrigin,所以这是唯一的方法。

    如果您使用 PreloadJS 预加载 EaselJS 内容,则可以在队列或任何加载项上传递 crossOrigin 属性。

    var queue = new createjs.LoadQueue(false, null, true); //3rd param
    queue.loadFile("path/to/bmp.png"); // Will use the queue CORS
    queue.loadFile({src:"path/to/bmp.png", crossOrigin:true, id:"image"}); // For one file only (you can leave out the param on LoadQueue)
    // later
    var bmp = new createjs.Bitmap(queue.getResult("image");
    

    请注意,即使图像显示也会出现 CORS 错误的原因是 EaselJS 使用像素填充来确定命中测试。您还可以通过在图像上放置 hitAreas 来解决此问题,在进行命中测试时使用它来代替图像像素:

    var temp = new Bitmap(obj.path);
    temp.image.onload = function() {
        var s = temp.hitArea = new createjs.Shape();
        s.graphics.fill("red").drawRect(0,0,temp.image.width,temp.image.height);
    }
    

    干杯,

    【讨论】:

    • 谢谢,我明天要试试这个,我会标记正确或回复反馈。干杯!
    【解决方案2】:

    是的,在您的 AWS S3 存储桶上的权限下启用 CORS。

    【讨论】:

    • 图像渲染良好,但我仍然收到错误消息。我不明白为什么需要不同的权限才能查看图像,而不管easeljs 正在做什么来获取用于碰撞检测的像素信息。
    • 您的浏览器控制台说什么?还要研究网络面板以获取线索。当您在 JS 中使用远程资源或类似的东西做某事时,它可能被视为不如简单的 img 标签安全。
    • 它可以渲染,但每次我点击拖动时,我都会在我的问题中发布错误。我正在从这个问题中删除 JS 标记,因为它可能需要深入了解 EaselJs 的工作原理。
    • 或者也许它通常可以正常工作,因为加载为 img 但要获取像素信息,它可能像 JS 一样加载?在这种情况下,我可能需要按照您的建议仔细检查我的 AWS S3 设置。我会对此进行更多调查,稍后再通知您。
    • 将我在 s3 存储桶上的 CORS 规则添加到问题中。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2017-08-30
    • 2012-10-27
    • 2013-11-24
    • 1970-01-01
    • 2012-02-17
    • 2011-03-06
    • 2011-11-26
    相关资源
    最近更新 更多