【问题标题】:Save html5 canvas element to file (local)将 html5 画布元素保存到文件(本地)
【发布时间】:2011-09-28 15:58:13
【问题描述】:

我正在 Android 上做一个 webapp,我有一个 HTML5 Canvas,用户可以在上面使用触摸事件绘制他想要的东西。我想把它保存在 sdcard 上,所以在本地。并且不能使用任何服务器端脚本(php 等)来做这些事情。

我正在使用magictouch.js 示例:

    <canvas id="example" height=450 width=300></canvas> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
    <script type="text/javascript" src="magictouch.js"></script>

    <script> 

    var CanvasDrawr = function(options) {

    var canvas = document.getElementById(options.id),
    ctxt = canvas.getContext("2d");
    var img     = canvas.toDataURL("image/png");


    ctxt.lineWidth = options.size || Math.ceil(Math.random() * 35);
    ctxt.lineCap = options.lineCap || "round";
    ctxt.pX = undefined;
    ctxt.pY = undefined;

    var lines = [,,];
     var offset = $(canvas).offset();

    var self = {
    //bind click events
    init: function() {

    canvas.addEventListener('touchstart', self.preDraw, false);
    canvas.addEventListener('touchmove', self.draw, false);

    },

    preDraw: function(event) {
            $.each(event.touches, function(i, touch) {
              var id = touch.identifier;
              lines[id] = { x     : this.pageX - offset.left, 
                y     : this.pageY - offset.top, 
                color : options.color || ["black"] 
              };
    });

    event.preventDefault();
  },

  draw: function(event) {
    var e = event, hmm = {};

    $.each(event.touches, function(i, touch) {
      var id = touch.identifier;
      var moveX = this.pageX - offset.left - lines[id].x,
      moveY = this.pageY - offset.top - lines[id].y;

      var ret = self.move(id, moveX, moveY);
      lines[id].x = ret.x;
      lines[id].y = ret.y;
    });

    event.preventDefault();
  },

  move: function(i, changeX, changeY) {
    ctxt.strokeStyle = lines[i].color;
    ctxt.beginPath();
    ctxt.moveTo(lines[i].x, lines[i].y);

    ctxt.lineTo(lines[i].x + changeX, lines[i].y + changeY);
    ctxt.stroke();
    ctxt.closePath();

    return { x: lines[i].x + changeX, y: lines[i].y + changeY };
  }
};

    return self.init();
    };

    $(function(){
var super_awesome_multitouch_drawing_canvas_thingy = new CanvasDrawr({id:"example", size: 2 }); 
console.log('loaded');
      });

    </script> 
    </body>

但是我在 Internet 上遇到的所有示例都与服务器上的 php 脚本一起使用,以将画布解码并保存为图像。实际上只是想在我的 Android 设备上,在我的 SD 卡中,通过使用 HTML5/Javascript...

谢谢。

【问题讨论】:

  • 你有想过这个吗?

标签: javascript android html cordova html5-canvas


【解决方案1】:

你检查过 nihilogic 库吗? http://www.nihilogic.dk/labs/canvas2image/

它使用 toDataUrl() 函数,所以你可能会得到一个丑陋的图片名称,但你仍然会有一张图片。

你也可以使用 downloadify,但它使用 flash,我知道 flash 不经常在 android 上,取决于你的情况https://github.com/dcneiner/Downloadify

另外,我和 kbok 一样,不知道 phoneGap,但您可以尝试同时使用 context.toDataUrl() 和 fwrite。

【讨论】:

  • 我要做的是:(...) var img64 = canvas.toDataURL("image/png").replace(/data:image\/png;base64,/, ''); var img_ok = decode_base64(img); navigator.notification.alert(img_ok); writer.write(img_ok, true); writer.close();但我的 png 文件已损坏。 ://
  • btw canvas2image 看起来很酷,但我不想提示用户保存图像,如果我可以避免它可能会很好
  • 是的,刚刚测试过,这不是我真正想要的。因为我只想写PNG文件,Canvas2Image强制提示。
  • 我不明白为什么你的替换数据:image/png 你想在写之前将替换“image/octet-stream”更改为base64?
【解决方案2】:

这是不可能的,因为您无法从网页访问文件系统(除了一些边缘情况,这在此处没有用处)。

我的建议当然是使用服务器来生成这个文件。由于不可能,您可能会找到一种方法,通过使用插件或 Java 小程序在客户端上执行“本机”代码。

【讨论】:

  • 我的 web 应用实际上是在一个原生应用中,因为我使用 Phonegap 我仍然有一个 apk 文件并可以访问原生 API。所以这不仅仅是一个网络应用程序。我不能将 fopen/fwrite 用于该用途吗? (我试过但没有任何反应)。
  • 好吧,我不知道phonegap,所以我恐怕帮不了你。
【解决方案3】:

为什么不在服务器端将图片转换成图片,然后让用户将图片下载到手机上?

【讨论】:

  • 你好,因为这是客户的签名,而且是我在用户离线的时候要管理的,所以我得先把img存起来。我现在在我的项目中更先进。我可以得到用 base64 编码的画布,我尝试对其进行解码,但现在我的 png 文件似乎已损坏。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2014-03-22
  • 2011-01-29
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多