如何将html5画布保存到服务器

2024-03-30

我将一些图像加载到我的画布上,然后在加载后我想单击一个按钮将该画布图像保存到我的服务器上。我可以看到脚本工作正常,直到它到达“toDataURL”部分并且我的函数停止执行。我究竟做错了什么?这是我的代码:

<!DOCTYPE HTML>
<html>
  <head>
  <style>
    body {
    margin: 0px;
    padding: 0px;
   }
  </style>
</head>
<body>
<canvas id="myCanvas" width="578" 

height="200"></canvas>

<div>
<button onClick="saveCards();">Save</button>
</div>

<script>
  function loadImages(sources, callback) 

{
    var images = {};
    var loadedImages = 0;
    var numImages = 0;
    // get num of sources
    for(var src in sources) {
      numImages++;
    }
    for(var src in sources) {
      images[src] = new Image();
      images[src].onload = function() {
        if(++loadedImages >= numImages) 

{
          callback(images);

        }
      };
      images[src].src = sources[src];

    }

  }

  var canvas = 

document.getElementById('myCanvas');
  var context = canvas.getContext('2d');

  var sources = {
    great: 

'images/great.jpg',
    star: 

'images/1Star.jpg',  good: 

'images/good.jpg'
  };

  loadImages(sources, function(images) {
    context.drawImage(images.great, 

0, 0, 80, 120);
    context.drawImage(images.star, 80, 

0, 80, 120);
context.drawImage(images.good, 160, 0, 80, 

120);
  });

</script>

<script type="text/javascript">
function saveCards()
{
var canvas= 
document.getElementById("myCanvas");
alert("stops");
var theString= canvas.toDataURL();

var postData= "CanvasData="+theString;
var ajax= new XMLHttpRequest();
ajax.open("POST", 'saveCards.php', true);
ajax.setRequestHeader('Content-Type', 

'canvas/upload');

ajax.onreadystatechange=function()
{

if(ajax.readyState == 4)
{
alert("image was saved");
}else{
alert("image was not saved");
}
}

ajax.send(postData);
}
</script>

</body>
</html>

感谢您的帮助,是因为在调用 toDataUrl 之前未加载图像吗?如果是这样,你能帮我解决它吗?

这是 PHP 脚本:

 <?php
if(isset($GLOBALS['HTTP_RAW_POST_DATA']));
{

$rawImage=$GLOBALS['HTTP_RAW_POST_DATA'];
$removeHeaders= 

substr($rawImage,strpos($rawImage, ",")+1);
$decode=base64_decode($removeHeaders);
$fopen= fopen('images/image.png', 'wb');
fwrite($fopen, $decode);
fclose($fopen);
}
?>

不过我遇到了安全错误。


In canvas 元素的规范 http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html它指出:

如果来自一个来源的脚本可以访问,则可能会发生信息泄漏 来自另一个来源(一个来源)的图像的信息(例如读取像素) 那是不一样的)。

为了缓解这种情况,与画布元素一起使用的位图被定义为 有一个标志表明它们是否是原始干净的。所有位图 首先将它们的 origin-clean 设置为 true。该标志设置为 false 当使用跨源图像或字体时。

toDataURL()、toDataURLHD()、toBlob()、getImageData() 和 getImageDataHD() 方法检查标志并会抛出 SecurityError 异常而不是泄漏跨源数据。

该标志在某些情况下可以重置;例如,当 CanvasRenderingContext2D 绑定到一个新的画布,位图是 清除并重置其标志。

由于您要将图像从不同的服务器加载到画布元素中,因此能够使用 toDataURL() 的解决方法是将画布“复制”到新的画布元素中,以将 origin-clean 标志重置为“true”。

你可以看一个例子here http://bolsterweb.com/2012/06/grabbing-image-data-external-source-canvas-element/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将html5画布保存到服务器 的相关文章

随机推荐

  • 如何为已渲染的多个3D模型拥有多个模型矩阵?

    我已经遵循了 vulkan 教程的大部分内容 https vulkan tutorial com https vulkan tutorial com 我目前有一个 vulkan 程序 可以使用 OBJ 文件加载多个 3D 模型 但是我只有一
  • 如何从源代码构建 VSCode 应用程序包

    我正在尝试在 Mac 上从源代码构建 VSCode 并制作应用程序包 我尝试以下这些说明 https github com Microsoft vscode wiki How to Contribute packaging这表明你可以运行g
  • 向量迭代器

    我有以下代码 vector
  • 如何告诉 python HTMLParser 停止

    我有一个用例告诉我们当标签是link它的属性是rel dns prefetch然后就说预解析dns已启用 我做了一个标志pre resolve dns enabled并将其设置为 true 如下所示 class Extractor HTML
  • Laravel:获取调用控制器方法的视图的名称

    在 Laravel 中 是否可以获取调用您当前所在的控制器方法的视图的名称 我的网站中有两个版本的表单 一种是在网站 外部 使用 即用户未登录 另一种是在网站 内部 使用 这些表单在表示上略有不同 但它们包含所有相同的字段并调用相同的存储方
  • 在 Spring MongoDB 中的 ReplaceRoot 管道阶段中使用 $mergeObjects

    我希望将这个片段复制到 Java 代码中 db getCollection admins comptes client ceov4 aggregate lookup from contrats ceov4 localField CUSTOM
  • 实现 retryWhen 逻辑

    我有一个需要会话 cookie 来处理网络调用的应用程序 我在用着Retrofit RxJava 但是 会话可能会过期 带有 401 未经授权状态的改造错误 在这种情况下我想重新进行身份验证 以获取新的 cookie 并重试之前的调用 我该
  • Python:编写csv文件

    我试图在 Windows 计算机上使用 Python 3 2 编写一个简单的 CSV 文件 但是我没有运气 来自Python 3 2 的 csv 模块文档 http docs python org release 3 2 library c
  • 在 C 中解析日期 Http 标头的简单方法是什么?

    我想解析电子邮件 http 日期标头 有没有一种简单的方法可以做到这一点 而无需编写自己的字符串解析函数 Example Date Fri 19 Mar 2010 11 44 02 0700 为了澄清 解析出Date 这部分很简单 我正在谈
  • Zend 框架引导问题

    我已经在新安装 Zend Framework 应用程序一段时间了 但我不知道发生了什么 我有两个想要使用的自定义操作助手 并且我想在引导程序中初始化它们 但似乎我的 init 函数根本没有被调用 在启动应用程序的 index php 中 我
  • 如何更改 IPV6 地址的字节顺序(从网络到主机,反之亦然)?

    我知道ntoh s l and hton s l 适用于 2 和 4 字节的整数 现在 我面临着转换 16 个字节长的 IPv6 地址的问题 是否有用于此目的的现成函数 TIA Jir 我不确定ntoh and hton与 IPv6 相关
  • 为什么我不能在 Konva.Shape.fillPatternImage(imageObj) 中使用 Konva.Image()?

    以下是来自的示例Konvajs http konvajs github io docs shapes Image html加载图像的库 var imageObj new Image imageObj onload function var
  • Mongoose 模式要求数组可以为空

    我有这个架构 var StuffSchema new mongoose Schema id type String required true unique true name type String required true mongo
  • 构建 Java EE 6 项目时出现 FilerException

    我在 Netbeans 7 中有一个 Java EE 6 项目 当我在 IDE 中编译并启动它时 该项目运行良好 但是 当我清理和构建项目时 我得到了 java lang RuntimeException javax annotation
  • 如何提高@patch和MagicMock语句的可读性和可维护性(避免长名称和字符串标识)?

    在我的测试代码中 我有很多样板表达式 Magic return 我还有很长的字符串来标识要模拟的函数的路径 重构期间不会自动替换字符串 我更愿意直接使用导入的函数 示例代码 from mock import patch MagicMock
  • 如何在远程存储库上运行 hg recovery 命令

    在 teamcity 中运行构建时出现以下错误 Failed to collect changes error C Program Files TortoiseHg hg exe config ui interactive False pu
  • 在 cakephp 中分配布局

    我们可以在该特定控制器中为整个控制器定义一个布局吗 我之前已经在应用程序控制器的过滤器之前用于此目的 但它不再解决它 所以我需要在控制器中应该有一些适用于的布局定义该控制器的所有操作 Regards use it 在你的行动中 this g
  • JavaScript - 对象字面量的优点

    我读过 我应该使用对象文字 而不是简单地编写一堆函数 对象字面量有什么优点 有例子吗 正如 Russ Cam 所说 您可以避免污染全局命名空间 这在当今组合来自多个位置 TinyMCE 等 的脚本时非常重要 正如 Alex Sexton 所
  • 如何使用 WebApplicationFactory 覆盖 Autofac 容器中的服务

    我正在使用 WebApplicationFactory 编写一些集成测试 我使用 Autofac 作为我的依赖解析器 在我的测试中 我试图覆盖其中一项注册 以便我可以模拟其中一项依赖项 使用aspnetcore默认的ConfigureSer
  • 如何将html5画布保存到服务器

    我将一些图像加载到我的画布上 然后在加载后我想单击一个按钮将该画布图像保存到我的服务器上 我可以看到脚本工作正常 直到它到达 toDataURL 部分并且我的函数停止执行 我究竟做错了什么 这是我的代码