【问题标题】:How to save an image from canvas如何从画布中保存图像
【发布时间】:2013-08-28 06:05:33
【问题描述】:

最近我一直在尝试依靠 Webrtc 创建一个照相亭,并且几乎完成了所有代码,除了我无法找到在捕获图像后保存图像的方法。

这是我迄今为止最接近实现目标的一次:

 <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <title>fotogoof</title>
    <link rel="Stylesheet" href="css/bootstrap.css"/>
    <link rel="Stylesheet" href="css/style.css"/>
    <script type="text/javascript">
            window.onload = function () {
                var img = document.getElementById('screenshot');
                var button = document.getElementById('saveImage');
                img.src = '';
                img.onload = function () {
                    button.removeAttribute('disabled');
                };
                button.onclick = function () {
                    window.location.href = img.src.replace('image/png', 'image/octet-stream');
                };
            };
    </script>
    </head>
    <div class="navbar navbar-inverse navbar-fixed-top">
    <div class="navbar-inner">
      <div class="container">
        <h2 class="brand">Html5 Photobooth</h1>
      </div>
    </div>
    </div>
    <div class="container" id="body-wrap">
    <div class="container" id="main">
      <div class="span10">
        <div id="video-container">
        <canvas width="400" height="320" class="mask"></canvas>
          <div id="counter">
          </div>
        </div>  
        <br><div id="pic-holder" class="pull-left"><img id="screenshot"></div></br>
        <input id="saveImage" type="button" value="save image" disabled="disabled"/>
      </div>
    </div>
   </div>   
    </div>

代码本质上是获取网络摄像头流并将其输入到画布元素中。按下空格键会触发截屏,然后显示为图像。因为我无法提供正在下载的文件的确切来源,所以该按钮只能在浏览器的另一个选项卡中打开图像,而不是正常运行。我真的很感激一些关于如何解决这个问题的意见。提前致谢。

我已经设法用这段代码从画布中捕获流:

document.addEventListener ('keydown', function (event) {
        if(event.keyCode == 32) {
         document.querySelector('#screenshot').src = canvas.toDataURL('image/webp')
        }
})

我想知道的是如何让用户将图像从那里保存到他们的计算机上。

【问题讨论】:

标签: javascript html canvas webrtc


【解决方案1】:

如果我理解正确,您希望将图像下载(即为用户选择位置提供保存对话框)到用户的机器上?'

如果是这样你可以使用这个 sn-p:

function download(canvas, filename) {

    /// create an "off-screen" anchor tag
    var lnk = document.createElement('a'),
        e;

    /// the key here is to set the download attribute of the a tag
    lnk.download = filename;

    /// convert canvas content to data-uri for link. When download
    /// attribute is set the content pointed to by link will be
    /// pushed as "download" in HTML5 capable browsers
    lnk.href = c.toDataURL();

    /// create a "fake" click-event to trigger the download
    if (document.createEvent) {

        e = document.createEvent("MouseEvents");
        e.initMouseEvent("click", true, true, window,
                         0, 0, 0, 0, 0, false, false, false,
                         false, 0, null);

        lnk.dispatchEvent(e);

    } else if (lnk.fireEvent) {

        lnk.fireEvent("onclick");
    }
}

现在你需要做的就是提供一个默认文件名并调用函数:

download(myCanvas, 'untitled.png');

如果您的意思不是直接保存到用户的硬盘,那么出于安全原因,您不能这样做。

话虽如此,始终可以选择使用本地存储,例如 File API 或 Indexed DB - 但由于这些是沙盒,因此用户只能通过浏览器访问“文件”,因此可能无法太方便了。

【讨论】:

  • +1 好答案。鉴于画布是呈现数据和娱乐的绝佳媒介,浏览器制造商似乎真的应该提供一种更直接的画布到本地磁盘保存方法——也许通过要求用户单击确定来满足安全问题一个警告对话框。
  • 谢谢@markE。我同意,“允许此网站保存到 [此] 位置”之类的功能会很棒。
  • 对不起,我有点困惑。是否“下载(myCanvas,'untitled.png');”部分代码紧跟在“功能下载(画布,文件名)”部分之后?
  • @user2724072 function ... 只是定义了该函数,并将使其在定义的同一范围内可用,因此您可以从代码中的任何位置调用 download(..) 只要它可以访问函数的范围被定义为 int。 IE。如果将函数 download() 放在全局范围内,则可以随时随地调用 download()。 JavaScript 在开始执行任何代码之前解析函数定义。或者这样说:只要定义了函数,就在需要时调用它,调用之前还是之后都没有关系。
  • 我正在使用 this similar code 保存 YouTube 视频。它适用于 Chrome,使用自定义文件名保存文件,但在 Firefox 30.0 上,它使用默认文件名“videoplayback”下载视频,而不是自定义文件名。有没有人解决过这样的问题?谢谢。
【解决方案2】:

我认为 IE 不涉及服务器端脚本是不可能的。 Here's a good writeup on how to do it that way.

【讨论】:

    【解决方案3】:

    我遇到了这个问题,这是没有任何外部或额外脚本库的最佳解决方案: 在 Javascript 标记或文件中创建此函数: 我们在这里假设画布是您的画布:

    function download(){
            var download = document.getElementById("download");
            var image = document.getElementById("canvas").toDataURL("image/png")
                        .replace("image/png", "image/octet-stream");
            download.setAttribute("href", image);
    
        }
    

    在 HTML 的正文部分指定按钮:

    <a id="download" download="image.png"><button type="button" onClick="download()">Download</button></a>
    

    这是有效的,下载链接看起来像一个按钮。

    【讨论】:

      【解决方案4】:

      关于第一个任务,您可以使用canvas对象支持的toDataUrl方法将canvas内容导出为图像。

      var canvas = document.getElementById("canvas");
      if (canvas.getContext) {
          var ctx = canvas.getContext("2d");                // Get the context for the canvas.
          var myImage = canvas.toDataURL("image/png");      // Get the data as an image.
      }
      
      var image = document.getElementById("screenshot");  // Get the image object.
      image.src = myImage; 
      

      【讨论】:

        猜你喜欢
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多