微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 如何将HTML5 Canvas保存为服务器上的图像?

正在进行一个生成艺术项目,我希望允许用户从算法中保存生成的图像.一般的想法是:

>使用生成算法在HTML5 Canvas上创建图像
>图像完成后,允许用户将画布作为图像文件保存到服务器
>允许用户下载图像或将其添加到使用算法生成图片库中.

但是,我坚持第二步.在得到Google的一些帮助后,我发现了这个blog post,这似乎正是我想要的:

这导致了JavaScript代码

function saveImage() {
  var canvasData = canvas.toDataURL("image/png");
  var ajax = new XMLHttpRequest();

  ajax.open("POST", "testSave.PHP", false);
  ajax.onreadystatechange = function() {
    console.log(ajax.responseText);
  }
  ajax.setRequestHeader("Content-Type", "application/upload");
  ajax.send("imgData=" + canvasData);
}

和相应的PHP(testSave.PHP):

<?PHP
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
  $imageData = $GLOBALS['HTTP_RAW_POST_DATA'];
  $filteredData = substr($imageData, strpos($imageData, ",") + 1);
  $unencodedData = base64_decode($filteredData);
  $fp = fopen('/path/to/file.png', 'wb');

  fwrite($fp, $unencodedData);
  fclose($fp);
}
?>

但这似乎根本没有做任何事情.

更多谷歌搜索引用了这个基于上一个教程的blog post.差别不大,但也许值得一试:

$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);

file_put_contents($file, base64_decode($uri));
echo $file;

这个创建一个文件(yay),但它已损坏,似乎不包含任何内容.它似乎也是空的(文件大小为0).

我做错了有什么明显的事吗?我存储文件的路径是可写的,所以这不是问题,但似乎没有发生任何事情,我不确定如何调试它.

编辑

在Salvidor dali链接之后,我将AJAX请求更改为:

function saveImage() {
  var canvasData = canvas.toDataURL("image/png");
  var xmlHttpReq = false;

  if (window.XMLHttpRequest) {
    ajax = new XMLHttpRequest();
  }
  else if (window.ActiveXObject) {
    ajax = new ActiveXObject("Microsoft.XMLHTTP");
  }

  ajax.open("POST", "testSave.PHP", false);
  ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  ajax.onreadystatechange = function() {
    console.log(ajax.responseText);
  }
  ajax.send("imgData=" + canvasData);
}

现在图像文件已创建且不为空!似乎内容类型很重要,并且将其更改为x-www-form-urlencoded允许发送图像数据.

控制台返回(相当大)base64代码字符串,数据文件大约为140 kB.但是,我仍然无法打开它,似乎没有格式化为图像.

解决方法:

以下是如何实现您所需要的示例:

1)画出一些东西(取自canvas tutorial)

<canvas id="myCanvas" width="578" height="200"></canvas>
<script>
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    // begin custom shape
    context.beginPath();
    context.moveto(170, 80);
    context.bezierCurveto(130, 100, 130, 150, 230, 150);
    context.bezierCurveto(250, 180, 320, 180, 340, 150);
    context.bezierCurveto(420, 150, 420, 120, 390, 100);
    context.bezierCurveto(430, 40, 370, 30, 340, 50);
    context.bezierCurveto(320, 5, 250, 20, 250, 50);
    context.bezierCurveto(200, 5, 150, 20, 170, 80);

    // complete custom shape
    context.closePath();
    context.linewidth = 5;
    context.fillStyle = '#8ED6FF';
    context.fill();
    context.strokeStyle = 'blue';
    context.stroke();
</script>

2)将画布图像转换为URL格式(base64)

var dataURL = canvas.toDataURL();

3)通过Ajax将其发送到您的服务器

$.ajax({
  type: "POST",
  url: "script.PHP",
  data: { 
     imgBase64: dataURL
  }
}).done(function(o) {
  console.log('saved'); 
  // If you want the file to be visible in the browser 
  // - please modify the callback in javascript. All you
  // need is to return the url to the file, you just saved 
  // and than put the image in your browser.
});

3)将base64保存在服务器上作为图像(这里是how to do this in PHP,每种语言都有相同的想法.PHP中的服务器端可以是found here):

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐